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  		&currencyhiscrud.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 := &currencycrud.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 = &currencycrud.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  }