From b1db1ada526f45186c5c4ddd04efb4eea76113e9 Mon Sep 17 00:00:00 2001 From: KoKo Date: Tue, 17 May 2022 15:25:00 +0800 Subject: [PATCH 1/3] feat: sales feed --- src/server-extension/model/sales.model.ts | 32 +++++++++++++++++++++ src/server-extension/query/nft.ts | 19 +++++++++++- src/server-extension/resolvers/index.ts | 2 ++ src/server-extension/resolvers/salesFeed.ts | 18 ++++++++++++ 4 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 src/server-extension/model/sales.model.ts create mode 100644 src/server-extension/resolvers/salesFeed.ts diff --git a/src/server-extension/model/sales.model.ts b/src/server-extension/model/sales.model.ts new file mode 100644 index 00000000..a80551fa --- /dev/null +++ b/src/server-extension/model/sales.model.ts @@ -0,0 +1,32 @@ +import { Field, ObjectType } from 'type-graphql'; + +@ObjectType() +export class SaleNftEntity { + @Field(() => String, { nullable: false }) + id!: string + + @Field(() => String) + name!: string + + @Field(() => String, { nullable: false }) + issuer!: string + + @Field(() => String, { nullable: false }) + buyer!: string + + @Field(() => String, { nullable: false, name: 'collectionId'}) + collection_id!: string + + @Field(() => BigInt, { nullable: false, name: 'salePrice' }) + sale_price!: bigint + + @Field(() => String, { nullable: false }) + timestamp!: string + + @Field(() => String, { nullable: true }) + image!: string + + constructor(props: Partial) { + Object.assign(this, props); + } +} \ No newline at end of file diff --git a/src/server-extension/query/nft.ts b/src/server-extension/query/nft.ts index 94e0eaf8..f7bcf087 100644 --- a/src/server-extension/query/nft.ts +++ b/src/server-extension/query/nft.ts @@ -1,4 +1,21 @@ export const passionQuery = `SELECT DISTINCT ne.issuer as id FROM nft_entity ne WHERE ne.current_owner = $1 -AND ne.current_owner != ne.issuer` \ No newline at end of file +AND ne.current_owner != ne.issuer` + +export const salesQuery = `SELECT + ne.id, + ne.name, + ne.issuer, + e.caller as buyer, + collection_id, + (e.meta::bigint) as sale_price, + e.timestamp, + me.image +FROM + nft_entity ne + LEFT join event as e on e.nft_id = ne.id + LEFT join metadata_entity me on me.id = ne.metadata +where + e.interaction = 'BUY' + and e.timestamp >= NOW() - INTERVAL '10 DAY'` \ No newline at end of file diff --git a/src/server-extension/resolvers/index.ts b/src/server-extension/resolvers/index.ts index e32db8a9..e1ab0e0c 100644 --- a/src/server-extension/resolvers/index.ts +++ b/src/server-extension/resolvers/index.ts @@ -6,6 +6,7 @@ import { SpotlightResolver } from './spotlight' import { CollectionChartResolver } from './collectionChart' import { CollectionEventResolver } from './collectionEvent' import { PassionFeedResolver } from "./passionFeed"; +import { SalesFeedResolver } from "./salesFeed"; @ObjectType() export class Hello { @@ -37,4 +38,5 @@ export { SpotlightResolver, CollectionEventResolver, PassionFeedResolver, + SalesFeedResolver, } diff --git a/src/server-extension/resolvers/salesFeed.ts b/src/server-extension/resolvers/salesFeed.ts new file mode 100644 index 00000000..037ff94e --- /dev/null +++ b/src/server-extension/resolvers/salesFeed.ts @@ -0,0 +1,18 @@ +import { Query, Resolver } from 'type-graphql' +import type { EntityManager } from 'typeorm' +import { NFTEntity } from '../../model/generated' +import { SaleNftEntity } from '../model/sales.model' +import { salesQuery } from "../query/nft"; +import { makeQuery } from "../utils"; + +@Resolver() +export class SalesFeedResolver { + constructor(private tx: () => Promise) { } + + @Query(() => [SaleNftEntity]) + async salesFeed(): Promise<[SaleNftEntity]> { + const result: [SaleNftEntity] = await makeQuery(this.tx, NFTEntity, salesQuery) + + return result + } +} \ No newline at end of file From 1febf3134fbd6557b46c3b01c76edd5ddd83c344 Mon Sep 17 00:00:00 2001 From: KoKo Date: Wed, 18 May 2022 12:43:57 +0800 Subject: [PATCH 2/3] feat: collection_name and block_number --- src/server-extension/model/sales.model.ts | 6 ++++++ src/server-extension/query/nft.ts | 11 +++++++---- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/server-extension/model/sales.model.ts b/src/server-extension/model/sales.model.ts index a80551fa..d117cba2 100644 --- a/src/server-extension/model/sales.model.ts +++ b/src/server-extension/model/sales.model.ts @@ -17,9 +17,15 @@ export class SaleNftEntity { @Field(() => String, { nullable: false, name: 'collectionId'}) collection_id!: string + @Field(() => String, { nullable: false, name: 'collectionName'}) + collection_name!: string + @Field(() => BigInt, { nullable: false, name: 'salePrice' }) sale_price!: bigint + @Field(() => String, { nullable: false, name: 'blockNumber' }) + block_number!: string + @Field(() => String, { nullable: false }) timestamp!: string diff --git a/src/server-extension/query/nft.ts b/src/server-extension/query/nft.ts index f7bcf087..55c2e11a 100644 --- a/src/server-extension/query/nft.ts +++ b/src/server-extension/query/nft.ts @@ -6,16 +6,19 @@ AND ne.current_owner != ne.issuer` export const salesQuery = `SELECT ne.id, ne.name, + ce.name as collection_name, ne.issuer, - e.caller as buyer, collection_id, + e.caller as buyer, (e.meta::bigint) as sale_price, e.timestamp, + e.block_number, me.image -FROM - nft_entity ne +FROM nft_entity ne + JOIN collection_entity ce on ce.id = collection_id LEFT join event as e on e.nft_id = ne.id LEFT join metadata_entity me on me.id = ne.metadata where e.interaction = 'BUY' - and e.timestamp >= NOW() - INTERVAL '10 DAY'` \ No newline at end of file + and e.timestamp >= NOW() - INTERVAL '7 DAY' +ORDER BY e.timestamp desc` \ No newline at end of file From 4ad3cdba3a237de7817d133732a28992bde00a68 Mon Sep 17 00:00:00 2001 From: KoKo Date: Wed, 18 May 2022 14:04:58 +0800 Subject: [PATCH 3/3] fix: remove newline --- src/server-extension/resolvers/salesFeed.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server-extension/resolvers/salesFeed.ts b/src/server-extension/resolvers/salesFeed.ts index 037ff94e..209a7b2f 100644 --- a/src/server-extension/resolvers/salesFeed.ts +++ b/src/server-extension/resolvers/salesFeed.ts @@ -12,7 +12,6 @@ export class SalesFeedResolver { @Query(() => [SaleNftEntity]) async salesFeed(): Promise<[SaleNftEntity]> { const result: [SaleNftEntity] = await makeQuery(this.tx, NFTEntity, salesQuery) - return result } } \ No newline at end of file