package syncdata import ( "context" ) type ReportSyncable interface { FetchReport(ctx context.Context, params interface{}) (interface{}, error) ConvertToSum(apiData interface{}, dataType string) interface{} ConvertToDetails(apiData interface{}, dataType string) []interface{} SaveSum(ctx context.Context, data interface{}) (int64, error) SaveDetails(ctx context.Context, data []interface{}) (successCount, failCount int64, err error) } type BaseReportSync struct { httpClient *HttpClient } func NewBaseReportSync() *BaseReportSync { return &BaseReportSync{ httpClient: NewHttpClient("", 0), } } func (b *BaseReportSync) FetchReport(ctx context.Context, params interface{}) (interface{}, error) { return nil, nil } func (b *BaseReportSync) ConvertToSum(apiData interface{}, dataType string) interface{} { return nil } func (b *BaseReportSync) ConvertToDetails(apiData interface{}, dataType string) []interface{} { return nil } func (b *BaseReportSync) SaveSum(ctx context.Context, data interface{}) (int64, error) { return 0, nil } func (b *BaseReportSync) SaveDetails(ctx context.Context, data []interface{}) (int64, int64, error) { return 0, 0, nil } func (b *BaseReportSync) ExecuteSync(ctx context.Context, syncer ReportSyncable, params interface{}, dataType string, useMock bool) (*SyncResult, error) { result := &SyncResult{} apiData, err := syncer.FetchReport(ctx, params) if err != nil { result.Error = err return result, err } sumData := syncer.ConvertToSum(apiData, dataType) if sumData != nil { sumID, err := syncer.SaveSum(ctx, sumData) if err != nil { result.Error = err return result, err } result.SumSuccess = true result.SumID = sumID } detailData := syncer.ConvertToDetails(apiData, dataType) if len(detailData) > 0 { successCount, failCount, err := syncer.SaveDetails(ctx, detailData) if err != nil { result.Error = err return result, err } result.DetailSuccess = true result.DetailCount = len(detailData) result.DetailSuccessCount = successCount result.DetailFailCount = failCount } return result, nil }