From 840b41b8e8157a175a0759f220fb611779d57e72 Mon Sep 17 00:00:00 2001 From: Rohitgiri02 Date: Tue, 3 Mar 2026 11:57:22 +0000 Subject: [PATCH 1/2] migrated rooms.nameExists route to new chained openapi style --- apps/meteor/app/api/server/v1/rooms.ts | 55 ++++++++++++++++---------- packages/rest-typings/src/v1/rooms.ts | 23 ----------- 2 files changed, 34 insertions(+), 44 deletions(-) diff --git a/apps/meteor/app/api/server/v1/rooms.ts b/apps/meteor/app/api/server/v1/rooms.ts index 930e9cd8168cb..f32a5a7463f23 100644 --- a/apps/meteor/app/api/server/v1/rooms.ts +++ b/apps/meteor/app/api/server/v1/rooms.ts @@ -5,7 +5,6 @@ import { Messages, Rooms, Users, Uploads, Subscriptions } from '@rocket.chat/mod import type { Notifications } from '@rocket.chat/rest-typings'; import { ajv, - isGETRoomsNameExists, isRoomsImagesProps, isRoomsMuteUnmuteUserProps, isRoomsExportProps, @@ -104,23 +103,6 @@ export async function findRoomByIdOrName({ return room; } -API.v1.addRoute( - 'rooms.nameExists', - { - authRequired: true, - validateParams: isGETRoomsNameExists, - }, - { - async get() { - const { roomName } = this.queryParams; - - const room = await Rooms.findOneByName(roomName, { projection: { _id: 1 } }); - - return API.v1.success({ exists: !!room }); - }, - }, -); - const roomDeleteEndpoint = API.v1.post( 'rooms.delete', { @@ -1004,6 +986,39 @@ const isRoomsFavoriteProps = ajv.compile(RoomsFavoriteSchema); const isRoomsLeaveProps = ajv.compile(isRoomsLeavePropsSchema); export const roomEndpoints = API.v1 + .get( + 'rooms.nameExists', + { + authRequired: true, + query: ajv.compile<{ roomName: string }>({ + type: 'object', + properties: { + roomName: { type: 'string' }, + }, + required: ['roomName'], + additionalProperties: false, + }), + response: { + 200: ajv.compile<{ exists: boolean }>({ + type: 'object', + properties: { + success: { type: 'boolean', enum: [true] }, + exists: { type: 'boolean' }, + }, + required: ['success', 'exists'], + additionalProperties: false, + }), + 400: validateBadRequestErrorResponse, + 401: validateUnauthorizedErrorResponse, + }, + }, + async function action() { + const { roomName } = this.queryParams; + const room = await Rooms.findOneByName(roomName, { projection: { _id: 1 } }); + + return API.v1.success({ exists: !!room }); + }, + ) .get( 'rooms.roles', { @@ -1211,9 +1226,7 @@ export const roomEndpoints = API.v1 }, ); -type RoomEndpoints = ExtractRoutesFromAPI & - ExtractRoutesFromAPI & - ExtractRoutesFromAPI; +type RoomEndpoints = ExtractRoutesFromAPI & ExtractRoutesFromAPI; declare module '@rocket.chat/rest-typings' { // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface diff --git a/packages/rest-typings/src/v1/rooms.ts b/packages/rest-typings/src/v1/rooms.ts index 5afad26ca5817..41aeb0e105f20 100644 --- a/packages/rest-typings/src/v1/rooms.ts +++ b/packages/rest-typings/src/v1/rooms.ts @@ -441,23 +441,6 @@ const RoomsSaveRoomSettingsSchema = { export const isRoomsSaveRoomSettingsProps = ajv.compile(RoomsSaveRoomSettingsSchema); -type GETRoomsNameExists = { - roomName: string; -}; - -const GETRoomsNameExistsSchema = { - type: 'object', - properties: { - roomName: { - type: 'string', - }, - }, - required: ['roomName'], - additionalProperties: false, -}; - -export const isGETRoomsNameExists = ajv.compile(GETRoomsNameExistsSchema); - type RoomsIsMemberProps = { roomId: string } & ({ username: string } | { userId: string }); const RoomsIsMemberPropsSchema = { @@ -804,12 +787,6 @@ export type RoomsEndpoints = { POST: (params: { roomId: string; notifications: Notifications }) => void; }; - '/v1/rooms.nameExists': { - GET: (params: { roomName: string }) => { - exists: boolean; - }; - }; - '/v1/rooms.get': { GET: (params: { updatedSince: string }) => { update: IRoom[]; From c0f4f5996b2f3090f3570af3ef77d937975b9499 Mon Sep 17 00:00:00 2001 From: Rohitgiri02 Date: Tue, 3 Mar 2026 19:24:48 +0000 Subject: [PATCH 2/2] fixed api-test for rooms.nameExists route --- apps/meteor/tests/end-to-end/api/rooms.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/meteor/tests/end-to-end/api/rooms.ts b/apps/meteor/tests/end-to-end/api/rooms.ts index 8bf1bb3ab08c7..a581635c72053 100644 --- a/apps/meteor/tests/end-to-end/api/rooms.ts +++ b/apps/meteor/tests/end-to-end/api/rooms.ts @@ -690,6 +690,7 @@ describe('[Rooms]', () => { it('should return 401 unauthorized when user is not logged in', (done) => { void request .get(api('rooms.nameExists')) + .query({ roomName: 'test' }) .expect('Content-Type', 'application/json') .expect(401) .expect((res) => {