package usecase import ( "blockchain/internal/domain/blockchain" "blockchain/internal/domain/repository" "blockchain/internal/domain/usecase" "code.30cm.net/digimon/library-go/errs" "context" "github.com/zeromicro/go-zero/core/logx" ) type BinanceUseCaseParam struct { BinanceRepo repository.DataSourceRepository } type BinanceUseCase struct { BinanceUseCaseParam } func MustBinanceUseCase(param BinanceUseCaseParam) usecase.DataSourceUseCase { return &BinanceUseCase{ BinanceUseCaseParam: param, } } // GetSymbols implements usecase.DataSourceUseCase. func (use *BinanceUseCase) GetSymbols(ctx context.Context) ([]*usecase.Symbol, error) { result, err := use.BinanceRepo.GetSymbols(ctx) if err != nil { e := errs.ThirdPartyErrorL( blockchain.CodeBlockchain, blockchain.FailedToGetSymbolFormBinanceErrorCode, logx.WithContext(ctx), []logx.LogField{ {Key: "func", Value: "BinanceUseCase.ThirdPartyErrorL"}, {Key: "err", Value: err.Error()}, }, "failed to get symbols from binance").Wrap(err) return nil, e } rpy := make([]*usecase.Symbol, 0, len(result)) for _, item := range result { rpy = append(rpy, &usecase.Symbol{ Symbol: item.Symbol, Status: item.Status, BaseAsset: item.BaseAsset, BaseAssetPrecision: item.BaseAssetPrecision, QuoteAsset: item.QuoteAsset, QuoteAssetPrecision: item.QuoteAssetPrecision, }) } return rpy, nil } func (use *BinanceUseCase) UpsertKline(ctx context.Context, data usecase.QueryKline) error { origianData, err := use.BinanceRepo.FetchHistoryKline(ctx, repository.QueryKline{ Symbol: data.Symbol, Interval: data.Interval, StartTime: data.StartTime, EndTime: data.EndTime, }) if err != nil { e := errs.ThirdPartyErrorL( blockchain.CodeBlockchain, blockchain.FailedToUpsertBinanceErrorCode, logx.WithContext(ctx), []logx.LogField{ {Key: "func", Value: "BinanceRepo.FetchHistoryKline"}, {Key: "err", Value: err.Error()}, }, "failed to get kline history from binance").Wrap(err) return e } err = use.BinanceRepo.SaveHistoryKline(ctx, origianData) if err != nil { e := errs.DatabaseErrorWithScopeL( blockchain.CodeBlockchain, blockchain.FailedToUpsertBinanceErrorCode, logx.WithContext(ctx), []logx.LogField{ {Key: "func", Value: "BinanceRepo.SaveHistoryKline"}, {Key: "err", Value: err.Error()}, }, "failed save data from binance").Wrap(err) return e } return nil } func (use *BinanceUseCase) ListKline(ctx context.Context, param usecase.QueryKline) ([]usecase.Candle, error) { kline, err := use.BinanceRepo.GetKline(ctx, repository.QueryKline{ Symbol: param.Symbol, Interval: param.Interval, StartTime: param.StartTime, EndTime: param.EndTime, }) if err != nil { e := errs.DatabaseErrorWithScopeL( blockchain.CodeBlockchain, blockchain.FailedToListBinanceKlineErrorCode, logx.WithContext(ctx), []logx.LogField{ {Key: "func", Value: "BinanceRepo.GetKline"}, {Key: "err", Value: err.Error()}, }, "failed get kline data from db").Wrap(err) return nil, e } candle := make([]usecase.Candle, 0, len(kline)) for _, item := range kline { candle = append(candle, usecase.Candle{ OpenTime: item.OpenTime, Open: item.Open, High: item.High, Low: item.Low, Close: item.Close, Volume: item.Volume, CloseTime: item.CloseTime, QuoteAssetVolume: item.QuoteAssetVolume, NumberOfTrades: item.NumberOfTrades, TakerBuyBaseAssetVolume: item.TakerBuyBaseAssetVolume, TakerBuyQuoteAssetVolume: item.TakerBuyQuoteAssetVolume, Symbol: item.Symbol, Interval: item.Interval, }) } return candle, nil }