From 393b135ffa5cb9d1de5ab1ea87b81306469935ee Mon Sep 17 00:00:00 2001 From: Thomas Kaul <4159106+dtslvr@users.noreply.github.com> Date: Sun, 11 Oct 2026 18:53:03 +0200 Subject: [PATCH] Fix import of activities with Ghostfolio AI --- apps/api/src/app/endpoints/ai/ai.controller.spec.ts | 6 +++--- apps/api/src/app/endpoints/ai/ai.controller.ts | 6 +++--- .../import-activities-dialog.component.ts | 2 +- libs/common/src/lib/config.ts | 1 + 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/api/src/app/endpoints/ai/ai.controller.spec.ts b/apps/api/src/app/endpoints/ai/ai.controller.spec.ts index 2880c1aa85..0f9550f693 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.spec.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.spec.ts @@ -7,7 +7,7 @@ import { AI_ACTIVITIES_TIMEOUT, AI_MAX_ACTIVITIES, THROTTLE_AI_ACTIVITIES_LIMIT, - THROTTLE_DAILY_TTL + THROTTLE_AI_ACTIVITIES_TTL } from '@ghostfolio/common/config'; import { permissions } from '@ghostfolio/common/permissions'; import type { RequestWithUser } from '@ghostfolio/common/types'; @@ -93,7 +93,7 @@ describe('AiController', () => { }); describe('getActivitiesFromFile', () => { - it('Requires the permission and limits the requests of each user per day', () => { + it('Requires the permission and limits the requests of each user per week', () => { expect(getMetadataOfMethod(HAS_PERMISSION_KEY)).toBe( permissions.importActivitiesWithAi ); @@ -110,7 +110,7 @@ describe('AiController', () => { ); expect(getMetadataOfMethod(`${THROTTLER_TTL}default`)).toBe( - THROTTLE_DAILY_TTL + THROTTLE_AI_ACTIVITIES_TTL ); expect( diff --git a/apps/api/src/app/endpoints/ai/ai.controller.ts b/apps/api/src/app/endpoints/ai/ai.controller.ts index 49d26b3427..4f0f2bb845 100644 --- a/apps/api/src/app/endpoints/ai/ai.controller.ts +++ b/apps/api/src/app/endpoints/ai/ai.controller.ts @@ -12,7 +12,7 @@ import { AI_ACTIVITIES_TIMEOUT, AI_MAX_ACTIVITIES, THROTTLE_AI_ACTIVITIES_LIMIT, - THROTTLE_DAILY_TTL + THROTTLE_AI_ACTIVITIES_TTL } from '@ghostfolio/common/config'; import { AiActivitiesResponse, @@ -67,7 +67,7 @@ export class AiController { /** * Reads the activities of a CSV, JPEG, PDF or PNG file with Ghostfolio AI, * without saving anything. The client imports the activities which the user - * selects with POST api/v1/import. The daily limit applies to each user + * selects with POST api/v1/import. The weekly limit applies to each user * instead of each IP address. The models stop if the client closes the * request before the response or at the timeout. An error whose message is * written for the caller gives the status 400 with this message, the @@ -82,7 +82,7 @@ export class AiController { return user.id; }, limit: THROTTLE_AI_ACTIVITIES_LIMIT, - ttl: THROTTLE_DAILY_TTL + ttl: THROTTLE_AI_ACTIVITIES_TTL } }) @UseGuards(AuthGuard('jwt'), HasPermissionGuard, CustomThrottlerGuard) diff --git a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts index 644fe18d5a..a40ed5096e 100644 --- a/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts +++ b/apps/client/src/app/pages/portfolio/activities/import-activities-dialog/import-activities-dialog.component.ts @@ -371,7 +371,7 @@ export class GfImportActivitiesDialogComponent { /** * Gives the error message of a file which the server rejects, as a rejected - * file counts towards the daily limit of Ghostfolio AI + * file counts towards the weekly limit of Ghostfolio AI */ private async getErrorMessageOfFileForGhostfolioAi({ file, diff --git a/libs/common/src/lib/config.ts b/libs/common/src/lib/config.ts index f8c834afbd..4ecff6db60 100644 --- a/libs/common/src/lib/config.ts +++ b/libs/common/src/lib/config.ts @@ -420,6 +420,7 @@ export const TAG_IDS_SYSTEM = [ ]; export const THROTTLE_AI_ACTIVITIES_LIMIT = 25; +export const THROTTLE_AI_ACTIVITIES_TTL = ms('1 week'); export const THROTTLE_DAILY_KEY = 'daily'; export const THROTTLE_DAILY_TTL = ms('1 day'); export const THROTTLE_DEFAULT_LIMIT = 10;