diff --git a/apps/meteor/app/api/server/v1/rooms.ts b/apps/meteor/app/api/server/v1/rooms.ts index bb4278bbb70fb..c3cd185d1eea0 100644 --- a/apps/meteor/app/api/server/v1/rooms.ts +++ b/apps/meteor/app/api/server/v1/rooms.ts @@ -76,12 +76,12 @@ export async function findRoomByIdOrName({ checkedArchived = true, }: { params: - | { - roomId?: string; - } - | { - roomName?: string; - }; + | { + roomId?: string; + } + | { + roomName?: string; + }; checkedArchived?: boolean; }): Promise { if ( @@ -110,21 +110,51 @@ export async function findRoomByIdOrName({ return room; } -API.v1.addRoute( - 'rooms.nameExists', +const roomNameExistsEndpoint = API.v1.get('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 }); + //required query validation using ajv + query: ajv.compile<{ roomName: string }>({ + type: 'object', + properties: { + roomName: { + type: 'string', + description: 'The name of the room to check', + }, + }, + required: ['roomName'], + additionalProperties: false, + }), + //response validation + response: { + 200: ajv.compile<{ + exists: boolean, + success: true + }>({ + type: 'object', + properties: { + exists: { + type: 'boolean', + }, + success: { + type: 'boolean', + enum: [true], + }, + }, + required: ['exists', 'success'], + 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 }); + } ); const roomDeleteEndpoint = API.v1.post( @@ -970,21 +1000,21 @@ API.v1.addRoute( type RoomsFavorite = | { - roomId: string; - favorite: boolean; - } + roomId: string; + favorite: boolean; + } | { - roomName: string; - favorite: boolean; - }; + roomName: string; + favorite: boolean; + }; type RoomsLeave = | { - roomId: string; - } + roomId: string; + } | { - roomName: string; - }; + roomName: string; + }; const isRoomGetRolesPropsSchema = { type: 'object', @@ -1377,9 +1407,10 @@ export const roomEndpoints = API.v1 ); type RoomEndpoints = ExtractRoutesFromAPI & ExtractRoutesFromAPI & - ExtractRoutesFromAPI; + ExtractRoutesFromAPI & + ExtractRoutesFromAPI; declare module '@rocket.chat/rest-typings' { // eslint-disable-next-line @typescript-eslint/naming-convention, @typescript-eslint/no-empty-interface - interface Endpoints extends RoomEndpoints {} + interface Endpoints extends RoomEndpoints { } } diff --git a/packages/rest-typings/src/v1/rooms.ts b/packages/rest-typings/src/v1/rooms.ts index 273cc76869d7f..9b14ae4357520 100644 --- a/packages/rest-typings/src/v1/rooms.ts +++ b/packages/rest-typings/src/v1/rooms.ts @@ -915,12 +915,6 @@ export type RoomsEndpoints = { }; }; - '/v1/rooms.nameExists': { - GET: (params: { roomName: string }) => { - exists: boolean; - }; - }; - '/v1/rooms.get': { GET: (params: { updatedSince: string }) => { update: IRoom[];