From 496591695ad1e3f76061cba8c19b3183db142841 Mon Sep 17 00:00:00 2001 From: juancarmore Date: Tue, 18 Nov 2025 14:19:56 +0100 Subject: [PATCH] backend: update room configuration schemas for partial updates and default values --- .../request-validators/room-validator.middleware.ts | 13 ++++++++----- .../backend/src/repositories/schemas/room.schema.ts | 12 +++++------- meet-ce/backend/src/services/room.service.ts | 13 +++++++++---- meet-ce/typings/src/room-config.ts | 2 +- meet-ce/typings/src/room.ts | 2 +- 5 files changed, 24 insertions(+), 18 deletions(-) diff --git a/meet-ce/backend/src/middlewares/request-validators/room-validator.middleware.ts b/meet-ce/backend/src/middlewares/request-validators/room-validator.middleware.ts index 460fb9c6..3629bbeb 100644 --- a/meet-ce/backend/src/middlewares/request-validators/room-validator.middleware.ts +++ b/meet-ce/backend/src/middlewares/request-validators/room-validator.middleware.ts @@ -112,17 +112,20 @@ export const AppearanceConfigSchema: z.ZodType = z.object( themes: z.array(RoomThemeSchema).length(1, 'There must be exactly one theme defined') }); -const RoomConfigSchema: z.ZodType = z +const RoomConfigSchema: z.ZodType> = z .object({ - recording: RecordingConfigSchema, - chat: ChatConfigSchema, - virtualBackground: VirtualBackgroundConfigSchema, + recording: RecordingConfigSchema.optional().default({ + enabled: true, + allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER + }), + chat: ChatConfigSchema.optional().default({ enabled: true }), + virtualBackground: VirtualBackgroundConfigSchema.optional().default({ enabled: true }), e2ee: E2EEConfigSchema.optional().default({ enabled: false }) // appearance: AppearanceConfigSchema, }) .transform((data) => { // Automatically disable recording when E2EE is enabled - if (data.e2ee?.enabled && data.recording.enabled) { + if (data.e2ee.enabled && data.recording.enabled) { return { ...data, recording: { diff --git a/meet-ce/backend/src/repositories/schemas/room.schema.ts b/meet-ce/backend/src/repositories/schemas/room.schema.ts index c2dc9d1c..3c3c36de 100644 --- a/meet-ce/backend/src/repositories/schemas/room.schema.ts +++ b/meet-ce/backend/src/repositories/schemas/room.schema.ts @@ -46,8 +46,7 @@ const MeetRecordingConfigSchema = new Schema( { enabled: { type: Boolean, - required: true, - default: false + required: true }, allowAccessTo: { type: String, @@ -65,8 +64,7 @@ const MeetChatConfigSchema = new Schema( { enabled: { type: Boolean, - required: true, - default: true + required: true } }, { _id: false } @@ -79,8 +77,7 @@ const MeetVirtualBackgroundConfigSchema = new Schema( { enabled: { type: Boolean, - required: true, - default: true + required: true } }, { _id: false } @@ -119,7 +116,8 @@ const MeetRoomConfigSchema = new Schema( }, e2ee: { type: MeetE2EEConfigSchema, - required: false + required: true, + default: { enabled: false } } }, { _id: false } diff --git a/meet-ce/backend/src/services/room.service.ts b/meet-ce/backend/src/services/room.service.ts index 720a7eb3..641aa719 100644 --- a/meet-ce/backend/src/services/room.service.ts +++ b/meet-ce/backend/src/services/room.service.ts @@ -86,7 +86,7 @@ export class RoomService { // maxParticipants, autoDeletionDate, autoDeletionPolicy, - config: config!, + config: config! as MeetRoomConfig, moderatorUrl: `/room/${roomId}?secret=${secureUid(10)}`, speakerUrl: `/room/${roomId}?secret=${secureUid(10)}`, status: MeetRoomStatus.OPEN, @@ -129,12 +129,13 @@ export class RoomService { /** * Updates the configuration of a specific meeting room. + * Supports partial updates - only provided fields will be updated. * * @param roomId - The unique identifier of the meeting room to update - * @param config - The new config to apply to the meeting room + * @param config - Partial config with the fields to update * @returns A Promise that resolves to the updated MeetRoom object */ - async updateMeetRoomConfig(roomId: string, config: MeetRoomConfig): Promise { + async updateMeetRoomConfig(roomId: string, config: Partial): Promise { const room = await this.getMeetRoom(roomId); if (room.status === MeetRoomStatus.ACTIVE_MEETING) { @@ -142,7 +143,11 @@ export class RoomService { throw errorRoomActiveMeeting(roomId); } - room.config = config; + // Merge the partial config with the existing config + room.config = { + ...room.config, + ...config + }; await this.roomRepository.update(room); // Send signal to frontend diff --git a/meet-ce/typings/src/room-config.ts b/meet-ce/typings/src/room-config.ts index f0f4b7b9..448643bc 100644 --- a/meet-ce/typings/src/room-config.ts +++ b/meet-ce/typings/src/room-config.ts @@ -5,7 +5,7 @@ export interface MeetRoomConfig { chat: MeetChatConfig; recording: MeetRecordingConfig; virtualBackground: MeetVirtualBackgroundConfig; - e2ee?: MeetE2EEConfig; + e2ee: MeetE2EEConfig; // appearance: MeetAppearanceConfig; } diff --git a/meet-ce/typings/src/room.ts b/meet-ce/typings/src/room.ts index 0467f514..5073e20a 100644 --- a/meet-ce/typings/src/room.ts +++ b/meet-ce/typings/src/room.ts @@ -8,7 +8,7 @@ export interface MeetRoomOptions { roomName?: string; autoDeletionDate?: number; autoDeletionPolicy?: MeetRoomAutoDeletionPolicy; - config?: MeetRoomConfig; + config?: Partial; // maxParticipants?: number | null; }