@@ -20,6 +20,7 @@ type PurchaseDao interface {
20
20
Update (context context.Context , purchase * database.Purchase ) error
21
21
Get (context context.Context , id int64 ) (database.Purchase , error )
22
22
Search (context context.Context , itemId int64 , address string , sort string , offset , limit int ) (int64 , []* database.Purchase , error )
23
+ Query (context context.Context , itemIds []int64 , bucketIds []int64 , objectIds []int64 , address string , sort string , offset , limit int ) (int64 , []* database.Purchase , error )
23
24
}
24
25
25
26
type dbPurchaseDao struct {
@@ -122,3 +123,78 @@ func (dao *dbPurchaseDao) Search(context context.Context, itemId int64, address
122
123
123
124
return
124
125
}
126
+
127
+ func (dao * dbPurchaseDao ) Query (context context.Context , itemIds []int64 , bucketIds []int64 , objectIds []int64 , address string , sort string , offset , limit int ) (total int64 , purchases []* database.Purchase , err error ) {
128
+ rawSql := fmt .Sprintf (" inner join items i on p.item_id = i.id where i.status = %d" , database .ItemListed )
129
+ parameters := make ([]interface {}, 0 )
130
+
131
+ if len (itemIds ) > 0 {
132
+ rawSql = rawSql + ` and item_id in ?`
133
+ parameters = append (parameters , itemIds )
134
+ } else if len (bucketIds ) > 0 {
135
+ rawSql = rawSql + ` and resource_id in ? and type = ?`
136
+ parameters = append (parameters , bucketIds )
137
+ parameters = append (parameters , database .COLLECTION )
138
+ } else if len (objectIds ) > 0 {
139
+ rawSql = rawSql + ` and resource_id in ? and type = ?`
140
+ parameters = append (parameters , objectIds )
141
+ parameters = append (parameters , database .OBJECT )
142
+ }
143
+
144
+ if len (address ) > 0 {
145
+ rawSql = rawSql + ` and buyer_address = ?`
146
+ parameters = append (parameters , address )
147
+ }
148
+
149
+ countSql := "select count(1) from purchases p " + rawSql
150
+
151
+ err = dao .db .Raw (countSql , parameters ... ).Scan (& total ).Error
152
+ if err != nil {
153
+ return 0 , nil , err
154
+ }
155
+ if total == 0 {
156
+ return
157
+ }
158
+
159
+ dataSql := "select * from purchases p " + rawSql
160
+ dataSql = dataSql + " order by "
161
+ switch sort {
162
+ case PurchaseSortCreationAsc :
163
+ dataSql = dataSql + "p.id asc "
164
+ case PurchaseSortCreationDesc :
165
+ dataSql = dataSql + "p.id desc "
166
+ case PurchaseSortPriceAsc :
167
+ dataSql = dataSql + "p.price asc "
168
+ case PurchaseSortPriceDesc :
169
+ dataSql = dataSql + "p.price desc "
170
+ default :
171
+ return 0 , nil , fmt .Errorf ("unsupported sort string: %s" , sort )
172
+ }
173
+ dataSql = dataSql + fmt .Sprintf ("limit %d, %d" , offset , limit )
174
+
175
+ err = dao .db .Preload ("Item" ).Raw (dataSql , parameters ... ).Scan (& purchases ).Error
176
+ if err != nil {
177
+ return 0 , nil , err
178
+ }
179
+
180
+ itemIds = []int64 {}
181
+ for _ , purchase := range purchases {
182
+ itemIds = append (itemIds , purchase .ItemId )
183
+ }
184
+
185
+ var items []* database.Item
186
+ err = dao .db .Preload ("Stats" ).Where ("id in ?" , itemIds ).Find (& items ).Error
187
+ if err != nil {
188
+ return 0 , nil , err
189
+ }
190
+
191
+ for _ , purchase := range purchases {
192
+ for _ , item := range items {
193
+ if purchase .ItemId == item .Id {
194
+ purchase .Item = item
195
+ }
196
+ }
197
+ }
198
+
199
+ return
200
+ }
0 commit comments