diff --git a/packages/@n8n/api-types/src/dto/credentials/__tests__/generate-credential-name.dto.test.ts b/packages/@n8n/api-types/src/dto/credentials/__tests__/generate-credential-name.dto.test.ts new file mode 100644 index 0000000000..186821bd0c --- /dev/null +++ b/packages/@n8n/api-types/src/dto/credentials/__tests__/generate-credential-name.dto.test.ts @@ -0,0 +1,39 @@ +import { GenerateCredentialNameRequestQuery } from '../generate-credential-name.dto'; + +describe('GenerateCredentialNameRequestQuery', () => { + describe('should pass validation', () => { + it('with empty object', () => { + const data = {}; + + const result = GenerateCredentialNameRequestQuery.safeParse(data); + + expect(result.success).toBe(true); + expect(result.data?.name).toBeUndefined(); + }); + + it('with valid name', () => { + const data = { name: 'My Credential' }; + + const result = GenerateCredentialNameRequestQuery.safeParse(data); + + expect(result.success).toBe(true); + expect(result.data?.name).toBe('My Credential'); + }); + }); + + describe('should fail validation', () => { + test.each([ + { field: 'name', value: 123 }, + { field: 'name', value: true }, + { field: 'name', value: {} }, + { field: 'name', value: [] }, + ])('with invalid value $value for $field', ({ field, value }) => { + const data = { [field]: value }; + + const result = GenerateCredentialNameRequestQuery.safeParse(data); + + expect(result.success).toBe(false); + expect(result.error?.issues[0].path[0]).toBe(field); + }); + }); +}); diff --git a/packages/@n8n/api-types/src/dto/credentials/generate-credential-name.dto.ts b/packages/@n8n/api-types/src/dto/credentials/generate-credential-name.dto.ts new file mode 100644 index 0000000000..14842105de --- /dev/null +++ b/packages/@n8n/api-types/src/dto/credentials/generate-credential-name.dto.ts @@ -0,0 +1,6 @@ +import { z } from 'zod'; +import { Z } from 'zod-class'; + +export class GenerateCredentialNameRequestQuery extends Z.class({ + name: z.string().optional(), +}) {} diff --git a/packages/@n8n/api-types/src/dto/index.ts b/packages/@n8n/api-types/src/dto/index.ts index ad695f0bb2..d6eab70102 100644 --- a/packages/@n8n/api-types/src/dto/index.ts +++ b/packages/@n8n/api-types/src/dto/index.ts @@ -42,6 +42,7 @@ export { PushWorkFolderRequestDto } from './source-control/push-work-folder-requ export { VariableListRequestDto } from './variables/variables-list-request.dto'; export { CredentialsGetOneRequestQuery } from './credentials/credentials-get-one-request.dto'; export { CredentialsGetManyRequestQuery } from './credentials/credentials-get-many-request.dto'; +export { GenerateCredentialNameRequestQuery } from './credentials/generate-credential-name.dto'; export { ImportWorkflowFromUrlDto } from './workflows/import-workflow-from-url.dto'; export { ManualRunQueryDto } from './workflows/manual-run-query.dto'; diff --git a/packages/cli/src/credentials/credentials.controller.ts b/packages/cli/src/credentials/credentials.controller.ts index e6fc3d141a..7a319fec72 100644 --- a/packages/cli/src/credentials/credentials.controller.ts +++ b/packages/cli/src/credentials/credentials.controller.ts @@ -1,4 +1,8 @@ -import { CredentialsGetManyRequestQuery, CredentialsGetOneRequestQuery } from '@n8n/api-types'; +import { + CredentialsGetManyRequestQuery, + CredentialsGetOneRequestQuery, + GenerateCredentialNameRequestQuery, +} from '@n8n/api-types'; import { GlobalConfig } from '@n8n/config'; // eslint-disable-next-line n8n-local-rules/misplaced-n8n-typeorm-import import { In } from '@n8n/typeorm'; @@ -79,8 +83,12 @@ export class CredentialsController { } @Get('/new') - async generateUniqueName(req: CredentialRequest.NewName) { - const requestedName = req.query.name ?? this.globalConfig.credentials.defaultName; + async generateUniqueName( + _req: unknown, + _res: unknown, + @Query query: GenerateCredentialNameRequestQuery, + ) { + const requestedName = query.name ?? this.globalConfig.credentials.defaultName; return { name: await this.namingService.getUniqueCredentialName(requestedName), diff --git a/packages/cli/src/requests.ts b/packages/cli/src/requests.ts index f57b8b858f..764c0a55b9 100644 --- a/packages/cli/src/requests.ts +++ b/packages/cli/src/requests.ts @@ -161,8 +161,6 @@ export declare namespace CredentialRequest { type Update = AuthenticatedRequest<{ credentialId: string }, {}, CredentialProperties>; - type NewName = AuthenticatedRequest<{}, {}, {}, { name?: string }>; - type Test = AuthenticatedRequest<{}, {}, INodeCredentialTestRequest>; type Share = AuthenticatedRequest<{ credentialId: string }, {}, { shareWithIds: string[] }>;