import { container } from '../config/dependency-injector.config.js'; import { Request, Response } from 'express'; import { LoggerService } from '../services/logger.service.js'; import { OpenViduMeetError } from '../models/error.model.js'; import { RoomService, ParticipantService } from '../services/index.js'; import { MeetRoomFilters, MeetRoomOptions, MeetRoomRoleAndPermissions, ParticipantRole } from '@typings-ce'; export const createRoom = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const options: MeetRoomOptions = req.body; try { logger.verbose(`Creating room with options '${JSON.stringify(options)}'`); const baseUrl = `${req.protocol}://${req.get('host')}`; const room = await roomService.createMeetRoom(baseUrl, options); return res.status(200).json(room); } catch (error) { logger.error(`Error creating room with options '${JSON.stringify(options)}'`); handleError(res, error); } }; export const getRooms = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const queryParams = req.query as unknown as MeetRoomFilters; logger.verbose('Getting all rooms'); try { const { rooms, isTruncated, nextPageToken } = await roomService.getAllMeetRooms(queryParams); const maxItems = Number(queryParams.maxItems); return res.status(200).json({ rooms, pagination: { isTruncated, nextPageToken, maxItems } }); } catch (error) { logger.error('Error getting rooms'); handleError(res, error); } }; export const getRoom = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const { roomId } = req.params; const fields = req.query.fields as string | undefined; try { logger.verbose(`Getting room with id '${roomId}'`); const roomService = container.get(RoomService); const room = await roomService.getMeetRoom(roomId, fields); return res.status(200).json(room); } catch (error) { logger.error(`Error getting room with id '${roomId}'`); handleError(res, error); } }; export const deleteRoom = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const { roomId } = req.params; const { force } = req.query; const forceDelete = force === 'true'; try { logger.verbose(`Deleting room: ${roomId}`); const { deleted } = await roomService.bulkDeleteRooms([roomId], forceDelete); if (deleted.length > 0) { return res.status(204).send(); } return res.status(202).json({ message: `Room ${roomId} marked as deleted` }); } catch (error) { logger.error(`Error deleting room: ${roomId}`); handleError(res, error); } }; export const bulkDeleteRooms = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const { roomIds, force } = req.query; const forceDelete = force === 'true'; logger.info(`Deleting rooms: ${roomIds}`); try { const roomIdsArray = (roomIds as string).split(','); const { deleted, markedAsDeleted } = await roomService.bulkDeleteRooms(roomIdsArray, forceDelete); if (roomIdsArray.length === 1) { if (deleted.length > 0) { return res.status(204).send(); } return res.status(202).json({ message: `Room ${roomIds} marked as deleted` }); } return res.status(200).json({ deleted, markedAsDeleted }); } catch (error) { logger.error(`Error deleting rooms: ${error}`); handleError(res, error); } }; export const getRoomRolesAndPermissions = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const participantService = container.get(ParticipantService); const { roomId } = req.params; // Check if the room exists try { await roomService.getMeetRoom(roomId); } catch (error) { logger.error(`Error getting room '${roomId}'`); handleError(res, error); return; } 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 roomService = container.get(RoomService); const participantService = container.get(ParticipantService); const { roomId, secret } = req.params; try { logger.verbose(`Getting room role and associated permissions for room '${roomId}' and secret '${secret}'`); const role = await roomService.getRoomRoleBySecret(roomId, secret); const permissions = participantService.getParticipantPermissions(role, roomId); const roleAndPermissions: MeetRoomRoleAndPermissions = { role, permissions }; return res.status(200).json(roleAndPermissions); } catch (error) { logger.error(`Error getting room role and permissions for room '${roomId}' and secret '${secret}'`); handleError(res, error); } }; export const updateRoomPreferences = async (req: Request, res: Response) => { const logger = container.get(LoggerService); const roomService = container.get(RoomService); const roomPreferences = req.body; const { roomId } = req.params; logger.verbose(`Updating room preferences`); try { const room = await roomService.updateMeetRoomPreferences(roomId, roomPreferences); return res.status(200).json(room); } catch (error) { logger.error(`Error saving room preferences: ${error}`); handleError(res, error); } }; const handleError = (res: Response, error: OpenViduMeetError | unknown) => { const logger = container.get(LoggerService); logger.error(String(error)); if (error instanceof OpenViduMeetError) { res.status(error.statusCode).json({ name: error.name, message: error.message }); } else { res.status(500).json({ name: 'Room Error', message: 'Internal server error. Room operation failed' }); } };