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

     1  package fiat
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"entgo.io/ent/dialect/sql"
     8  	fiatcrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/fiat"
     9  	"github.com/NpoolPlatform/chain-middleware/pkg/db"
    10  	"github.com/NpoolPlatform/chain-middleware/pkg/db/ent"
    11  	npool "github.com/NpoolPlatform/message/npool/chain/mw/v1/fiat"
    12  
    13  	entfiat "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/fiat"
    14  )
    15  
    16  type queryHandler struct {
    17  	*Handler
    18  	stm   *ent.FiatSelect
    19  	infos []*npool.Fiat
    20  	total uint32
    21  }
    22  
    23  func (h *queryHandler) selectFiat(stm *ent.FiatQuery) {
    24  	h.stm = stm.Select(
    25  		entfiat.FieldID,
    26  		entfiat.FieldEntID,
    27  		entfiat.FieldName,
    28  		entfiat.FieldLogo,
    29  		entfiat.FieldUnit,
    30  		entfiat.FieldCreatedAt,
    31  		entfiat.FieldUpdatedAt,
    32  	)
    33  }
    34  
    35  func (h *queryHandler) queryFiat(cli *ent.Client) error {
    36  	if h.ID == nil && h.EntID == nil {
    37  		return fmt.Errorf("invalid id")
    38  	}
    39  	stm := cli.Fiat.Query().Where(entfiat.DeletedAt(0))
    40  	if h.ID != nil {
    41  		stm.Where(entfiat.ID(*h.ID))
    42  	}
    43  	if h.EntID != nil {
    44  		stm.Where(entfiat.EntID(*h.EntID))
    45  	}
    46  	h.selectFiat(stm)
    47  	return nil
    48  }
    49  
    50  func (h *queryHandler) queryFiats(ctx context.Context, cli *ent.Client) error {
    51  	stm, err := fiatcrud.SetQueryConds(cli.Fiat.Query(), h.Conds)
    52  	if err != nil {
    53  		return err
    54  	}
    55  	total, err := stm.Count(ctx)
    56  	if err != nil {
    57  		return err
    58  	}
    59  	h.total = uint32(total)
    60  	h.selectFiat(stm)
    61  	return nil
    62  }
    63  
    64  func (h *queryHandler) queryJoin() {
    65  	h.stm.Modify(func(s *sql.Selector) {})
    66  }
    67  
    68  func (h *queryHandler) scan(ctx context.Context) error {
    69  	return h.stm.Scan(ctx, &h.infos)
    70  }
    71  
    72  func (h *Handler) GetFiat(ctx context.Context) (*npool.Fiat, error) {
    73  	handler := &queryHandler{
    74  		Handler: h,
    75  	}
    76  
    77  	err := db.WithClient(ctx, func(_ctx context.Context, cli *ent.Client) error {
    78  		if err := handler.queryFiat(cli); err != nil {
    79  			return err
    80  		}
    81  		handler.queryJoin()
    82  		const singleRowLimit = 2
    83  		handler.stm.Offset(0).Limit(singleRowLimit)
    84  		return handler.scan(_ctx)
    85  	})
    86  	if err != nil {
    87  		return nil, err
    88  	}
    89  	if len(handler.infos) == 0 {
    90  		return nil, nil
    91  	}
    92  	if len(handler.infos) > 1 {
    93  		return nil, fmt.Errorf("too many record")
    94  	}
    95  
    96  	return handler.infos[0], nil
    97  }
    98  
    99  func (h *Handler) GetFiats(ctx context.Context) ([]*npool.Fiat, uint32, error) {
   100  	handler := &queryHandler{
   101  		Handler: h,
   102  	}
   103  
   104  	err := db.WithClient(ctx, func(_ctx context.Context, cli *ent.Client) error {
   105  		if err := handler.queryFiats(_ctx, cli); err != nil {
   106  			return err
   107  		}
   108  		handler.queryJoin()
   109  		handler.stm.
   110  			Offset(int(h.Offset)).
   111  			Limit(int(h.Limit))
   112  		return handler.scan(_ctx)
   113  	})
   114  	if err != nil {
   115  		return nil, 0, err
   116  	}
   117  
   118  	return handler.infos, handler.total, nil
   119  }
   120  
   121  func (h *Handler) GetFiatOnly(ctx context.Context) (info *npool.Fiat, err error) {
   122  	handler := &queryHandler{
   123  		Handler: h,
   124  	}
   125  
   126  	err = db.WithClient(ctx, func(_ctx context.Context, cli *ent.Client) error {
   127  		if err := handler.queryFiats(_ctx, cli); err != nil {
   128  			return err
   129  		}
   130  		handler.queryJoin()
   131  		const singleRowLimit = 2
   132  		handler.stm.Offset(0).Limit(singleRowLimit)
   133  		return handler.scan(_ctx)
   134  	})
   135  	if err != nil {
   136  		return nil, err
   137  	}
   138  	if len(handler.infos) == 0 {
   139  		return nil, nil
   140  	}
   141  	if len(handler.infos) > 1 {
   142  		return nil, fmt.Errorf("too many records")
   143  	}
   144  
   145  	return handler.infos[0], nil
   146  }