Skip to content

Commit 34187db

Browse files
feat: add individual data to trimmed response (#453)
1 parent 84114c9 commit 34187db

File tree

5 files changed

+282
-111
lines changed

5 files changed

+282
-111
lines changed

src/controllers/handlers/explorer-handler.ts

Lines changed: 6 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,16 @@
1-
import { Entity, Network } from '@dcl/schemas'
1+
import { Network } from '@dcl/schemas'
22
import { fetchThirdPartyWearablesFromThirdPartyName } from '../../logic/fetch-elements/fetch-third-party-wearables'
33
import { fetchAndPaginate, paginationObject } from '../../logic/pagination'
44
import { createCombinedSorting } from '../../logic/sorting'
55
import { ExplorerWearableEntity, parseUrn, buildTrimmedEntity } from '../../logic/utils'
66
import {
77
AppComponents,
8-
BaseWearable,
98
HandlerContextWithPath,
109
InvalidRequestError,
11-
OnChainWearable,
10+
MixedBaseWearable,
11+
MixedOnChainWearable,
12+
MixedThirdPartyWearable,
13+
MixedWearable,
1214
PaginatedResponse,
1315
ThirdPartyWearable
1416
} from '../../types'
@@ -20,23 +22,6 @@ export const THIRD_PARTY = 'third-party'
2022

2123
const VALID_COLLECTION_TYPES = ['base-wearable', 'on-chain', 'third-party']
2224

23-
export type MixedBaseWearable = BaseWearable & {
24-
type: typeof BASE_WEARABLE
25-
entity: Entity
26-
}
27-
28-
export type MixedOnChainWearable = OnChainWearable & {
29-
type: typeof ON_CHAIN
30-
entity: Entity
31-
}
32-
33-
export type MixedThirdPartyWearable = ThirdPartyWearable & {
34-
type: typeof THIRD_PARTY
35-
}
36-
37-
export type MixedWearable = (MixedBaseWearable | MixedOnChainWearable | MixedThirdPartyWearable) &
38-
Partial<Pick<OnChainWearable, 'rarity' | 'itemType'>>
39-
4025
export type MixedWearableResponse = Omit<MixedWearable, 'minTransferredAt' | 'maxTransferredAt'>
4126

4227
export type MixedWearableTrimmedResponse = {
@@ -223,7 +208,7 @@ export async function explorerHandler(
223208
if (isTrimmed) {
224209
const results: MixedWearableTrimmedResponse[] = page.elements.map((wearable) => {
225210
const result: MixedWearableTrimmedResponse = {
226-
entity: buildTrimmedEntity(wearable.entity, wearable.itemType)
211+
entity: buildTrimmedEntity(wearable)
227212
}
228213
if (includeAmount) {
229214
result.amount = wearable.individualData?.length || 0

src/logic/utils.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { parseUrn as resolverParseUrn } from '@dcl/urn-resolver'
2-
import { ItemType, ThirdPartyProvider } from '../types'
3-
import { Entity, Rarity, WearableCategory } from '@dcl/schemas'
2+
import { ItemType, ThirdPartyProvider, MixedWearable } from '../types'
3+
import { Rarity, WearableCategory } from '@dcl/schemas'
44

55
export type ExplorerWearableRepresentation = {
66
bodyShapes: string[]
@@ -20,6 +20,7 @@ export type ExplorerWearableEntity = {
2020
id: string
2121
thumbnail?: string
2222
metadata: ExplorerWearableMetadata
23+
individualData: MixedWearable['individualData']
2324
}
2425

2526
export const SORTED_RARITIES = [
@@ -74,7 +75,7 @@ export function sanitizeContractList(thirdPartyProviders: ThirdPartyProvider[])
7475
}
7576
}
7677

77-
export function buildTrimmedEntity(entity: Entity, itemType?: ItemType): ExplorerWearableEntity {
78+
export function buildTrimmedEntity({ entity, itemType, individualData }: MixedWearable): ExplorerWearableEntity {
7879
const thumbnailFile = entity?.metadata?.thumbnail as string | undefined
7980
const thumbnailHash = entity?.content?.find((c) => c.file === thumbnailFile)?.hash
8081
const metadata = entity?.metadata
@@ -87,6 +88,7 @@ export function buildTrimmedEntity(entity: Entity, itemType?: ItemType): Explore
8788
return {
8889
id: entity.id,
8990
thumbnail: thumbnailHash,
91+
individualData,
9092
metadata: {
9193
id: metadata?.id,
9294
rarity: metadata?.rarity,

src/types.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,23 @@ export type ThirdPartyWearable = {
179179

180180
export type BaseWearable = ThirdPartyWearable
181181

182+
export type MixedBaseWearable = BaseWearable & {
183+
type: 'base-wearable'
184+
entity: Entity
185+
}
186+
187+
export type MixedOnChainWearable = OnChainWearable & {
188+
type: 'on-chain'
189+
entity: Entity
190+
}
191+
192+
export type MixedThirdPartyWearable = ThirdPartyWearable & {
193+
type: 'third-party'
194+
}
195+
196+
export type MixedWearable = (MixedBaseWearable | MixedOnChainWearable | MixedThirdPartyWearable) &
197+
Partial<Pick<OnChainWearable, 'rarity' | 'itemType'>>
198+
182199
export type Name = {
183200
name: string
184201
contractAddress: string

test/mocks/mixed-wearable-mock.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import { WearableCategory } from '@dcl/schemas'
2+
import { ItemType, MixedBaseWearable, MixedOnChainWearable, MixedThirdPartyWearable } from '../../src/types'
3+
import { createMockEntity } from './entity-mock'
4+
5+
export const createMockOnChainWearable = (overrides?: Partial<MixedOnChainWearable>): MixedOnChainWearable => {
6+
const entity = overrides?.entity || createMockEntity()
7+
8+
return {
9+
type: 'on-chain',
10+
entity,
11+
itemType: ItemType.WEARABLE_V2,
12+
individualData: [{ id: 'nft-1', tokenId: '123', transferredAt: 1000, price: 100 }],
13+
urn: 'urn:decentraland:ethereum:collections-v2:0xabc:0',
14+
amount: 1,
15+
name: 'Test Wearable',
16+
rarity: 'common',
17+
category: WearableCategory.HAT,
18+
minTransferredAt: 1000,
19+
maxTransferredAt: 1000,
20+
...overrides
21+
}
22+
}
23+
24+
export const createMockThirdPartyWearable = (overrides?: Partial<MixedThirdPartyWearable>): MixedThirdPartyWearable => {
25+
const entity = overrides?.entity || createMockEntity()
26+
27+
return {
28+
type: 'third-party',
29+
entity,
30+
individualData: [{ id: 'tp-1', tokenId: '456' }],
31+
urn: 'urn:decentraland:matic:collections-thirdparty:thirdparty:collection:item',
32+
amount: 1,
33+
name: 'Test Third Party Wearable',
34+
category: WearableCategory.HAT,
35+
...overrides
36+
}
37+
}
38+
39+
export const createMockBaseWearable = (overrides?: Partial<MixedBaseWearable>): MixedBaseWearable => {
40+
const entity = overrides?.entity || createMockEntity()
41+
42+
return {
43+
type: 'base-wearable',
44+
entity,
45+
individualData: [{ id: 'base-1' }],
46+
urn: 'urn:decentraland:off-chain:base-avatars:hat',
47+
amount: 1,
48+
name: 'Base Hat',
49+
category: WearableCategory.HAT,
50+
...overrides
51+
}
52+
}

0 commit comments

Comments
 (0)