backend: enhance room filtering with optional room name parameter

This commit is contained in:
juancarmore 2025-08-16 13:23:32 +02:00
parent cea5421012
commit 73b26f35b5
7 changed files with 14 additions and 8 deletions

View File

@ -142,6 +142,7 @@ const GetRoomFiltersSchema: z.ZodType<MeetRoomFilters> = z.object({
}) })
.default(10), .default(10),
nextPageToken: z.string().optional(), nextPageToken: z.string().optional(),
roomName: z.string().transform(sanitizeRoomName).optional(),
fields: z.string().optional() fields: z.string().optional()
}); });

View File

@ -398,7 +398,6 @@ export class RecordingService {
}> { }> {
try { try {
const { maxItems, nextPageToken, roomId, fields } = filters; const { maxItems, nextPageToken, roomId, fields } = filters;
const response = await this.storageService.getAllRecordings(roomId, maxItems, nextPageToken); const response = await this.storageService.getAllRecordings(roomId, maxItems, nextPageToken);
// Apply field filtering if specified // Apply field filtering if specified

View File

@ -165,12 +165,13 @@ export class RoomService {
* @returns A Promise that resolves to an array of {@link MeetRoom} objects. * @returns A Promise that resolves to an array of {@link MeetRoom} objects.
* @throws If there was an error retrieving the rooms. * @throws If there was an error retrieving the rooms.
*/ */
async getAllMeetRooms({ maxItems, nextPageToken, fields }: MeetRoomFilters): Promise<{ async getAllMeetRooms(filters: MeetRoomFilters): Promise<{
rooms: MeetRoom[]; rooms: MeetRoom[];
isTruncated: boolean; isTruncated: boolean;
nextPageToken?: string; 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) { if (fields) {
const filteredRooms = response.rooms.map((room: MeetRoom) => UtilsHelper.filterObjectFields(room, fields)); const filteredRooms = response.rooms.map((room: MeetRoom) => UtilsHelper.filterObjectFields(room, fields));

View File

@ -11,8 +11,9 @@ export class S3KeyBuilder implements StorageKeyBuilder {
return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}/${roomId}/${roomId}.json`; return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}/${roomId}/${roomId}.json`;
} }
buildAllMeetRoomsKey(): string { buildAllMeetRoomsKey(roomName?: string): string {
return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}`; const roomSegment = roomName ? `/${roomName}` : '';
return `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}${roomSegment}`;
} }
buildArchivedMeetRoomKey(roomId: string): string { buildArchivedMeetRoomKey(roomId: string): string {

View File

@ -122,8 +122,10 @@ export interface StorageKeyBuilder {
/** /**
* Builds the key for all meeting rooms. * 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. * Builds the key for archived room metadata.

View File

@ -203,6 +203,7 @@ export class MeetStorageService<
* @throws Error if the storage operation fails or encounters an unexpected error * @throws Error if the storage operation fails or encounters an unexpected error
*/ */
async getMeetRooms( async getMeetRooms(
roomName?: string,
maxItems?: number, maxItems?: number,
nextPageToken?: string nextPageToken?: string
): Promise<{ ): Promise<{
@ -211,9 +212,9 @@ export class MeetStorageService<
nextPageToken?: string; nextPageToken?: string;
}> { }> {
try { try {
const allRoomsKey = this.keyBuilder.buildAllMeetRoomsKey(); const searchKey = this.keyBuilder.buildAllMeetRoomsKey(roomName);
const { Contents, IsTruncated, NextContinuationToken } = await this.storageProvider.listObjects( const { Contents, IsTruncated, NextContinuationToken } = await this.storageProvider.listObjects(
allRoomsKey, searchKey,
maxItems, maxItems,
nextPageToken nextPageToken
); );

View File

@ -33,5 +33,6 @@ export interface MeetRoomRoleAndPermissions {
export type MeetRoomFilters = { export type MeetRoomFilters = {
maxItems?: number; maxItems?: number;
nextPageToken?: string; nextPageToken?: string;
roomName?: string;
fields?: string; fields?: string;
}; };