Skip to content

Commit b65cead

Browse files
authored
feat: modifications to order endpoint to filter by itemId and sort by issue id and oldest (#250)
* feat: modifications to order endpoint to filter by itemId and sort by issue id and oldest * fix: query * feat: added name as filter and modify query on orders endpoint * fix: test * feat: updated dcl schemas
1 parent e255477 commit b65cead

File tree

8 files changed

+98
-20
lines changed

8 files changed

+98
-20
lines changed

package-lock.json

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"printWidth": 80
2727
},
2828
"dependencies": {
29-
"@dcl/schemas": "^6.12.0",
29+
"@dcl/schemas": "^6.13.2",
3030
"@well-known-components/env-config-provider": "^1.2.0",
3131
"@well-known-components/http-requests-logger-component": "^2.1.0",
3232
"@well-known-components/http-server": "^1.1.6",

src/adapters/handlers/orders.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ export function createOrdersHandler(
2121
const tokenId = params.getString('tokenId')
2222
const status = params.getValue<ListingStatus>('status', ListingStatus)
2323
const network = params.getValue<Network>('network', Network)
24+
const itemId = params.getString('itemId')
25+
const nftName = params.getString('nftName')
2426

2527
return asJSON(() =>
2628
orders.fetchAndCount({
@@ -34,6 +36,8 @@ export function createOrdersHandler(
3436
tokenId,
3537
status,
3638
network,
39+
itemId,
40+
nftName,
3741
})
3842
)
3943
}

src/adapters/sources/orders.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ export function createOrdersSource(
1313
[OrderSortBy.RECENTLY_LISTED]: result.createdAt,
1414
[OrderSortBy.RECENTLY_UPDATED]: result.updatedAt,
1515
[OrderSortBy.CHEAPEST]: +result.price,
16+
[OrderSortBy.ISSUED_ID_ASC]: result.tokenId,
17+
[OrderSortBy.ISSUED_ID_DESC]: result.tokenId,
18+
[OrderSortBy.OLDEST]: result.createdAt,
1619
},
1720
}))
1821
}

src/index.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,13 @@ import {
9292
getMarketplaceContracts,
9393
} from './logic/contracts'
9494
import { BID_DEFAULT_SORT_BY } from './ports/bids/utils'
95-
import { ORDER_DEFAULT_SORT_BY } from './ports/orders/utils'
95+
import {
96+
getCollectionsItemIdFilter,
97+
getCollectionsNameFilter,
98+
getMarketplaceItemIdFilter,
99+
getMarketplaceNameFilter,
100+
ORDER_DEFAULT_SORT_BY,
101+
} from './ports/orders/utils'
96102
import { createItemsSource } from './adapters/sources/items'
97103
import { createItemsComponent } from './ports/items/component'
98104
import { ITEM_DEFAULT_SORT_BY } from './ports/items/utils'
@@ -237,12 +243,16 @@ async function initComponents(): Promise<AppComponents> {
237243
subgraph: marketplaceSubgraph,
238244
network: Network.ETHEREUM,
239245
chainId: marketplaceChainId,
246+
getItemIdFilter: getMarketplaceItemIdFilter,
247+
getNameFilter: getMarketplaceNameFilter,
240248
})
241249

242250
const collectionsOrders = createOrdersComponent({
243251
subgraph: collectionsSubgraph,
244252
network: Network.MATIC,
245253
chainId: collectionsChainId,
254+
getItemIdFilter: getCollectionsItemIdFilter,
255+
getNameFilter: getCollectionsNameFilter,
246256
})
247257

248258
const orders = createMergerComponent<Order, OrderFilters, OrderSortBy>({
@@ -255,6 +265,9 @@ async function initComponents(): Promise<AppComponents> {
255265
[OrderSortBy.RECENTLY_LISTED]: SortDirection.DESC,
256266
[OrderSortBy.RECENTLY_UPDATED]: SortDirection.DESC,
257267
[OrderSortBy.CHEAPEST]: SortDirection.ASC,
268+
[OrderSortBy.ISSUED_ID_ASC]: SortDirection.ASC,
269+
[OrderSortBy.ISSUED_ID_DESC]: SortDirection.DESC,
270+
[OrderSortBy.OLDEST]: SortDirection.ASC,
258271
},
259272
maxCount: 1000,
260273
})

