From bb3ae9be1da26293f5d7838f92db37d120650de0 Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sat, 29 Aug 2026 09:24:23 +0200 Subject: [PATCH] Extend accounts endpoint by accounts, assetClasses and tags filters --- .../app/portfolio/portfolio.service.spec.ts | 14 +++--- .../src/app/portfolio/portfolio.service.ts | 50 +++++++++---------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/apps/api/src/app/portfolio/portfolio.service.spec.ts b/apps/api/src/app/portfolio/portfolio.service.spec.ts index 703e0f1ed..a50d8ad93 100644 --- a/apps/api/src/app/portfolio/portfolio.service.spec.ts +++ b/apps/api/src/app/portfolio/portfolio.service.spec.ts @@ -118,10 +118,12 @@ describe('PortfolioService', () => { describe('getAccounts', () => { const tagId = 'd6bf8b4a-8ef9-4b3f-9e2c-0a1b2c3d4e5f'; + const whereTagsOfActivity = { some: { OR: [{ id: tagId }] } }; + const whereActivityOfTag = { OR: [ - { tags: { some: { OR: [{ id: tagId }] } } }, - { account: { tags: { some: { OR: [{ tagId }] } } } } + { account: { tags: { some: { OR: [{ tagId }] } } } }, + { tags: whereTagsOfActivity } ] }; @@ -184,8 +186,8 @@ describe('PortfolioService', () => { expect(where.AND).toEqual([ { OR: [ - { tags: { some: { OR: [{ tagId }] } } }, - { activities: { some: whereActivityOfTag } } + { activities: { some: { tags: whereTagsOfActivity } } }, + { tags: { some: { OR: [{ tagId }] } } } ] } ]); @@ -234,8 +236,8 @@ describe('PortfolioService', () => { { activities: { some: whereActivityOfAssetClass } }, { OR: [ - { tags: { some: { OR: [{ tagId }] } } }, - { activities: { some: whereActivityOfTag } } + { activities: { some: { tags: whereTagsOfActivity } } }, + { tags: { some: { OR: [{ tagId }] } } } ] } ]); diff --git a/apps/api/src/app/portfolio/portfolio.service.ts b/apps/api/src/app/portfolio/portfolio.service.ts index 69e70a9e6..5e1736dbe 100644 --- a/apps/api/src/app/portfolio/portfolio.service.ts +++ b/apps/api/src/app/portfolio/portfolio.service.ts @@ -143,7 +143,7 @@ export class PortfolioService { const where: Prisma.AccountWhereInput = { userId }; const { - ACCOUNT: [filterByAccount] = [], + ACCOUNT: filtersByAccount = [], ASSET_CLASS: filtersByAssetClass = [], DATA_SOURCE: [filterByDataSource] = [], SYMBOL: [filterBySymbol] = [], @@ -152,24 +152,28 @@ export class PortfolioService { return type; }); - if (filterByAccount) { - where.id = filterByAccount.id; + if (filtersByAccount.length > 0) { + where.id = { + in: filtersByAccount.map(({ id }) => { + return id; + }) + }; } const whereAccountConditions: Prisma.AccountWhereInput[] = []; const whereActivityConditions: Prisma.OrderWhereInput[] = []; if (filtersByAssetClass.length > 0) { + const whereAssetClassConditions = filtersByAssetClass.map(({ id }) => { + return { assetClass: AssetClass[id] }; + }); + const whereActivityOfAssetClass: Prisma.OrderWhereInput = { SymbolProfile: { OR: [ { AND: [ - { - OR: filtersByAssetClass.map(({ id }) => { - return { assetClass: AssetClass[id] }; - }) - }, + { OR: whereAssetClassConditions }, { OR: [ { assetProfileOverrides: { is: null } }, @@ -179,11 +183,7 @@ export class PortfolioService { ] }, { - assetProfileOverrides: { - OR: filtersByAssetClass.map(({ id }) => { - return { assetClass: AssetClass[id] }; - }) - } + assetProfileOverrides: { OR: whereAssetClassConditions } } ] } @@ -222,25 +222,25 @@ export class PortfolioService { } }; + const whereTagsOfActivity: Prisma.TagListRelationFilter = { + some: { + OR: filtersByTag.map(({ id }) => { + return { id }; + }) + } + }; + const whereActivityOfTag: Prisma.OrderWhereInput = { OR: [ - { - tags: { - some: { - OR: filtersByTag.map(({ id }) => { - return { id }; - }) - } - } - }, - { account: { tags: whereTagsOfAccount } } + { account: { tags: whereTagsOfAccount } }, + { tags: whereTagsOfActivity } ] }; whereAccountConditions.push({ OR: [ - { tags: whereTagsOfAccount }, - { activities: { some: whereActivityOfTag } } + { activities: { some: { tags: whereTagsOfActivity } } }, + { tags: whereTagsOfAccount } ] });