Skip to content

Commit 59f7c2b

Browse files
committed
Add middleware log for gin and echo
1 parent 1654fe6 commit 59f7c2b

27 files changed

+1972
-44
lines changed

import/error_checker.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package impt
2+
3+
import (
4+
"context"
5+
"fmt"
6+
)
7+
8+
type ErrorChecker struct {
9+
validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error)
10+
}
11+
12+
func NewErrorChecker(validate func(context.Context, interface{}) ([]ErrorMessage, error)) *ErrorChecker {
13+
return &ErrorChecker{validate: validate}
14+
}
15+
16+
func (v *ErrorChecker) Check(ctx context.Context, model interface{}) error {
17+
errors, err := v.validate(ctx, model)
18+
if err != nil {
19+
return err
20+
}
21+
if errors != nil && len(errors) > 0 {
22+
m := fmt.Sprintf("%s", errors)
23+
return fmt.Errorf(m)
24+
}
25+
return nil
26+
}

import/file_reader.go

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ type FileReader struct {
1919
func NewFileReader(buildFileName func() string) (*FileReader, error) {
2020
return NewDelimiterFileReader(buildFileName, ',')
2121
}
22-
func NewDelimiterFileReader(buildFileName func() string, delimiter rune, opts... *encoding.Decoder) (*FileReader, error) {
22+
func NewDelimiterFileReader(buildFileName func() string, delimiter rune, opts ...*encoding.Decoder) (*FileReader, error) {
2323
var decoder *encoding.Decoder
2424
if len(opts) > 0 && opts[0] != nil {
2525
decoder = opts[0]
@@ -35,33 +35,35 @@ func NewDelimiterFileReader(buildFileName func() string, delimiter rune, opts...
3535
return &fr, nil
3636
}
3737

38-
func (fr *FileReader) Read(next func(lines []string, err error) error) error {
38+
func (fr *FileReader) Read(next func(lines []string, err error, numLine int) error) error {
3939
file, err := os.Open(fr.FileName)
4040
if err != nil {
4141
err = errors.New("cannot open file")
42-
next(make([]string, 0), err)
42+
next(make([]string, 0), err, 0)
4343
return err
4444
}
4545

4646
defer file.Close()
4747

4848
scanner := bufio.NewScanner(file)
49+
i := 1
4950
for scanner.Scan() {
5051
if scanner.Text() != "" {
51-
err := next([]string{scanner.Text()}, nil)
52+
err := next([]string{scanner.Text()}, nil, i)
5253
if err != nil {
5354
return err
5455
}
5556
}
57+
i++
5658
}
57-
next([]string{}, io.EOF)
59+
next([]string{}, io.EOF, i)
5860
return nil
5961
}
6062

61-
func (fr *FileReader) ReadDelimiterFile(next func(lines []string, err error) error) error {
63+
func (fr *FileReader) ReadDelimiterFile(next func(lines []string, err error, numLine int) error) error {
6264
file, err := os.Open(fr.FileName)
6365
if err != nil {
64-
next(make([]string, 0), err)
66+
next(make([]string, 0), err, 0)
6567
}
6668
var r *csv.Reader
6769
if fr.Decoder != nil {
@@ -75,15 +77,17 @@ func (fr *FileReader) ReadDelimiterFile(next func(lines []string, err error) err
7577
}
7678

7779
defer file.Close()
80+
i := 1
7881
for {
7982
record, err := r.Read()
80-
err2 := next(record, err)
83+
err2 := next(record, err, i)
8184
if err2 != nil {
8285
return err2
8386
}
8487
if err == io.EOF {
8588
break
8689
}
90+
i++
8791
}
8892
return err
8993
}

import/importer.go

Lines changed: 148 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,66 +2,191 @@ package impt
22

33
import (
44
"context"
5-
"database/sql"
5+
"fmt"
66
"io"
77
"reflect"
88
)
99

10-
func NewImportRepository(db *sql.DB, modelType reflect.Type,
10+
type ErrorMessage struct {
11+
Field string `yaml:"field" mapstructure:"field" json:"field,omitempty" gorm:"column:field" bson:"field,omitempty" dynamodbav:"field,omitempty" firestore:"field,omitempty"`
12+
Code string `yaml:"code" mapstructure:"code" json:"code,omitempty" gorm:"column:code" bson:"code,omitempty" dynamodbav:"code,omitempty" firestore:"code,omitempty"`
13+
Param string `yaml:"param" mapstructure:"param" json:"param,omitempty" gorm:"column:param" bson:"param,omitempty" dynamodbav:"param,omitempty" firestore:"param,omitempty"`
14+
Message string `yaml:"message" mapstructure:"message" json:"message,omitempty" gorm:"column:message" bson:"message,omitempty" dynamodbav:"message,omitempty" firestore:"message,omitempty"`
15+
}
16+
17+
type ErrorHandler struct {
18+
HandleError func(ctx context.Context, format string, fields map[string]interface{})
19+
FileName string
20+
LineNumber string
21+
Map *map[string]interface{}
22+
}
23+
24+
func NewErrorHandler(logger func(ctx context.Context, format string, fields map[string]interface{}), fileName string, lineNumber string, mp *map[string]interface{}) *ErrorHandler {
25+
if len(fileName) <= 0 {
26+
fileName = "filename"
27+
}
28+
if len(lineNumber) <= 0 {
29+
lineNumber = "lineNumber"
30+
}
31+
return &ErrorHandler{
32+
HandleError: logger,
33+
FileName: fileName,
34+
LineNumber: lineNumber,
35+
Map: mp,
36+
}
37+
}
38+
39+
func (e *ErrorHandler) HandlerError(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string) {
40+
var ext = make(map[string]interface{})
41+
if e.Map != nil {
42+
ext = *e.Map
43+
}
44+
if len(e.FileName) > 0 && len(e.LineNumber) > 0 {
45+
if len(fileName) > 0 {
46+
ext[e.FileName] = fileName
47+
}
48+
if i > 0 {
49+
ext[e.LineNumber] = i
50+
}
51+
e.HandleError(ctx, fmt.Sprintf("Message is invalid: %+v . Error: %+v", rs, err), ext)
52+
} else if len(e.FileName) > 0 {
53+
if len(fileName) > 0 {
54+
ext[e.FileName] = fileName
55+
}
56+
e.HandleError(ctx, fmt.Sprintf("Message is invalid: %+v . Error: %+v line: %d", rs, err, i), ext)
57+
} else if len(e.LineNumber) > 0 {
58+
if i > 0 {
59+
ext[e.LineNumber] = i
60+
}
61+
e.HandleError(ctx, fmt.Sprintf("Message is invalid: %+v . Error: %+v filename:%s", rs, err, fileName), ext)
62+
} else {
63+
e.HandleError(ctx, fmt.Sprintf("Message is invalid: %+v . Error: %+v filename:%s line: %d", rs, err, fileName, i), ext)
64+
}
65+
}
66+
67+
func (e *ErrorHandler) HandlerException(ctx context.Context, rs interface{}, err error, i int, fileName string) {
68+
var ext = make(map[string]interface{})
69+
if e.Map != nil {
70+
ext = *e.Map
71+
}
72+
if len(e.FileName) > 0 && len(e.LineNumber) > 0 {
73+
if len(fileName) > 0 {
74+
ext[e.FileName] = fileName
75+
}
76+
if i > 0 {
77+
ext[e.LineNumber] = i
78+
}
79+
e.HandleError(ctx, fmt.Sprintf("Error to write: %+v . Error: %+v", rs, err), ext)
80+
} else if len(e.FileName) > 0 {
81+
if len(fileName) > 0 {
82+
ext[e.FileName] = fileName
83+
}
84+
e.HandleError(ctx, fmt.Sprintf("Error to write: %+v . Error: %+v line: %d", rs, err, i), ext)
85+
} else if len(e.LineNumber) > 0 {
86+
if i > 0 {
87+
ext[e.LineNumber] = i
88+
}
89+
e.HandleError(ctx, fmt.Sprintf("Error to write: %+v . Error: %+v filename:%s", rs, err, fileName), ext)
90+
} else {
91+
e.HandleError(ctx, fmt.Sprintf("Error to write: %+v . Error: %v filename: %s line: %d", rs, err, fileName, i), ext)
92+
}
93+
}
94+
95+
func NewImportRepository(modelType reflect.Type,
1196
transform func(ctx context.Context, lines []string) (interface{}, error),
1297
write func(ctx context.Context, data interface{}, endLineFlag bool) error,
13-
read func(next func(lines []string, err error) error) error,
98+
read func(next func(lines []string, err error, numLine int) error) error,
99+
handleException func(ctx context.Context, rs interface{}, err error, i int, fileName string),
100+
validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error),
101+
logError func(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string),
102+
opt ...string,
14103
) *Importer {
15-
return NewImporter(db, modelType, transform, write, read)
104+
return NewImporter(modelType, transform, write, read, handleException, validate, logError, opt...)
16105
}
17-
func NewImportAdapter(db *sql.DB, modelType reflect.Type,
106+
func NewImportAdapter(modelType reflect.Type,
18107
transform func(ctx context.Context, lines []string) (interface{}, error),
19108
write func(ctx context.Context, data interface{}, endLineFlag bool) error,
20-
read func(next func(lines []string, err error) error) error,
109+
read func(next func(lines []string, err error, numLine int) error) error,
110+
handleException func(ctx context.Context, rs interface{}, err error, i int, fileName string),
111+
validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error),
112+
logError func(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string),
113+
opt ...string,
21114
) *Importer {
22-
return NewImporter(db, modelType, transform, write, read)
115+
return NewImporter(modelType, transform, write, read, handleException, validate, logError, opt...)
23116
}
24-
func NewImportService(db *sql.DB, modelType reflect.Type,
117+
func NewImportService(modelType reflect.Type,
25118
transform func(ctx context.Context, lines []string) (interface{}, error),
26119
write func(ctx context.Context, data interface{}, endLineFlag bool) error,
27-
read func(next func(lines []string, err error) error) error,
120+
read func(next func(lines []string, err error, numLine int) error) error,
121+
handleException func(ctx context.Context, rs interface{}, err error, i int, fileName string),
122+
validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error),
123+
logError func(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string),
124+
opt ...string,
28125
) *Importer {
29-
return NewImporter(db, modelType, transform, write, read)
126+
return NewImporter(modelType, transform, write, read, handleException, validate, logError, opt...)
30127
}
31-
func NewImporter(db *sql.DB, modelType reflect.Type,
128+
func NewImporter(modelType reflect.Type,
32129
transform func(ctx context.Context, lines []string) (interface{}, error),
33130
write func(ctx context.Context, data interface{}, endLineFlag bool) error,
34-
read func(next func(lines []string, err error) error) error,
131+
read func(next func(lines []string, err error, numLine int) error) error,
132+
handleException func(ctx context.Context, rs interface{}, err error, i int, fileName string),
133+
validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error),
134+
handleError func(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string),
135+
opt ...string,
35136
) *Importer {
36-
return &Importer{DB: db, modelType: modelType, Transform: transform, Write: write, Read: read}
137+
filename := ""
138+
if len(opt) > 0 {
139+
filename = opt[0]
140+
}
141+
return &Importer{modelType: modelType, Transform: transform, Write: write, Read: read, Validate: validate, HandleError: handleError, HandleException: handleException, Filename: filename}
37142
}
38143

39144
type Importer struct {
40-
DB *sql.DB
41-
modelType reflect.Type
42-
Transform func(ctx context.Context, lines []string) (interface{}, error)
43-
Read func(next func(lines []string, err error) error) error
44-
Write func(ctx context.Context, data interface{}, endLineFlag bool) error
145+
modelType reflect.Type
146+
Transform func(ctx context.Context, lines []string) (interface{}, error)
147+
Read func(next func(lines []string, err error, numLine int) error) error
148+
Write func(ctx context.Context, data interface{}, endLineFlag bool) error
149+
Validate func(ctx context.Context, model interface{}) ([]ErrorMessage, error)
150+
HandleError func(ctx context.Context, rs interface{}, err []ErrorMessage, i int, fileName string)
151+
HandleException func(ctx context.Context, rs interface{}, err error, i int, fileName string)
152+
Filename string
45153
}
46154

47-
func (s *Importer) Import(ctx context.Context) (err error) {
48-
err = s.Read(func(lines []string, err error) error {
155+
func (s *Importer) Import(ctx context.Context) (total int, success int, err error) {
156+
err = s.Read(func(lines []string, err error, numLine int) error {
49157
if err == io.EOF {
50158
err = s.Write(ctx, nil, true)
51159
return nil
52160
}
161+
total++
53162
itemStruct, err := s.Transform(ctx, lines)
54163
if err != nil {
55164
return err
56165
}
166+
if s.Validate != nil {
167+
errs, err := s.Validate(ctx, itemStruct)
168+
if err != nil {
169+
return err
170+
}
171+
if len(errs) > 0 {
172+
s.HandleError(ctx, itemStruct, errs, numLine, s.Filename)
173+
return nil
174+
}
175+
}
57176
err = s.Write(ctx, itemStruct, false)
58177
if err != nil {
59-
return err
178+
if s.HandleException != nil {
179+
s.HandleException(ctx, itemStruct, err, numLine, s.Filename)
180+
return nil
181+
} else {
182+
return err
183+
}
60184
}
185+
success++
61186
return nil
62187
})
63188
if err != nil && err != io.EOF {
64-
return err
189+
return total, success, err
65190
}
66-
return nil
191+
return total, success, nil
67192
}

0 commit comments

Comments
 (0)