From f81d6c00cdd715db037bb05ce58b03d571742910 Mon Sep 17 00:00:00 2001 From: Angel Castillo Date: Fri, 17 Mar 2023 14:16:15 +0800 Subject: [PATCH] fix(cardano-services): stake-pool APY sorted search no longer returns error if APY is disabled --- .../DbSyncStakePoolProvider.ts | 9 +++++++- .../StakePool/StakePoolHttpService.test.ts | 22 ++++++++++--------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/packages/cardano-services/src/StakePool/DbSyncStakePoolProvider/DbSyncStakePoolProvider.ts b/packages/cardano-services/src/StakePool/DbSyncStakePoolProvider/DbSyncStakePoolProvider.ts index a52e530aee8..40b109999ef 100644 --- a/packages/cardano-services/src/StakePool/DbSyncStakePoolProvider/DbSyncStakePoolProvider.ts +++ b/packages/cardano-services/src/StakePool/DbSyncStakePoolProvider/DbSyncStakePoolProvider.ts @@ -126,9 +126,14 @@ export class DbSyncStakePoolProvider extends DbSyncProvider(RunnableModule) impl return (options?: QueryStakePoolsArgs) => this.#builder.queryPoolMetrics(hashesIds, totalStake, useBlockfrost, options); case 'apy': + // HACK: If the client request sort by APY default to normal sorting. if (this.#responseConfig?.search?.metrics?.apy === false) { - throw new ProviderError(ProviderFailure.BadRequest, undefined, 'APY metric is disabled'); + return async (options?: QueryStakePoolsArgs) => { + if (options) options.sort = undefined; + return await this.#builder.queryPoolData(updatesIds, useBlockfrost, options); + }; } + return (options?: QueryStakePoolsArgs) => this.#builder.queryPoolAPY(hashesIds, this.#epochLength, options); case 'data': default: @@ -164,6 +169,7 @@ export class DbSyncStakePoolProvider extends DbSyncProvider(RunnableModule) impl const updatesIds = poolUpdates.map(({ updateId }) => updateId); this.logger.debug(`${hashesIds.length} pools found`); const sortType = options?.sort?.field ? getStakePoolSortType(options.sort.field) : 'data'; + const orderedResult = await this.getQueryBySortType( sortType, { hashesIds, totalStake, updatesIds }, @@ -174,6 +180,7 @@ export class DbSyncStakePoolProvider extends DbSyncProvider(RunnableModule) impl (id) => poolUpdates[poolUpdates.findIndex((item) => item.id === id)].updateId ); let poolDatas: PoolData[] = []; + if (sortType !== 'data') { this.logger.debug('About to query stake pools data'); poolDatas = await this.#builder.queryPoolData(orderedResultUpdateIds, useBlockfrost); diff --git a/packages/cardano-services/test/StakePool/StakePoolHttpService.test.ts b/packages/cardano-services/test/StakePool/StakePoolHttpService.test.ts index dbc0102161a..3b71864eaaa 100644 --- a/packages/cardano-services/test/StakePool/StakePoolHttpService.test.ts +++ b/packages/cardano-services/test/StakePool/StakePoolHttpService.test.ts @@ -1,7 +1,7 @@ /* eslint-disable sonarjs/no-duplicate-string */ /* eslint-disable @typescript-eslint/no-explicit-any */ /* eslint-disable max-len */ -import { Cardano, ProviderError, QueryStakePoolsArgs, SortField, StakePoolProvider } from '@cardano-sdk/core'; +import { Cardano, QueryStakePoolsArgs, SortField, StakePoolProvider } from '@cardano-sdk/core'; import { CreateHttpProviderConfig, stakePoolHttpProvider } from '../../../cardano-services-client'; import { DbSyncEpochPollService, loadGenesisData } from '../../src/util'; import { @@ -1420,19 +1420,21 @@ describe('StakePoolHttpService', () => { }); describe('sort by APY', () => { it('desc order', async () => { - await expect( - provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'apy')) - ).rejects.toBeInstanceOf(ProviderError); + const response = await provider.queryStakePools(setSortCondition({ pagination }, 'desc', 'apy')); + expect(response.pageResults.length).toBeGreaterThan(0); + expect(response.pageResults[0].metrics.apy).toBeUndefined(); }); it('asc order', async () => { - await expect( - provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'apy')) - ).rejects.toBeInstanceOf(ProviderError); + const response = await provider.queryStakePools(setSortCondition({ pagination }, 'asc', 'apy')); + expect(response.pageResults.length).toBeGreaterThan(0); + expect(response.pageResults[0].metrics.apy).toBeUndefined(); }); it('with applied filters', async () => { - await expect( - provider.queryStakePools(setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'apy')) - ).rejects.toBeInstanceOf(ProviderError); + const response = await provider.queryStakePools( + setSortCondition(setFilterCondition(filterArgs, 'or'), 'asc', 'apy') + ); + expect(response.pageResults.length).toBeGreaterThan(0); + expect(response.pageResults[0].metrics.apy).toBeUndefined(); }); }); });