github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/mw/coin/delete.go (about)

     1  //nolint:dupl
     2  package coin
     3  
     4  import (
     5  	"context"
     6  	"fmt"
     7  	"time"
     8  
     9  	npool "github.com/NpoolPlatform/message/npool/chain/mw/v1/coin"
    10  
    11  	basecrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin"
    12  	extracrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin/extra"
    13  	settingcrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/coin/setting"
    14  
    15  	"github.com/NpoolPlatform/chain-middleware/pkg/db"
    16  	"github.com/NpoolPlatform/chain-middleware/pkg/db/ent"
    17  	entextra "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/coinextra"
    18  	entsetting "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/setting"
    19  
    20  	"github.com/google/uuid"
    21  )
    22  
    23  type deleteHandler struct {
    24  	*Handler
    25  }
    26  
    27  func (h *deleteHandler) deleteCoinBase(ctx context.Context, tx *ent.Tx) error {
    28  	now := uint32(time.Now().Unix())
    29  	if _, err := basecrud.UpdateSet(
    30  		tx.CoinBase.UpdateOneID(*h.ID),
    31  		&basecrud.Req{
    32  			DeletedAt: &now,
    33  		},
    34  	).Save(ctx); err != nil {
    35  		return err
    36  	}
    37  	return nil
    38  }
    39  
    40  func (h *deleteHandler) deleteCoinExtra(ctx context.Context, tx *ent.Tx) error {
    41  	info, err := tx.
    42  		CoinExtra.
    43  		Query().
    44  		Where(
    45  			entextra.CoinTypeID(*h.EntID),
    46  		).
    47  		ForUpdate().
    48  		Only(ctx)
    49  	if err != nil {
    50  		if !ent.IsNotFound(err) {
    51  			return err
    52  		}
    53  	}
    54  	if info == nil {
    55  		return nil
    56  	}
    57  
    58  	now := uint32(time.Now().Unix())
    59  	if _, err := extracrud.UpdateSet(
    60  		info.Update(),
    61  		&extracrud.Req{
    62  			DeletedAt: &now,
    63  		},
    64  	).Save(ctx); err != nil {
    65  		return err
    66  	}
    67  
    68  	return nil
    69  }
    70  
    71  func (h *deleteHandler) deleteCoinSetting(ctx context.Context, tx *ent.Tx) error {
    72  	info, err := tx.
    73  		Setting.
    74  		Query().
    75  		Where(
    76  			entsetting.CoinTypeID(*h.EntID),
    77  		).
    78  		ForUpdate().
    79  		Only(ctx)
    80  	if err != nil {
    81  		if !ent.IsNotFound(err) {
    82  			return err
    83  		}
    84  	}
    85  	if info == nil {
    86  		return nil
    87  	}
    88  
    89  	now := uint32(time.Now().Unix())
    90  	if _, err := settingcrud.UpdateSet(
    91  		info.Update(),
    92  		&settingcrud.Req{
    93  			DeletedAt: &now,
    94  		},
    95  	).Save(ctx); err != nil {
    96  		return err
    97  	}
    98  
    99  	return nil
   100  }
   101  
   102  func (h *Handler) DeleteCoin(ctx context.Context) (*npool.Coin, error) {
   103  	if h.ID == nil {
   104  		return nil, fmt.Errorf("invalid cointypeid")
   105  	}
   106  
   107  	info, err := h.GetCoin(ctx)
   108  	if err != nil {
   109  		return nil, err
   110  	}
   111  
   112  	entID, err := uuid.Parse(info.EntID)
   113  	if err != nil {
   114  		return nil, err
   115  	}
   116  	h.EntID = &entID
   117  	handler := &deleteHandler{
   118  		Handler: h,
   119  	}
   120  
   121  	err = db.WithTx(ctx, func(_ctx context.Context, tx *ent.Tx) error {
   122  		if err := handler.deleteCoinBase(_ctx, tx); err != nil {
   123  			return err
   124  		}
   125  		if err := handler.deleteCoinExtra(_ctx, tx); err != nil {
   126  			return err
   127  		}
   128  		if err := handler.deleteCoinSetting(_ctx, tx); err != nil {
   129  			return err
   130  		}
   131  		return nil
   132  	})
   133  	if err != nil {
   134  		return nil, err
   135  	}
   136  
   137  	return info, nil
   138  }