diff --git a/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts b/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts index a5109d225f..dbc5bc698c 100644 --- a/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts +++ b/apps/api/src/app/endpoints/mcp/mcp.schemas.spec.ts @@ -1,4 +1,5 @@ import { + COMMENT_MAXIMUM_LENGTH, DEFAULT_DATE_RANGE, MCP_MAX_ACTIVITIES, SEARCH_QUERY_MAXIMUM_LENGTH, @@ -92,6 +93,30 @@ describe('IMPORT_ACTIVITIES_PARAMETERS', () => { return IMPORT_ACTIVITIES_PARAMETERS.safeParse({ activities }).success; } + it(`Accepts a comment of ${COMMENT_MAXIMUM_LENGTH} characters with spaces at the start and the end`, () => { + expect( + parse([ + createActivity({ comment: ` ${'A'.repeat(COMMENT_MAXIMUM_LENGTH)} ` }) + ]) + ).toBe(true); + }); + + it(`Refuses a comment longer than ${COMMENT_MAXIMUM_LENGTH} characters`, () => { + expect( + parse([ + createActivity({ comment: 'A'.repeat(COMMENT_MAXIMUM_LENGTH + 1) }) + ]) + ).toBe(false); + }); + + it('Removes spaces at the start and the end of a comment', () => { + expect( + IMPORT_ACTIVITIES_PARAMETERS.parse({ + activities: [createActivity({ comment: ' note ' })] + }).activities[0].comment + ).toBe('note'); + }); + it('Refuses a currency in lower case', () => { expect(parse([createActivity({ currency: 'usd' })])).toBe(false); }); diff --git a/apps/api/src/app/endpoints/mcp/mcp.schemas.ts b/apps/api/src/app/endpoints/mcp/mcp.schemas.ts index dc075377d0..ce66699e91 100644 --- a/apps/api/src/app/endpoints/mcp/mcp.schemas.ts +++ b/apps/api/src/app/endpoints/mcp/mcp.schemas.ts @@ -1,5 +1,6 @@ import { DATE_RANGE_PATTERN } from '@ghostfolio/api/dtos/date-range-filter.dto'; import { + COMMENT_MAXIMUM_LENGTH, DATE_RANGES, DEFAULT_DATE_RANGE, MCP_MAX_ACCOUNTS, @@ -124,7 +125,12 @@ export const IMPORT_ACTIVITIES_PARAMETERS = z.object({ .min(1) .optional() .describe('The identifier of the account of the activity'), - comment: z.string().optional().describe('The comment of the activity'), + comment: z + .string() + .trim() + .max(COMMENT_MAXIMUM_LENGTH) + .optional() + .describe('The comment of the activity'), currency: z .string() .refine(isValidCurrencyCode)