diff --git a/packages/cli/src/UserManagement/controllers/AuthController.ts b/packages/cli/src/UserManagement/controllers/AuthController.ts index af7ed4495d872..55f9cae4c31d6 100644 --- a/packages/cli/src/UserManagement/controllers/AuthController.ts +++ b/packages/cli/src/UserManagement/controllers/AuthController.ts @@ -15,7 +15,7 @@ import type { LoginRequest, UserRequest } from '../../requests'; import { compareHash, sanitizeUser } from '../UserManagementHelper'; import * as config from '../../../config'; -@RestController() +@RestController('/') export class AuthController { /** * Log in a user. diff --git a/packages/cli/src/UserManagement/controllers/MeController.ts b/packages/cli/src/UserManagement/controllers/MeController.ts index 737cceb849dce..73b90b23d3fd7 100644 --- a/packages/cli/src/UserManagement/controllers/MeController.ts +++ b/packages/cli/src/UserManagement/controllers/MeController.ts @@ -17,7 +17,7 @@ export class MeController { /** * Return the logged-in user. */ - @Get() + @Get('/') async getCurrentUser(req: AuthenticatedRequest): Promise { return sanitizeUser(req.user); } @@ -25,7 +25,7 @@ export class MeController { /** * Update the logged-in user's settings, except password. */ - @Patch() + @Patch('/') async updateCurrentUser(req: MeRequest.Settings, res: Response): Promise { const { email } = req.body; if (!email) { diff --git a/packages/cli/src/UserManagement/controllers/OwnerController.ts b/packages/cli/src/UserManagement/controllers/OwnerController.ts index 53debbf8ba61f..4cff3cab03ac1 100644 --- a/packages/cli/src/UserManagement/controllers/OwnerController.ts +++ b/packages/cli/src/UserManagement/controllers/OwnerController.ts @@ -16,7 +16,7 @@ export class OwnerController { * Promote a shell into the owner of the n8n instance, * and enable `isInstanceOwnerSetUp` setting. */ - @Post() + @Post('/') async promoteOwner(req: OwnerRequest.Post, res: Response) { const { email, firstName, lastName, password } = req.body; const { id: userId } = req.user; diff --git a/packages/cli/src/UserManagement/controllers/PasswordResetController.ts b/packages/cli/src/UserManagement/controllers/PasswordResetController.ts index 57d3a34741eee..a9c58ab64f0b4 100644 --- a/packages/cli/src/UserManagement/controllers/PasswordResetController.ts +++ b/packages/cli/src/UserManagement/controllers/PasswordResetController.ts @@ -12,7 +12,7 @@ import { Db, ResponseHelper, InternalHooksManager } from '../..'; import { issueCookie } from '../auth/jwt'; import * as config from '../../../config'; -@RestController() +@RestController('/') export class PasswordResetController { /** * Send a password reset email. diff --git a/packages/cli/src/UserManagement/controllers/UserController.ts b/packages/cli/src/UserManagement/controllers/UserController.ts index c4a8d275ceb36..7aa90a117902f 100644 --- a/packages/cli/src/UserManagement/controllers/UserController.ts +++ b/packages/cli/src/UserManagement/controllers/UserController.ts @@ -27,7 +27,7 @@ export class UserController { /** * Send email invite(s) to one or multiple users and create user shell(s). */ - @Post() + @Post('/') async sendEmailInvites(req: UserRequest.Invite) { if (config.getEnv('userManagement.emails.mode') === '') { Logger.debug( @@ -288,7 +288,7 @@ export class UserController { return sanitizeUser(updatedUser); } - @Get() + @Get('/') async listUsers() { const users = await Db.collections.User.find({ relations: ['globalRole'] }); return users.map((user) => sanitizeUser(user, ['personalizationAnswers'])); diff --git a/packages/cli/src/UserManagement/decorators.ts b/packages/cli/src/UserManagement/decorators.ts index 8ceeb5c60f761..12421133fb548 100644 --- a/packages/cli/src/UserManagement/decorators.ts +++ b/packages/cli/src/UserManagement/decorators.ts @@ -16,17 +16,17 @@ const Keys = { BASE_PATH: Symbol('base_path'), } as const; -type Method = 'get' | 'post' | 'patch' | 'delete'; +type Method = 'get' | 'post' | 'patch' | 'put' | 'delete'; export const RestController = - (basePath: `/${string}` = '/'): ClassDecorator => + (basePath: `/${string}`): ClassDecorator => (target: object) => { Reflect.defineMetadata(Keys.BASE_PATH, basePath, target); }; const RouteFactory = (...methods: Method[]) => - (path: `/${string}` = '/'): MethodDecorator => + (path: `/${string}`): MethodDecorator => (target, handlerName) => { const ControllerClass = target.constructor; const routes: RouteMetadata[] = Reflect.getMetadata(Keys.ROUTES, ControllerClass) ?? []; @@ -40,6 +40,7 @@ const RouteFactory = export const Get = RouteFactory('get'); export const Post = RouteFactory('post'); export const Patch = RouteFactory('patch'); +export const Put = RouteFactory('put'); export const Delete = RouteFactory('delete'); type RequestHandler = (req: Request, res: Response) => Promise; @@ -55,7 +56,7 @@ export const registerController = ( ): void => { const instance = new ControllerClass() as unknown as Record; const routes: RouteMetadata[] = Reflect.getMetadata(Keys.ROUTES, ControllerClass); - if (routes.length > 0) { + if (routes.length) { const router = Router({ mergeParams: true }); const restEndpoint: string = config.getEnv('endpoints.rest'); const basePath: string = Reflect.getMetadata(Keys.BASE_PATH, ControllerClass); diff --git a/packages/cli/test/integration/shared/utils.ts b/packages/cli/test/integration/shared/utils.ts index cb90403feadd8..c1ca312529fd9 100644 --- a/packages/cli/test/integration/shared/utils.ts +++ b/packages/cli/test/integration/shared/utils.ts @@ -96,7 +96,7 @@ export async function initTestServer({ testServer.externalHooks = ExternalHooks(); } - const [routerEndpoints, functionEndpoints] = classifyEndpointGroups(endpointGroups); + const [routerEndpoints] = classifyEndpointGroups(endpointGroups); if (routerEndpoints.length) { const { apiRouters } = await loadPublicApiVersions(testServer.publicApiEndpoint); @@ -116,13 +116,11 @@ export async function initTestServer({ } } - if (functionEndpoints.length) { - registerController(testServer.app, MeController); - registerController(testServer.app, UserController); - registerController(testServer.app, AuthController); - registerController(testServer.app, OwnerController); - registerController(testServer.app, PasswordResetController); - } + registerController(testServer.app, MeController); + registerController(testServer.app, UserController); + registerController(testServer.app, AuthController); + registerController(testServer.app, OwnerController); + registerController(testServer.app, PasswordResetController); return testServer.app; } @@ -137,20 +135,18 @@ export function initTestTelemetry() { } /** - * Classify endpoint groups into `routerEndpoints` (newest, using `express.Router`), - * and `functionEndpoints` (legacy, namespaced inside a function). + * Identify endpoint groups as `routerEndpoints` (newest, using `express.Router`) */ const classifyEndpointGroups = (endpointGroups: string[]) => { const routerEndpoints: string[] = []; - const functionEndpoints: string[] = []; const ROUTER_GROUP = ['credentials', 'nodes', 'workflows', 'publicApi']; endpointGroups.forEach((group) => - (ROUTER_GROUP.includes(group) ? routerEndpoints : functionEndpoints).push(group), + ROUTER_GROUP.includes(group) && routerEndpoints.push(group), ); - return [routerEndpoints, functionEndpoints]; + return [routerEndpoints]; }; // ----------------------------------