github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/mw/coin/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/currency" 8 currencyhiscrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin/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/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/currency" 16 "github.com/NpoolPlatform/libent-cruder/pkg/cruder" 17 18 "github.com/google/uuid" 19 ) 20 21 type createHandler struct { 22 *Handler 23 } 24 25 func (h *createHandler) createCurrency(ctx context.Context, tx *ent.Tx, req *currencycrud.Req) error { 26 lockKey := fmt.Sprintf( 27 "%v:%v:%v", 28 basetypes.Prefix_PrefixCreateCoinCurrency, 29 *req.CoinTypeID, 30 *req.FeedType, 31 ) 32 if err := redis2.TryLock(lockKey, 0); err != nil { 33 return err 34 } 35 defer func() { 36 _ = redis2.Unlock(lockKey) 37 }() 38 39 info, err := tx. 40 Currency. 41 Query(). 42 Where( 43 entcurrency.CoinTypeID(*req.CoinTypeID), 44 entcurrency.FeedType(req.FeedType.String()), 45 ). 46 ForUpdate(). 47 Only(ctx) 48 if err != nil { 49 if !ent.IsNotFound(err) { 50 return err 51 } 52 } 53 54 if info != nil { 55 info, err := currencycrud. 56 UpdateSet(info.Update(), req). 57 Save(ctx) 58 if err != nil { 59 return err 60 } 61 62 h.ID = &info.ID 63 h.EntID = &info.EntID 64 65 return nil 66 } 67 68 info, err = currencycrud. 69 CreateSet(tx.Currency.Create(), req). 70 Save(ctx) 71 if err != nil { 72 return err 73 } 74 75 h.ID = &info.ID 76 h.EntID = &info.EntID 77 78 return nil 79 } 80 81 func (h *createHandler) createCurrencyHistory(ctx context.Context, tx *ent.Tx, req *currencycrud.Req) error { 82 if _, err := currencyhiscrud.CreateSet( 83 tx.CurrencyHistory.Create(), 84 ¤cyhiscrud.Req{ 85 CoinTypeID: req.CoinTypeID, 86 FeedType: req.FeedType, 87 MarketValueHigh: req.MarketValueHigh, 88 MarketValueLow: req.MarketValueLow, 89 }, 90 ).Save(ctx); err != nil { 91 return err 92 } 93 return nil 94 } 95 96 func (h *Handler) CreateCurrency(ctx context.Context) (*npool.Currency, error) { 97 handler := &createHandler{ 98 Handler: h, 99 } 100 101 err := db.WithTx(ctx, func(_ctx context.Context, tx *ent.Tx) error { 102 req := ¤cycrud.Req{ 103 CoinTypeID: h.CoinTypeID, 104 FeedType: h.FeedType, 105 MarketValueHigh: h.MarketValueHigh, 106 MarketValueLow: h.MarketValueLow, 107 } 108 109 if err := handler.createCurrency(ctx, tx, req); err != nil { 110 return err 111 } 112 if err := handler.createCurrencyHistory(ctx, tx, req); err != nil { 113 return err 114 } 115 return nil 116 }) 117 if err != nil { 118 return nil, err 119 } 120 121 return h.GetCurrency(ctx) 122 } 123 124 func (h *Handler) CreateCurrencies(ctx context.Context) ([]*npool.Currency, error) { 125 handler := &createHandler{ 126 Handler: h, 127 } 128 129 ids := []uuid.UUID{} 130 131 err := db.WithTx(ctx, func(_ctx context.Context, tx *ent.Tx) error { 132 for _, req := range handler.Reqs { 133 if err := handler.createCurrency(ctx, tx, req); err != nil { 134 return err 135 } 136 if err := handler.createCurrencyHistory(ctx, tx, req); err != nil { 137 return err 138 } 139 ids = append(ids, *req.CoinTypeID) 140 } 141 return nil 142 }) 143 if err != nil { 144 return nil, err 145 } 146 147 h.Conds = ¤cycrud.Conds{ 148 CoinTypeIDs: &cruder.Cond{Op: cruder.IN, Val: ids}, 149 } 150 h.Offset = 0 151 h.Limit = int32(len(ids)) 152 153 infos, _, err := h.GetCurrencies(ctx) 154 return infos, err 155 }