github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/mw/coin/fiat/currency/create.go (about) 1 package currency 2 3 import ( 4 "context" 5 "fmt" 6 7 currencycrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin/fiat/currency" 8 currencyhiscrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin/fiat/currency/history" 9 redis2 "github.com/NpoolPlatform/go-service-framework/pkg/redis" 10 basetypes "github.com/NpoolPlatform/message/npool/basetypes/v1" 11 npool "github.com/NpoolPlatform/message/npool/chain/mw/v1/coin/fiat/currency" 12 13 "github.com/NpoolPlatform/chain-middleware/pkg/db" 14 "github.com/NpoolPlatform/chain-middleware/pkg/db/ent" 15 entcurrency "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/coinfiatcurrency" 16 ) 17 18 type createHandler struct { 19 *Handler 20 } 21 22 func (h *createHandler) createCurrency(ctx context.Context, tx *ent.Tx) error { 23 lockKey := fmt.Sprintf( 24 "%v:%v:%v:%v", 25 basetypes.Prefix_PrefixCreateCoinFiatCurrency, 26 *h.CoinTypeID, 27 *h.FiatID, 28 *h.FeedType, 29 ) 30 if err := redis2.TryLock(lockKey, 0); err != nil { 31 return err 32 } 33 defer func() { 34 _ = redis2.Unlock(lockKey) 35 }() 36 37 info, err := tx. 38 CoinFiatCurrency. 39 Query(). 40 Where( 41 entcurrency.CoinTypeID(*h.CoinTypeID), 42 entcurrency.FiatID(*h.FiatID), 43 entcurrency.FeedType(h.FeedType.String()), 44 ). 45 ForUpdate(). 46 Only(ctx) 47 if err != nil { 48 if !ent.IsNotFound(err) { 49 return err 50 } 51 } 52 53 if info != nil { 54 h.ID = &info.ID 55 56 if _, err := currencycrud.UpdateSet( 57 info.Update(), 58 ¤cycrud.Req{ 59 MarketValueHigh: h.MarketValueHigh, 60 MarketValueLow: h.MarketValueLow, 61 }, 62 ).Save(ctx); err != nil { 63 return err 64 } 65 return nil 66 } 67 68 info, err = currencycrud.CreateSet( 69 tx.CoinFiatCurrency.Create(), 70 ¤cycrud.Req{ 71 CoinTypeID: h.CoinTypeID, 72 FiatID: h.FiatID, 73 FeedType: h.FeedType, 74 MarketValueHigh: h.MarketValueHigh, 75 MarketValueLow: h.MarketValueLow, 76 }, 77 ).Save(ctx) 78 if err != nil { 79 return err 80 } 81 82 h.ID = &info.ID 83 return nil 84 } 85 86 func (h *createHandler) createCurrencyHistory(ctx context.Context, tx *ent.Tx) error { 87 if _, err := currencyhiscrud.CreateSet( 88 tx.CoinFiatCurrencyHistory.Create(), 89 ¤cyhiscrud.Req{ 90 CoinTypeID: h.CoinTypeID, 91 FiatID: h.FiatID, 92 FeedType: h.FeedType, 93 MarketValueHigh: h.MarketValueHigh, 94 MarketValueLow: h.MarketValueLow, 95 }, 96 ).Save(ctx); err != nil { 97 return err 98 } 99 return nil 100 } 101 102 func (h *Handler) CreateCurrency(ctx context.Context) (*npool.Currency, error) { 103 handler := &createHandler{ 104 Handler: h, 105 } 106 107 err := db.WithTx(ctx, func(_ctx context.Context, tx *ent.Tx) error { 108 if err := handler.createCurrency(ctx, tx); err != nil { 109 return err 110 } 111 if err := handler.createCurrencyHistory(ctx, tx); err != nil { 112 return err 113 } 114 return nil 115 }) 116 if err != nil { 117 return nil, err 118 } 119 120 return h.GetCurrency(ctx) 121 }