80 lines
2.0 KiB
Go
80 lines
2.0 KiB
Go
package sync
|
|
|
|
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
|
|
}
|