github.com/NpoolPlatform/chain-middleware@v0.0.0-20240228100535-eb1bcf896eb9/pkg/mw/fiat/currency/feed/query.go (about) 1 package currencyfeed 2 3 import ( 4 "context" 5 "fmt" 6 7 basetypes "github.com/NpoolPlatform/message/npool/basetypes/v1" 8 npool "github.com/NpoolPlatform/message/npool/chain/mw/v1/fiat/currency/feed" 9 10 "github.com/NpoolPlatform/chain-middleware/pkg/db" 11 "github.com/NpoolPlatform/chain-middleware/pkg/db/ent" 12 13 currencyfeedcrud "github.com/NpoolPlatform/chain-middleware/pkg/crud/fiat/currency/feed" 14 entfiat "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/fiat" 15 entcurrencyfeed "github.com/NpoolPlatform/chain-middleware/pkg/db/ent/fiatcurrencyfeed" 16 17 "entgo.io/ent/dialect/sql" 18 ) 19 20 type queryHandler struct { 21 *Handler 22 stm *ent.FiatCurrencyFeedSelect 23 infos []*npool.Feed 24 total uint32 25 } 26 27 func (h *queryHandler) selectFeed(stm *ent.FiatCurrencyFeedQuery) { 28 h.stm = stm.Select( 29 entcurrencyfeed.FieldID, 30 entcurrencyfeed.FieldEntID, 31 entcurrencyfeed.FieldFiatID, 32 entcurrencyfeed.FieldFeedType, 33 entcurrencyfeed.FieldFeedFiatName, 34 entcurrencyfeed.FieldDisabled, 35 entcurrencyfeed.FieldCreatedAt, 36 entcurrencyfeed.FieldUpdatedAt, 37 ) 38 } 39 40 func (h *queryHandler) queryFeed(cli *ent.Client) error { 41 if h.ID == nil && h.EntID == nil { 42 return fmt.Errorf("invalid id") 43 } 44 stm := cli.FiatCurrencyFeed.Query().Where(entcurrencyfeed.DeletedAt(0)) 45 if h.ID != nil { 46 stm.Where(entcurrencyfeed.ID(*h.ID)) 47 } 48 if h.EntID != nil { 49 stm.Where(entcurrencyfeed.EntID(*h.EntID)) 50 } 51 h.selectFeed(stm) 52 return nil 53 } 54 55 func (h *queryHandler) queryFeeds(ctx context.Context, cli *ent.Client) error { 56 stm, err := currencyfeedcrud.SetQueryConds(cli.FiatCurrencyFeed.Query(), h.Conds) 57 if err != nil { 58 return err 59 } 60 61 total, err := stm.Count(ctx) 62 if err != nil { 63 return err 64 } 65 h.total = uint32(total) 66 67 h.selectFeed(stm) 68 return nil 69 } 70 71 func (h *queryHandler) queryJoinFiat(s *sql.Selector) { 72 t := sql.Table(entfiat.Table) 73 s. 74 LeftJoin(t). 75 On( 76 s.C(entcurrencyfeed.FieldFiatID), 77 t.C(entfiat.FieldEntID), 78 ). 79 AppendSelect( 80 sql.As(t.C(entfiat.FieldName), "fiat_name"), 81 sql.As(t.C(entfiat.FieldLogo), "fiat_logo"), 82 sql.As(t.C(entfiat.FieldUnit), "fiat_unit"), 83 ) 84 } 85 86 func (h *queryHandler) queryJoin() { 87 h.stm.Modify(func(s *sql.Selector) { 88 h.queryJoinFiat(s) 89 }) 90 } 91 92 func (h *queryHandler) scan(ctx context.Context) error { 93 return h.stm.Scan(ctx, &h.infos) 94 } 95 96 func (h *queryHandler) formalize() { 97 for _, info := range h.infos { 98 info.FeedType = basetypes.CurrencyFeedType(basetypes.CurrencyFeedType_value[info.FeedTypeStr]) 99 } 100 } 101 102 func (h *Handler) GetFeed(ctx context.Context) (*npool.Feed, error) { 103 handler := &queryHandler{ 104 Handler: h, 105 } 106 107 err := db.WithClient(ctx, func(_ctx context.Context, cli *ent.Client) error { 108 if err := handler.queryFeed(cli); err != nil { 109 return err 110 } 111 handler.queryJoin() 112 const singleRowLimit = 2 113 handler.stm.Offset(0).Limit(singleRowLimit) 114 return handler.scan(_ctx) 115 }) 116 if err != nil { 117 return nil, err 118 } 119 if len(handler.infos) == 0 { 120 return nil, nil 121 } 122 if len(handler.infos) > 1 { 123 return nil, fmt.Errorf("too many record") 124 } 125 126 handler.formalize() 127 return handler.infos[0], nil 128 } 129 130 func (h *Handler) GetFeeds(ctx context.Context) ([]*npool.Feed, uint32, error) { 131 handler := &queryHandler{ 132 Handler: h, 133 } 134 135 err := db.WithClient(ctx, func(_ctx context.Context, cli *ent.Client) error { 136 if err := handler.queryFeeds(ctx, cli); err != nil { 137 return err 138 } 139 handler.queryJoin() 140 handler.stm. 141 Offset(int(h.Offset)). 142 Limit(int(h.Limit)) 143 return handler.scan(_ctx) 144 }) 145 if err != nil { 146 return nil, 0, err 147 } 148 149 handler.formalize() 150 return handler.infos, handler.total, nil 151 }