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 }