diff --git a/.changeset/refactor-presence-api-chained-pattern.md b/.changeset/refactor-presence-api-chained-pattern.md new file mode 100644 index 0000000000000..cec1816fce98b --- /dev/null +++ b/.changeset/refactor-presence-api-chained-pattern.md @@ -0,0 +1,5 @@ +--- +'@rocket.chat/meteor': minor +--- + +Migrates `presence.getConnections` and `presence.enableBroadcast` REST API endpoints from legacy `addRoute` pattern to the new chained `.get()`/`.post()` API pattern with typed response schemas. diff --git a/apps/meteor/app/api/server/v1/presence.ts b/apps/meteor/app/api/server/v1/presence.ts index 019137569f610..28e83ecb68f80 100644 --- a/apps/meteor/app/api/server/v1/presence.ts +++ b/apps/meteor/app/api/server/v1/presence.ts @@ -1,27 +1,63 @@ import { Presence } from '@rocket.chat/core-services'; +import { ajv, validateUnauthorizedErrorResponse, validateForbiddenErrorResponse } from '@rocket.chat/rest-typings'; import { API } from '../api'; -API.v1.addRoute( +API.v1.get( 'presence.getConnections', - { authRequired: true, permissionsRequired: ['manage-user-status'] }, { - async get() { - const result = await Presence.getConnectionCount(); - - return API.v1.success(result); + authRequired: true, + permissionsRequired: ['manage-user-status'], + response: { + 200: ajv.compile<{ current: number; max: number; success: true }>({ + type: 'object', + properties: { + current: { type: 'number' }, + max: { type: 'number' }, + success: { + type: 'boolean', + enum: [true], + }, + }, + required: ['current', 'max', 'success'], + additionalProperties: false, + }), + 401: validateUnauthorizedErrorResponse, + 403: validateForbiddenErrorResponse, }, }, + async function action() { + const result = await Presence.getConnectionCount(); + + return API.v1.success(result); + }, ); -API.v1.addRoute( +API.v1.post( 'presence.enableBroadcast', - { authRequired: true, permissionsRequired: ['manage-user-status'], twoFactorRequired: true }, { - async post() { - await Presence.toggleBroadcast(true); - - return API.v1.success(); + authRequired: true, + permissionsRequired: ['manage-user-status'], + twoFactorRequired: true, + response: { + 200: ajv.compile<{ success: true }>({ + type: 'object', + properties: { + success: { + type: 'boolean', + enum: [true], + }, + }, + required: ['success'], + additionalProperties: false, + }), + 401: validateUnauthorizedErrorResponse, + 403: validateForbiddenErrorResponse, }, }, + async function action() { + await Presence.toggleBroadcast(true); + + return API.v1.success({}); + }, );