From 172e8edcfd9575cb3f181801a2a9053545593004 Mon Sep 17 00:00:00 2001 From: Carlos Santos <4a.santos@gmail.com> Date: Wed, 28 May 2025 11:46:13 +0200 Subject: [PATCH] backend: update type parameters for storage interfaces and methods to improve clarity and consistency --- .../storage/providers/s3-storage.provider.ts | 19 ++-- .../src/services/storage/storage.interface.ts | 22 ++--- .../src/services/storage/storage.service.ts | 94 ++++++++++++++----- 3 files changed, 90 insertions(+), 45 deletions(-) diff --git a/backend/src/services/storage/providers/s3-storage.provider.ts b/backend/src/services/storage/providers/s3-storage.provider.ts index 28d474a..8c4526b 100644 --- a/backend/src/services/storage/providers/s3-storage.provider.ts +++ b/backend/src/services/storage/providers/s3-storage.provider.ts @@ -1,5 +1,5 @@ import { PutObjectCommandOutput } from '@aws-sdk/client-s3'; -import { GlobalPreferences, MeetRoom } from '@typings-ce'; +import { GlobalPreferences, MeetRecordingInfo, MeetRoom } from '@typings-ce'; import { inject, injectable } from 'inversify'; import INTERNAL_CONFIG from '../../../config/internal-config.js'; import { OpenViduMeetError, RedisKeyName } from '../../../models/index.js'; @@ -132,23 +132,23 @@ export class S3StorageProvider { - const { roomId } = ovRoom; + async saveMeetRoom(meetRoom: R): Promise { + const { roomId } = meetRoom; const s3Path = `${INTERNAL_CONFIG.S3_ROOMS_PREFIX}/${roomId}/${roomId}.json`; - const redisPayload = JSON.stringify(ovRoom); + const redisPayload = JSON.stringify(meetRoom); const redisKey = RedisKeyName.ROOM + roomId; const [s3Result, redisResult] = await Promise.allSettled([ - this.s3Service.saveObject(s3Path, ovRoom), + this.s3Service.saveObject(s3Path, meetRoom), this.redisService.set(redisKey, redisPayload, false) ]); if (s3Result.status === 'fulfilled' && redisResult.status === 'fulfilled') { - return ovRoom; + return meetRoom; } // Rollback any changes made by the successful operation @@ -309,10 +309,9 @@ export class S3StorageProvider { @@ -446,7 +445,7 @@ export class S3StorageProvider { +export interface StorageProvider { /** * Initializes the storage with default preferences if they are not already set. * * @param defaultPreferences - The default preferences to initialize with. * @returns A promise that resolves when the initialization is complete. */ - initialize(defaultPreferences: T): Promise; + initialize(defaultPreferences: GPrefs): Promise; /** * Retrieves the global preferences of Openvidu Meet. * * @returns A promise that resolves to the global preferences, or null if not set. */ - getGlobalPreferences(): Promise; + getGlobalPreferences(): Promise; /** * Saves the given preferences. @@ -33,7 +33,7 @@ export interface StorageProvider; + saveGlobalPreferences(preferences: GPrefs): Promise; /** * @@ -50,7 +50,7 @@ export interface StorageProvider; @@ -61,15 +61,15 @@ export interface StorageProvider; + getMeetRoom(roomId: string): Promise; /** * Saves the OpenVidu Meet Room. * - * @param ovRoom - The OpenVidu Room to save. + * @param meetRoom - The OpenVidu Room to save. * @returns A promise that resolves to the saved **/ - saveMeetRoom(ovRoom: R): Promise; + saveMeetRoom(meetRoom: MRoom): Promise; /** * Deletes OpenVidu Meet Rooms. @@ -86,7 +86,7 @@ export interface StorageProvider | null>; + getArchivedRoomMetadata(roomId: string): Promise | null>; /** * Archives the metadata for a specific room. diff --git a/backend/src/services/storage/storage.service.ts b/backend/src/services/storage/storage.service.ts index 98639ab..6cdf40a 100644 --- a/backend/src/services/storage/storage.service.ts +++ b/backend/src/services/storage/storage.service.ts @@ -12,11 +12,14 @@ import { LoggerService, MutexService, StorageFactory, StorageProvider } from '.. * This service provides an abstraction layer over the underlying storage implementation, * handling initialization, retrieval, and persistence of global preferences and room data. * - * @typeParam G - Type for global preferences, extends GlobalPreferences - * @typeParam R - Type for room data, extends MeetRoom + * @template GPrefs - Type for global preferences, extends GlobalPreferences + * @template MRoom - Type for room data, extends MeetRoom */ @injectable() -export class MeetStorageService { +export class MeetStorageService< + GPrefs extends GlobalPreferences = GlobalPreferences, + MRoom extends MeetRoom = MeetRoom +> { protected storageProvider: StorageProvider; constructor( @inject(LoggerService) protected logger: LoggerService, @@ -28,7 +31,7 @@ export class MeetStorageService} Default global preferences. + * @returns {Promise} Default global preferences. */ async initializeGlobalPreferences(): Promise { try { @@ -53,12 +56,12 @@ export class MeetStorageService} + * @returns {Promise} */ - async getGlobalPreferences(): Promise { + async getGlobalPreferences(): Promise { let preferences = await this.storageProvider.getGlobalPreferences(); - if (preferences) return preferences as G; + if (preferences) return preferences as GPrefs; await this.initializeGlobalPreferences(); preferences = await this.storageProvider.getGlobalPreferences(); @@ -68,34 +71,50 @@ export class MeetStorageService} + * Saves the global preferences to the storage provider. + * @param {GPrefs} preferences + * @returns {Promise} */ - async saveGlobalPreferences(preferences: G): Promise { + async saveGlobalPreferences(preferences: GPrefs): Promise { this.logger.info('Saving global preferences'); - return this.storageProvider.saveGlobalPreferences(preferences) as Promise; + return this.storageProvider.saveGlobalPreferences(preferences) as Promise; } - async saveMeetRoom(meetRoom: R): Promise { + /** + * Saves the meet room to the storage provider. + * + * @param meetRoom - The meeting room object to be saved + * @returns A promise that resolves to the saved meeting room object + */ + async saveMeetRoom(meetRoom: MRoom): Promise { this.logger.info(`Saving OpenVidu room ${meetRoom.roomId}`); - return this.storageProvider.saveMeetRoom(meetRoom) as Promise; + return this.storageProvider.saveMeetRoom(meetRoom) as Promise; } + /** + * Retrieves a paginated list of meeting rooms from the storage provider. + * + * @param maxItems - Optional maximum number of rooms to retrieve in a single request + * @param nextPageToken - Optional token for pagination to get the next page of results + * @returns A promise that resolves to an object containing: + * - rooms: Array of MRoom objects representing the meeting rooms + * - isTruncated: Boolean indicating if there are more results available + * - nextPageToken: Optional token for retrieving the next page of results + */ async getMeetRooms( maxItems?: number, nextPageToken?: string ): Promise<{ - rooms: R[]; + rooms: MRoom[]; isTruncated: boolean; nextPageToken?: string; }> { return this.storageProvider.getMeetRooms(maxItems, nextPageToken) as Promise<{ - rooms: R[]; + rooms: MRoom[]; isTruncated: boolean; nextPageToken?: string; }>; @@ -108,7 +127,7 @@ export class MeetStorageService { + async getMeetRoom(roomId: string): Promise { const meetRoom = await this.storageProvider.getMeetRoom(roomId); if (!meetRoom) { @@ -116,30 +135,57 @@ export class MeetStorageService { return this.storageProvider.deleteMeetRooms(roomIds); } - async getArchivedRoomMetadata(roomId: string): Promise | null> { - return this.storageProvider.getArchivedRoomMetadata(roomId) as Promise | null>; + /** + * Retrieves metadata for an archived room by its ID. + * + * @param roomId - The unique identifier of the room to retrieve metadata for + * @returns A promise that resolves to partial room metadata if found, or null if not found + */ + async getArchivedRoomMetadata(roomId: string): Promise | null> { + return this.storageProvider.getArchivedRoomMetadata(roomId) as Promise | null>; } + /** + * Archives the metadata for a specific room. + * + * @param roomId - The unique identifier of the room whose metadata should be archived + * @returns A Promise that resolves when the archival operation is complete + * @throws May throw an error if the archival operation fails or if the room ID is invalid + */ async archiveRoomMetadata(roomId: string): Promise { return this.storageProvider.archiveRoomMetadata(roomId); } + /** + * Updates the metadata of an archived room. + * + * @param roomId - The unique identifier of the room whose archived metadata should be updated + * @returns A promise that resolves when the archived room metadata has been successfully updated + * @throws May throw an error if the room ID is invalid or if the storage operation fails + */ async updateArchivedRoomMetadata(roomId: string): Promise { return this.storageProvider.updateArchivedRoomMetadata(roomId); } /** * Returns the default global preferences. - * @returns {G} + * @returns {GPrefs} */ - protected async getDefaultPreferences(): Promise { + protected async getDefaultPreferences(): Promise { return { projectId: MEET_NAME_ID, webhooksPreferences: { @@ -162,7 +208,7 @@ export class MeetStorageService