src/ports/orders/component.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@ export function createOrdersComponent(options: {
77
subgraph: ISubgraphComponent
88
network: Network
99
chainId: ChainId
10+
getItemIdFilter: (itemId: string) => string
11+
getNameFilter: (name: string) => string
1012
}): IOrdersComponent {
11-
const { subgraph, network, chainId } = options
13+
const { subgraph, network, chainId, getItemIdFilter, getNameFilter } = options
1214

1315
async function fetch(filters: OrderFilters) {
1416
if (filters.network && filters.network !== network) {
1517
return []
1618
}
1719

18-
const query = getOrdersQuery(filters)
20+
const query = getOrdersQuery(filters, false, getItemIdFilter, getNameFilter)
1921
const { orders: fragments } = await subgraph.query<{
2022
orders: OrderFragment[]
2123
}>(query)
@@ -32,7 +34,7 @@ export function createOrdersComponent(options: {
3234
return 0
3335
}
3436

35-
const query = getOrdersQuery(filters, true)
37+
const query = getOrdersQuery(filters, true, getItemIdFilter, getNameFilter)
3638
const { orders: fragments } = await subgraph.query<{
3739
orders: OrderFragment[]
3840
}>(query)

src/ports/orders/utils.ts

Lines changed: 48 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,18 @@ import { OrderFragment } from './types'
1010

1111
export const ORDER_DEFAULT_SORT_BY = OrderSortBy.RECENTLY_LISTED
1212

13+
// We're filtering on collections subgraph by itemId and on marketplace subgraph by name as there's not itemId
14+
export const getCollectionsItemIdFilter = (itemId: string) => `
15+
nft_: {itemBlockchainId: "${itemId}"}
16+
`
17+
export const getCollectionsNameFilter = (_name: string) => ``
18+
19+
export const getMarketplaceItemIdFilter = (_itemId: string) => ``
20+
21+
export const getMarketplaceNameFilter = (name: string) => `
22+
nft_: {name: "${name}"}
23+
`
24+
1325
export const getOrderFields = () => `
1426
fragment orderFields on Order {
1527
id
@@ -27,14 +39,20 @@ export const getOrderFields = () => `
2739
}
2840
}
2941
`
42+
3043
export const getOrderFragment = () => `
3144
fragment orderFragment on Order {
3245
...orderFields
3346
}
3447
${getOrderFields()}
3548
`
3649

37-
export const getOrdersQuery = (filters: OrderFilters, isCount = false) => {
50+
export const getOrdersQuery = (
51+
filters: OrderFilters,
52+
isCount = false,
53+
getItemIdFilter: (itemId: string) => string,
54+
getNameFilter: (name: string) => string
55+
) => {
3856
const {
3957
first,
4058
skip,
@@ -45,6 +63,8 @@ export const getOrdersQuery = (filters: OrderFilters, isCount = false) => {
4563
buyer,
4664
owner,
4765
status,
66+
itemId,
67+
nftName,
4868
} = filters
4969

5070
const where: string[] = []
@@ -69,6 +89,16 @@ export const getOrdersQuery = (filters: OrderFilters, isCount = false) => {
6989
where.push(`owner: "${owner}"`)
7090
}
7191

92+
if (itemId) {
93+
const itemIdFilter = getItemIdFilter(itemId)
94+
where.push(itemIdFilter)
95+
}
96+
97+
if (nftName) {
98+
const nameFilter = getNameFilter(nftName)
99+
where.push(nameFilter)
100+
}
101+
72102
if (status) {
73103
if (status === ListingStatus.OPEN) {
74104
where.push(`expiresAt_gt: "${Date.now()}"`)
@@ -80,13 +110,14 @@ export const getOrdersQuery = (filters: OrderFilters, isCount = false) => {
80110
const total = isCount
81111
? max
82112
: typeof first !== 'undefined'
83-
? typeof skip !== 'undefined'
84-
? skip + first
85-
: first
86-
: max
113+
? typeof skip !== 'undefined'
114+
? skip + first
115+
: first
116+
: max
87117

88118
let orderBy: string
89119
let orderDirection: string
120+
90121
switch (sortBy || ORDER_DEFAULT_SORT_BY) {
91122
case OrderSortBy.RECENTLY_LISTED:
92123
orderBy = 'createdAt'
@@ -100,6 +131,18 @@ export const getOrdersQuery = (filters: OrderFilters, isCount = false) => {
100131
orderBy = 'price'
101132
orderDirection = 'asc'
102133
break
134+
case OrderSortBy.ISSUED_ID_ASC:
135+
orderBy = 'tokenId'
136+
orderDirection = 'asc'
137+
break
138+
case OrderSortBy.ISSUED_ID_DESC:
139+
orderBy = 'tokenId'
140+
orderDirection = 'desc'
141+
break
142+
case OrderSortBy.OLDEST:
143+
orderBy = 'createdAt'
144+
orderDirection = 'asc'
145+
break
103146
default:
104147
orderBy = 'createdAt'
105148
orderDirection = 'desc'

src/tests/components.ts

Lines changed: 16 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,13 @@ import { MINT_DEFAULT_SORT_BY } from '../ports/mints/utils'
9797
import { createNFTComponent } from '../ports/nfts/component'
9898
import { NFTResult } from '../ports/nfts/types'
9999
import { NFT_DEFAULT_SORT_BY } from '../ports/nfts/utils'
100-
import { ORDER_DEFAULT_SORT_BY } from '../ports/orders/utils'
100+
import {
101+
getCollectionsItemIdFilter,
102+
getCollectionsNameFilter,
103+
getMarketplaceItemIdFilter,
104+
getMarketplaceNameFilter,
105+
ORDER_DEFAULT_SORT_BY,
106+
} from '../ports/orders/utils'
101107
import { createSalesComponent } from '../ports/sales/component'
102108
import { SALE_DEFAULT_SORT_BY } from '../ports/sales/utils'
103109
import { getMarketplaceChainId, getCollectionsChainId } from '../logic/chainIds'
@@ -207,12 +213,16 @@ export async function initComponents(): Promise<AppComponents> {
207213
subgraph: marketplaceSubgraph,
208214
network: Network.ETHEREUM,
209215
chainId: marketplaceChainId,
216+
getItemIdFilter: getMarketplaceItemIdFilter,
217+
getNameFilter: getMarketplaceNameFilter,
210218
})
211219

212220
const collectionsOrders = createOrdersComponent({
213221
subgraph: collectionsSubgraph,
214222
network: Network.MATIC,
215223
chainId: collectionsChainId,
224+
getItemIdFilter: getCollectionsItemIdFilter,
225+
getNameFilter: getCollectionsNameFilter,
216226
})
217227

218228
const orders = createMergerComponent<Order, OrderFilters, OrderSortBy>({
@@ -225,6 +235,9 @@ export async function initComponents(): Promise<AppComponents> {
225235
[OrderSortBy.RECENTLY_LISTED]: SortDirection.DESC,
226236
[OrderSortBy.RECENTLY_UPDATED]: SortDirection.DESC,
227237
[OrderSortBy.CHEAPEST]: SortDirection.ASC,
238+
[OrderSortBy.ISSUED_ID_ASC]: SortDirection.ASC,
239+
[OrderSortBy.ISSUED_ID_DESC]: SortDirection.DESC,
240+
[OrderSortBy.OLDEST]: SortDirection.ASC,
228241
},
229242
maxCount: 1000,
230243
})
@@ -566,7 +579,7 @@ export async function initComponents(): Promise<AppComponents> {
566579
const statusChecks = await createStatusCheckComponent({ config, server })
567580

568581
const owners = createOwnersComponent({
569-
subgraph: collectionsSubgraph
582+
subgraph: collectionsSubgraph,
570583
})
571584

572585
return {
@@ -593,6 +606,6 @@ export async function initComponents(): Promise<AppComponents> {
593606
rankings,
594607
prices,
595608
stats,
596-
owners
609+
owners,
597610
}
598611
}

0 commit comments

Comments
 (0)