From 73b26f35b5bbf306b4fade61df4ad1be3ab5a7ab Mon Sep 17 00:00:00 2001 From: juancarmore Date: Sat, 16 Aug 2025 13:23:32 +0200 Subject: [PATCH] backend: enhance room filtering with optional room name parameter --- .../request-validators/room-validator.middleware.ts | 1 + backend/src/services/recording.service.ts | 1 - backend/src/services/room.service.ts | 5 +++-- .../services/storage/providers/s3/s3-storage-key.builder.ts | 5 +++-- backend/src/services/storage/storage.interface.ts | 4 +++- backend/src/services/storage/storage.service.ts | 5 +++-- typings/src/room.ts | 1 + 7 files changed, 14 insertions(+), 8 deletions(-) diff --git a/backend/src/middlewares/request-validators/room-validator.middleware.ts b/backend/src/middlewares/request-validators/room-validator.middleware.ts index a3aa719..d0b7894 100644 --- a/backend/src/middlewares/request-validators/room-validator.middleware.ts +++ b/backend/src/middlewares/request-validators/room-validator.middleware.ts @@ -142,6 +142,7 @@ const GetRoomFiltersSchema: z.ZodType = z.object({ }) .default(10), nextPageToken: z.string().optional(), + roomName: z.string().transform(sanitizeRoomName).optional(), fields: z.string().optional() }); diff --git a/backend/src/services/recording.service.ts b/backend/src/services/recording.service.ts index c13aa0b..45d12e3 100644 --- a/backend/src/services/recording.service.ts +++ b/backend/src/services/recording.service.ts @@ -398,7 +398,6 @@ export class RecordingService { }> { try { const { maxItems, nextPageToken, roomId, fields } = filters; - const response = await this.storageService.getAllRecordings(roomId, maxItems, nextPageToken); // Apply field filtering if specified diff --git a/backend/src/services/room.service.ts b/backend/src/services/room.service.ts index 9894ba5..34f0ac5 100644 --- a/backend/src/services/room.service.ts +++ b/backend/src/services/room.service.ts @@ -165,12 +165,13 @@ export class RoomService { * @returns A Promise that resolves to an array of {@link MeetRoom} objects. * @throws If there was an error retrieving the rooms. */ - async getAllMeetRooms({ maxItems, nextPageToken, fields }: MeetRoomFilters): Promise<{ + async getAllMeetRooms(filters: MeetRoomFilters): Promise<{ rooms: MeetRoom[]; isTruncated: boolean; nextPageToken?: string; }> { - const response = await this.storageService.getMeetRooms(maxItems, nextPageToken); + const { maxItems, nextPageToken, roomName, fields } = filters; + const response = await this.storageService.getMeetRooms(roomName, maxItems, nextPageToken); if (fields) { const filteredRooms = response.rooms.map((room: MeetRoom) => UtilsHelper.filterObjectFields(room, fields)); diff --git a/backend/src/services/storage/providers/s3/s3-storage-key.builder.ts b/backend/src/services/storage/providers/s3/s3-storage-key.builder.ts index 733a75e..68737c3 100644 --- a/backend/src/services/storage/providers/s3/s3-storage-key.builder.ts +++ b/backend/src/services/storage/providers/s3/s3-storage-key.builder.ts @@ -11,8 +11,9 @@ export class S3KeyBuilder implements StorageKeyBuilder { return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}/${roomId}/${roomId}.json`; } - buildAllMeetRoomsKey(): string { - return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}`; + buildAllMeetRoomsKey(roomName?: string): string { + const roomSegment = roomName ? `/${roomName}` : ''; + return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}${roomSegment}`; } buildArchivedMeetRoomKey(roomId: string): string { diff --git a/backend/src/services/storage/storage.interface.ts b/backend/src/services/storage/storage.interface.ts index 405ca10..8ce1367 100644 --- a/backend/src/services/storage/storage.interface.ts +++ b/backend/src/services/storage/storage.interface.ts @@ -122,8 +122,10 @@ export interface StorageKeyBuilder { /** * Builds the key for all meeting rooms. + * + * @param roomName - Optional name of the meeting room to filter by */ - buildAllMeetRoomsKey(): string; + buildAllMeetRoomsKey(roomName?: string): string; /** * Builds the key for archived room metadata. diff --git a/backend/src/services/storage/storage.service.ts b/backend/src/services/storage/storage.service.ts index 8432f14..57dc37d 100644 --- a/backend/src/services/storage/storage.service.ts +++ b/backend/src/services/storage/storage.service.ts @@ -203,6 +203,7 @@ export class MeetStorageService< * @throws Error if the storage operation fails or encounters an unexpected error */ async getMeetRooms( + roomName?: string, maxItems?: number, nextPageToken?: string ): Promise<{ @@ -211,9 +212,9 @@ export class MeetStorageService< nextPageToken?: string; }> { try { - const allRoomsKey = this.keyBuilder.buildAllMeetRoomsKey(); + const searchKey = this.keyBuilder.buildAllMeetRoomsKey(roomName); const { Contents, IsTruncated, NextContinuationToken } = await this.storageProvider.listObjects( - allRoomsKey, + searchKey, maxItems, nextPageToken ); diff --git a/typings/src/room.ts b/typings/src/room.ts index d707081..8f6ec0e 100644 --- a/typings/src/room.ts +++ b/typings/src/room.ts @@ -33,5 +33,6 @@ export interface MeetRoomRoleAndPermissions { export type MeetRoomFilters = { maxItems?: number; nextPageToken?: string; + roomName?: string; fields?: string; };