@@ -20,6 +20,7 @@ type PurchaseDao interface {
2020 Update (context context.Context , purchase * database.Purchase ) error
2121 Get (context context.Context , id int64 ) (database.Purchase , error )
2222 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 )
2324}
2425
2526type dbPurchaseDao struct {
@@ -122,3 +123,78 @@ func (dao *dbPurchaseDao) Search(context context.Context, itemId int64, address
122123
123124 return
124125}
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