diff --git a/meet-ce/backend/src/models/zod-schemas/room.schema.ts b/meet-ce/backend/src/models/zod-schemas/room.schema.ts index c3c1720a..9e9c6c45 100644 --- a/meet-ce/backend/src/models/zod-schemas/room.schema.ts +++ b/meet-ce/backend/src/models/zod-schemas/room.schema.ts @@ -92,7 +92,11 @@ 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 +/** + * Schema for updating room config (partial updates allowed) + * Used when updating an existing room's config - missing fields keep their current values + */ +const UpdateRoomConfigSchema: z.ZodType> = z .object({ recording: RecordingConfigSchema.optional(), chat: ChatConfigSchema.optional(), @@ -100,7 +104,7 @@ const RoomConfigSchema: z.ZodType> = z e2ee: E2EEConfigSchema.optional() // appearance: AppearanceConfigSchema, }) - .transform((data) => { + .transform((data: Partial) => { // Automatically disable recording when E2EE is enabled if (data.e2ee?.enabled && data.recording?.enabled) { data.recording = { @@ -112,6 +116,30 @@ const RoomConfigSchema: z.ZodType> = z return data; }); +/** + * Schema for creating room config (applies defaults for missing fields) + * Used when creating a new room - missing fields get default values + */ +const CreateRoomConfigSchema = z + .object({ + 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) { + data.recording = { + ...data.recording, + enabled: false + }; + } + + return data as MeetRoomConfig; + }); + const RoomDeletionPolicyWithMeetingSchema: z.ZodType = z.nativeEnum( MeetRoomDeletionPolicyWithMeeting ); @@ -163,7 +191,7 @@ export const RoomOptionsSchema: z.ZodType = z.object({ path: ['withRecordings'] } ), - config: RoomConfigSchema.optional().default({ + config: CreateRoomConfigSchema.optional().default({ recording: { enabled: true, allowAccessTo: MeetRecordingAccess.ADMIN_MODERATOR_SPEAKER }, chat: { enabled: true }, virtualBackground: { enabled: true }, @@ -241,7 +269,7 @@ export const BulkDeleteRoomsReqSchema = z.object({ }); export const UpdateRoomConfigReqSchema = z.object({ - config: RoomConfigSchema + config: UpdateRoomConfigSchema }); export const UpdateRoomStatusReqSchema = z.object({ diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8632ecc3..3857bb52 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,6 +50,9 @@ importers: '@livekit/track-processors': specifier: ^0.7.0 version: 0.7.0(@types/dom-mediacapture-transform@0.1.11)(livekit-client@2.16.1(@types/dom-mediacapture-record@1.0.22)) + '@types/dom-mediacapture-transform': + specifier: 0.1.11 + version: 0.1.11 autolinker: specifier: ^4.0.0 version: 4.1.5