From a0f4b3187ff6e9133d13002a0abbeb947606901d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Andrade?= Date: Fri, 24 Nov 2023 22:53:30 +0100 Subject: [PATCH] Take into account sales without template in getSchemaStatsByCollectionV2Action --- .../atomicmarket/handlers/stats.test.ts | 92 ++++++++++++++++++- .../namespaces/atomicmarket/handlers/stats.ts | 8 +- 2 files changed, 95 insertions(+), 5 deletions(-) diff --git a/src/api/namespaces/atomicmarket/handlers/stats.test.ts b/src/api/namespaces/atomicmarket/handlers/stats.test.ts index 11d13a22..9b2c7471 100644 --- a/src/api/namespaces/atomicmarket/handlers/stats.test.ts +++ b/src/api/namespaces/atomicmarket/handlers/stats.test.ts @@ -1,6 +1,6 @@ import {initAtomicMarketTest} from '../test'; import {getTestContext} from '../../../../utils/test'; -import {getTemplateStatsAction} from './stats'; +import {getSchemaStatsByCollectionV2Action, getTemplateStatsAction} from './stats'; import {SaleApiState} from '../index'; import {expect} from 'chai'; @@ -219,5 +219,95 @@ describe('AtomicMarket Stats API', () => { }); }); + describe('getSchemaStatsByCollectionV2Action', () => { + txit('gets the schema sales and volume for sales with templates', async () => { + await client.createContractReader(); + + await client.createToken({token_symbol: 'TOKEN1'}); + const { collection_name } = await client.createCollection(); + const { schema_name } = await client.createSchema({ collection_name }); + const { template_id } = await client.createTemplate({ collection_name, schema_name }); + const { template_id: templateId2 } = await client.createTemplate({ collection_name, schema_name }); + + const context = getTestContext(client, { + collection_name, + }); + + await client.createFullSale({ + final_price: 1, + listing_price: 1, + listing_symbol: 'TOKEN1', + settlement_symbol: 'TOKEN1', + state: SaleApiState.SOLD, + taker_marketplace: 'X', + collection_name, + }, {template_id, schema_name}); + + await client.createFullSale({ + final_price: 1, + listing_price: 1, + listing_symbol: 'TOKEN1', + settlement_symbol: 'TOKEN1', + state: SaleApiState.SOLD, + taker_marketplace: 'X', + collection_name, + }, {template_id: templateId2, schema_name}); + + await client.refreshTemplatePrices(); + + const response = await getSchemaStatsByCollectionV2Action({symbol: 'TOKEN1'}, context); + + expect(response.results.length).to.equal(1); + + expect(response.results.find((r: any) => r.schema_name === schema_name)).to.deep.contains({ + volume: '2', + sales: '2' + }); + }); + + txit('gets the schema sales and volume for sales without templates', async () => { + await client.createContractReader(); + + await client.createToken({token_symbol: 'TOKEN1'}); + const { collection_name } = await client.createCollection(); + const { schema_name } = await client.createSchema({ collection_name }); + + const context = getTestContext(client, { + collection_name, + }); + + await client.createFullSale({ + final_price: 1, + listing_price: 1, + listing_symbol: 'TOKEN1', + settlement_symbol: 'TOKEN1', + state: SaleApiState.SOLD, + taker_marketplace: 'X', + collection_name, + }, {schema_name}); + + await client.createFullSale({ + final_price: 1, + listing_price: 1, + listing_symbol: 'TOKEN1', + settlement_symbol: 'TOKEN1', + state: SaleApiState.SOLD, + taker_marketplace: 'X', + collection_name, + }, {schema_name}); + + await client.refreshTemplatePrices(); + + const response = await getSchemaStatsByCollectionV2Action({symbol: 'TOKEN1'}, context); + + expect(response.results.length).to.equal(1); + + expect(response.results.find((r: any) => r.schema_name === schema_name)).to.deep.contains({ + volume: '2', + sales: '2' + }); + }); + }); + after(async () => await client.end()); }); diff --git a/src/api/namespaces/atomicmarket/handlers/stats.ts b/src/api/namespaces/atomicmarket/handlers/stats.ts index 67ef320e..363bb19e 100644 --- a/src/api/namespaces/atomicmarket/handlers/stats.ts +++ b/src/api/namespaces/atomicmarket/handlers/stats.ts @@ -235,11 +235,11 @@ export async function getSchemaStatsByCollectionV2Action(params: RequestValues, } const statsQuery = new QueryBuilder( - 'SELECT template.schema_name, SUM(price.price) volume, COUNT(*) sales ' + - 'FROM atomicmarket_stats_prices_master price, atomicassets_templates "template" ' + 'SELECT schema.schema_name, SUM(price.price) volume, COUNT(*) sales ' + + 'FROM atomicmarket_stats_prices_master price, atomicassets_schemas "schema" ' ); - statsQuery.addCondition('price.assets_contract = template.contract AND price.template_id = template.template_id'); + statsQuery.addCondition('price.assets_contract = schema.contract AND price.schema_name = schema.schema_name AND price.collection_name = schema.collection_name'); statsQuery.equal('price.market_contract', ctx.coreArgs.atomicmarket_account); statsQuery.equal('price.symbol', args.symbol); @@ -253,7 +253,7 @@ export async function getSchemaStatsByCollectionV2Action(params: RequestValues, statsQuery.addCondition('price.time < ' + statsQuery.addVariable(args.before) + '::BIGINT'); } - statsQuery.group(['template.contract', 'template.collection_name', 'template.schema_name']); + statsQuery.group(['schema.contract', 'schema.collection_name', 'schema.schema_name']); const schemaStatsQuery = new QueryBuilder(` WITH stats AS MATERIALIZED (