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