backend: Implement room roles and permissions endpoints

This commit is contained in:
juancarmore 2025-04-12 13:46:00 +02:00
parent cc2dc83401
commit 743d3d514d
3 changed files with 39 additions and 26 deletions

View File

@ -2,8 +2,8 @@ import { container } from '../config/dependency-injector.config.js';
import { Request, Response } from 'express'; import { Request, Response } from 'express';
import { LoggerService } from '../services/logger.service.js'; import { LoggerService } from '../services/logger.service.js';
import { OpenViduMeetError } from '../models/error.model.js'; import { OpenViduMeetError } from '../models/error.model.js';
import { RoomService } from '../services/room.service.js'; import { RoomService, ParticipantService } from '../services/index.js';
import { MeetRoomFilters, MeetRoomOptions } from '@typings-ce'; import { MeetRoomFilters, MeetRoomOptions, MeetRoomRoleAndPermissions, ParticipantRole } from '@typings-ce';
export const createRoom = async (req: Request, res: Response) => { export const createRoom = async (req: Request, res: Response) => {
const logger = container.get(LoggerService); const logger = container.get(LoggerService);
@ -111,20 +111,47 @@ export const bulkDeleteRooms = async (req: Request, res: Response) => {
} }
}; };
export const getParticipantRole = async (req: Request, res: Response) => { export const getRoomRolesAndPermissions = async (req: Request, res: Response) => {
const logger = container.get(LoggerService);
const participantService = container.get(ParticipantService);
const { roomId } = req.params;
logger.verbose(`Getting roles and associated permissions for room '${roomId}'`);
const moderatorPermissions = participantService.getParticipantPermissions(ParticipantRole.MODERATOR, roomId);
const publisherPermissions = participantService.getParticipantPermissions(ParticipantRole.PUBLISHER, roomId);
const rolesAndPermissions = [
{
role: ParticipantRole.MODERATOR,
permissions: moderatorPermissions
},
{
role: ParticipantRole.PUBLISHER,
permissions: publisherPermissions
}
];
res.status(200).json(rolesAndPermissions);
};
export const getRoomRoleAndPermissions = async (req: Request, res: Response) => {
const logger = container.get(LoggerService); const logger = container.get(LoggerService);
const roomService = container.get(RoomService); const roomService = container.get(RoomService);
const participantService = container.get(ParticipantService);
const { roomId } = req.params; const { roomId, secret } = req.params;
const { secret } = req.query as { secret: string };
try { try {
logger.verbose(`Getting participant role for room '${roomId}'`); logger.verbose(`Getting room role and associated permissions for room '${roomId}' and secret '${secret}'`);
const role = await roomService.getRoomSecretRole(roomId, secret); const role = await roomService.getRoomRoleBySecret(roomId, secret);
return res.status(200).json(role); const permissions = participantService.getParticipantPermissions(role, roomId);
const roleAndPermissions: MeetRoomRoleAndPermissions = {
role,
permissions
};
return res.status(200).json(roleAndPermissions);
} catch (error) { } catch (error) {
logger.error(`Error getting participant role for room '${roomId}'`); logger.error(`Error getting room role and permissions for room '${roomId}' and secret '${secret}'`);
handleError(res, error); handleError(res, error);
} }
}; };

View File

@ -98,10 +98,6 @@ const RoomRequestOptionsSchema: z.ZodType<MeetRoomOptions> = z.object({
// .default(null) // .default(null)
}); });
const GetParticipantRoleSchema = z.object({
secret: z.string()
});
const GetRoomFiltersSchema: z.ZodType<MeetRoomFilters> = z.object({ const GetRoomFiltersSchema: z.ZodType<MeetRoomFilters> = z.object({
maxItems: z.coerce maxItems: z.coerce
.number() .number()
@ -215,17 +211,6 @@ export const withValidRoomDeleteRequest = (req: Request, res: Response, next: Ne
next(); next();
}; };
export const validateGetParticipantRoleRequest = (req: Request, res: Response, next: NextFunction) => {
const { success, error, data } = GetParticipantRoleSchema.safeParse(req.query);
if (!success) {
return rejectRequest(res, error);
}
req.query = data;
next();
};
const rejectRequest = (res: Response, error: z.ZodError) => { const rejectRequest = (res: Response, error: z.ZodError) => {
const errors = error.errors.map((error) => ({ const errors = error.errors.map((error) => ({
field: error.path.join('.'), field: error.path.join('.'),

View File

@ -6,7 +6,6 @@ import {
tokenAndRoleValidator, tokenAndRoleValidator,
apiKeyValidator, apiKeyValidator,
participantTokenValidator, participantTokenValidator,
validateGetParticipantRoleRequest,
withValidRoomFiltersRequest, withValidRoomFiltersRequest,
withValidRoomOptions, withValidRoomOptions,
configureCreateRoomAuth, configureCreateRoomAuth,
@ -63,4 +62,6 @@ internalRoomRouter.put(
roomCtrl.updateRoomPreferences roomCtrl.updateRoomPreferences
); );
internalRoomRouter.get('/:roomId/participant-role', validateGetParticipantRoleRequest, roomCtrl.getParticipantRole); // Roles and permissions
internalRoomRouter.get('/:roomId/roles', roomCtrl.getRoomRolesAndPermissions);
internalRoomRouter.get('/:roomId/roles/:secret', roomCtrl.getRoomRoleAndPermissions);