diff --git a/.changeset/migrate-users-getStatus-openapi.md b/.changeset/migrate-users-getStatus-openapi.md new file mode 100644 index 0000000000000..1433fcfced623 --- /dev/null +++ b/.changeset/migrate-users-getStatus-openapi.md @@ -0,0 +1,6 @@ +--- +"@rocket.chat/meteor": patch +"@rocket.chat/rest-typings": patch +--- + +Migrates the `users.getStatus` REST API endpoint from the legacy `API.v1.addRoute` pattern to the new chained `API.v1.get()` pattern with AJV response schema validation and OpenAPI documentation support. diff --git a/apps/meteor/app/api/server/v1/users.ts b/apps/meteor/app/api/server/v1/users.ts index 50c65abcd8d12..009bcd181992d 100644 --- a/apps/meteor/app/api/server/v1/users.ts +++ b/apps/meteor/app/api/server/v1/users.ts @@ -878,6 +878,51 @@ const usersEndpoints = API.v1 return API.v1.success({ suggestions }); }, + ) + .get( + 'users.getStatus', + { + authRequired: true, + response: { + 401: validateUnauthorizedErrorResponse, + 200: ajv.compile<{ + _id?: string; + status: 'online' | 'offline' | 'away' | 'busy'; + connectionStatus?: 'online' | 'offline' | 'away' | 'busy'; + message?: string; + }>({ + type: 'object', + properties: { + success: { type: 'boolean', enum: [true] }, + _id: { type: 'string' }, + status: { type: 'string', enum: ['online', 'offline', 'away', 'busy'] }, + connectionStatus: { type: 'string', enum: ['online', 'offline', 'away', 'busy'] }, + message: { type: 'string' }, + }, + required: ['success', 'status'], + additionalProperties: false, + }), + }, + }, + async function action() { + if (isUserFromParams(this.queryParams, this.userId, this.user)) { + const user: IUser | null = await Users.findOneById(this.userId); + return API.v1.success({ + _id: user?._id, + connectionStatus: (user?.statusConnection || 'offline') as 'online' | 'offline' | 'away' | 'busy', + status: (user?.status || 'offline') as 'online' | 'offline' | 'away' | 'busy', + ...(user?.statusText && { message: user.statusText }), + }); + } + + const user = await getUserFromParams(this.queryParams); + + return API.v1.success({ + _id: user._id, + status: (user.status || 'offline') as 'online' | 'offline' | 'away' | 'busy', + ...(user?.statusText && { message: user.statusText }), + }); + }, ); API.v1.addRoute( @@ -1517,38 +1562,6 @@ API.v1.addRoute( }, ); -// status: 'online' | 'offline' | 'away' | 'busy'; -// message?: string; -// _id: string; -// connectionStatus?: 'online' | 'offline' | 'away' | 'busy'; -// }; - -API.v1.addRoute( - 'users.getStatus', - { authRequired: true }, - { - async get() { - if (isUserFromParams(this.queryParams, this.userId, this.user)) { - const user: IUser | null = await Users.findOneById(this.userId); - return API.v1.success({ - _id: user?._id, - // message: user.statusText, - connectionStatus: (user?.statusConnection || 'offline') as 'online' | 'offline' | 'away' | 'busy', - status: (user?.status || 'offline') as 'online' | 'offline' | 'away' | 'busy', - }); - } - - const user = await getUserFromParams(this.queryParams); - - return API.v1.success({ - _id: user._id, - // message: user.statusText, - status: (user.status || 'offline') as 'online' | 'offline' | 'away' | 'busy', - }); - }, - }, -); - settings.watch('Rate_Limiter_Limit_RegisterUser', (value) => { const userRegisterRoute = '/api/v1/users.registerpost'; diff --git a/packages/rest-typings/src/v1/users.ts b/packages/rest-typings/src/v1/users.ts index 565620d31ba5e..c833ab1758064 100644 --- a/packages/rest-typings/src/v1/users.ts +++ b/packages/rest-typings/src/v1/users.ts @@ -318,15 +318,6 @@ export type UsersEndpoints = { POST: (params: { message?: string; status?: UserStatus; userId?: string; username?: string; user?: string }) => void; }; - '/v1/users.getStatus': { - GET: () => { - status: 'online' | 'offline' | 'away' | 'busy'; - message?: string; - _id?: string; - connectionStatus?: 'online' | 'offline' | 'away' | 'busy'; - }; - }; - '/v1/users.info': { GET: (params: UsersInfoParamsGet) => { user: IUser & { rooms?: Pick[] };