@@ -2,66 +2,191 @@ package impt
22
33import (
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
39144type 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