diff --git a/meet-ce/backend/src/repositories/base.repository.ts b/meet-ce/backend/src/repositories/base.repository.ts index dae5a43e..ac5b8949 100644 --- a/meet-ce/backend/src/repositories/base.repository.ts +++ b/meet-ce/backend/src/repositories/base.repository.ts @@ -35,6 +35,16 @@ export abstract class BaseRepository): UpdateQuery { const $set: Record = {}; const $unset: Record = {}; + const atomicUpdatePaths = new Set(this.getAtomicUpdatePaths()); const buildUpdateQueryDeep = (input: Record, prefix = ''): void => { for (const key in input) { @@ -347,8 +358,8 @@ export abstract class BaseRepository { return MEET_ROOM_DOCUMENT_ONLY_FIELDS; } + protected override getAtomicUpdatePaths(): readonly string[] { + // Recording encoding must be treated as an atomic update path because + // it can be either a string or an object, and we want to ensure it is fully replaced rather than partially updated. + return ['config.recording.encoding']; + } + /** * Creates a new room. * URLs are stored in the database without the base URL. diff --git a/meet-ce/backend/tests/integration/api/rooms/expired-rooms-gc.test.ts b/meet-ce/backend/tests/integration/api/rooms/expired-rooms-gc.test.ts index ba4cdcc5..54c8d28f 100644 --- a/meet-ce/backend/tests/integration/api/rooms/expired-rooms-gc.test.ts +++ b/meet-ce/backend/tests/integration/api/rooms/expired-rooms-gc.test.ts @@ -98,7 +98,7 @@ describe('Expired Rooms GC Tests', () => { expect(response.body).toHaveProperty('meetingEndAction', 'delete'); // End the meeting - const { moderatorSecret } = MeetRoomHelper.extractSecretsFromRoom(room); + const { moderatorSecret } = MeetRoomHelper.extractSecretsFromRoom(room.anonymous); const moderatorToken = await generateRoomMemberToken(room.roomId, { secret: moderatorSecret }); await endMeeting(room.roomId, moderatorToken);