Skip to content
5 changes: 5 additions & 0 deletions .changeset/refactor-presence-api-chained-pattern.md
Original file line number Diff line number Diff line change
@@ -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.
60 changes: 48 additions & 12 deletions apps/meteor/app/api/server/v1/presence.ts
Original file line number Diff line number Diff line change
@@ -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({});
},
);
Loading