refactor: Add dto for /credentials/new endpoint (#13307)

This commit is contained in:
Tomi Turtiainen 2025-02-18 16:26:37 +02:00 committed by GitHub
parent 59337019c1
commit 956637b614
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 57 additions and 5 deletions

View file

@ -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);
});
});
});

View file

@ -0,0 +1,6 @@
import { z } from 'zod';
import { Z } from 'zod-class';
export class GenerateCredentialNameRequestQuery extends Z.class({
name: z.string().optional(),
}) {}

View file

@ -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';

View file

@ -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),

View file

@ -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[] }>;