diff --git a/backend/src/services/recording.service.ts b/backend/src/services/recording.service.ts index 9a3718e..9029a3b 100644 --- a/backend/src/services/recording.service.ts +++ b/backend/src/services/recording.service.ts @@ -301,7 +301,7 @@ export class RecordingService { * @returns A promise that resolves to a MeetRecordingInfo object. */ async getRecording(recordingId: string, fields?: string): Promise { - const { recordingInfo } = await this.getMeetRecordingInfoFromMetadata(recordingId); + const { recordingInfo } = await this.storageService.getRecordingMetadata(recordingId); return UtilsHelper.filterObjectFields(recordingInfo, fields) as MeetRecordingInfo; } @@ -508,7 +508,7 @@ export class RecordingService { protected async getDeletableRecordingFiles( recordingId: string ): Promise<{ filesToDelete: Set; recordingInfo: MeetRecordingInfo }> { - const { metadataFilePath, recordingInfo } = await this.getMeetRecordingInfoFromMetadata(recordingId); + const { metadataFilePath, recordingInfo } = await this.storageService.getRecordingMetadata(recordingId); const filesToDelete: Set = new Set(); // Validate the recording status @@ -526,23 +526,23 @@ export class RecordingService { return { filesToDelete, recordingInfo }; } - protected async getMeetRecordingInfoFromMetadata( - recordingId: string - ): Promise<{ metadataFilePath: string; recordingInfo: MeetRecordingInfo }> { - const { roomId, egressId, uid } = RecordingHelper.extractInfoFromRecordingId(recordingId); + // protected async getMeetRecordingInfoFromMetadata( + // recordingId: string + // ): Promise<{ metadataFilePath: string; recordingInfo: MeetRecordingInfo }> { + // const { roomId, egressId, uid } = RecordingHelper.extractInfoFromRecordingId(recordingId); - const metadataPath = `${INTERNAL_CONFIG.S3_RECORDINGS_PREFIX}/.metadata/${roomId}/${egressId}/${uid}.json`; - this.logger.debug(`Retrieving metadata for recording ${recordingId} from ${metadataPath}`); - const recordingInfo = (await this.s3Service.getObjectAsJson(metadataPath)) as MeetRecordingInfo; + // const metadataPath = `${INTERNAL_CONFIG.S3_RECORDINGS_PREFIX}/.metadata/${roomId}/${egressId}/${uid}.json`; + // this.logger.debug(`Retrieving metadata for recording ${recordingId} from ${metadataPath}`); + // const recordingInfo = (await this.s3Service.getObjectAsJson(metadataPath)) as MeetRecordingInfo; - if (!recordingInfo) { - throw errorRecordingNotFound(recordingId); - } + // if (!recordingInfo) { + // throw errorRecordingNotFound(recordingId); + // } - this.logger.verbose(`Retrieved metadata for recording ${recordingId} from ${metadataPath}`); + // this.logger.verbose(`Retrieved metadata for recording ${recordingId} from ${metadataPath}`); - return { recordingInfo, metadataFilePath: metadataPath }; - } + // return { recordingInfo, metadataFilePath: metadataPath }; + // } protected generateCompositeOptionsFromRequest(layout = 'grid'): RoomCompositeOptions { return { diff --git a/backend/src/services/storage/providers/s3-storage.provider.ts b/backend/src/services/storage/providers/s3-storage.provider.ts index 073de6d..767e968 100644 --- a/backend/src/services/storage/providers/s3-storage.provider.ts +++ b/backend/src/services/storage/providers/s3-storage.provider.ts @@ -2,7 +2,7 @@ import { PutObjectCommandOutput } from '@aws-sdk/client-s3'; 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'; +import { errorRecordingNotFound, OpenViduMeetError, RedisKeyName } from '../../../models/index.js'; import { LoggerService, RedisService, S3Service, StorageProvider } from '../../index.js'; import { RecordingHelper } from '../../../helpers/recording.helper.js'; @@ -354,10 +354,23 @@ export class S3StorageProvider< this.logger.warn('deleteArchivedRoomMetadata is not implemented yet'); } - async getRecordingMetadata(recordingId: string): Promise { - //TODO : Implement this method to retrieve recording metadata for a room - this.logger.warn('getRecordingMetadata is not implemented yet'); - return null; + async getRecordingMetadata(recordingId: string): Promise<{ recordingInfo: MRec; metadataFilePath: string }> { + try { + const metadataPath = RecordingHelper.buildMetadataFilePath(recordingId); + this.logger.debug(`Retrieving metadata for recording ${recordingId} from ${metadataPath}`); + const recordingInfo = (await this.s3Service.getObjectAsJson(metadataPath)) as MRec; + + if (!recordingInfo) { + throw errorRecordingNotFound(recordingId); + } + + this.logger.verbose(`Retrieved metadata for recording ${recordingId} from ${metadataPath}`); + + return { recordingInfo, metadataFilePath: metadataPath }; + } catch (error) { + this.handleError(error, `Error fetching recording metadata for recording ${recordingId}`); + throw error; + } } async saveRecordingMetadata(recordingInfo: MRec): Promise { @@ -371,10 +384,7 @@ export class S3StorageProvider< } } - async deleteRecordingMetadata(recordingId: string): Promise { - //TODO : Implement this method to delete recording metadata for a room - this.logger.warn('deleteRecordingMetadata is not implemented yet'); - } + async deleteRecordingMetadata(recordingId: string): Promise {} /** * Retrieves an object of type U from Redis by the given key. diff --git a/backend/src/services/storage/storage.interface.ts b/backend/src/services/storage/storage.interface.ts index 2e287ca..f42caa5 100644 --- a/backend/src/services/storage/storage.interface.ts +++ b/backend/src/services/storage/storage.interface.ts @@ -132,7 +132,7 @@ export interface StorageProvider< * @param recordingId - The unique identifier of the recording. * @returns A promise that resolves to the recording metadata, or null if not found. */ - getRecordingMetadata(recordingId: string): Promise; + getRecordingMetadata(recordingId: string): Promise<{ recordingInfo: MRec; metadataFilePath: string }>; /** * Deletes the recording metadata for a specific recording ID. diff --git a/backend/src/services/storage/storage.service.ts b/backend/src/services/storage/storage.service.ts index db69f06..196180e 100644 --- a/backend/src/services/storage/storage.service.ts +++ b/backend/src/services/storage/storage.service.ts @@ -192,6 +192,13 @@ export class MeetStorageService< return this.storageProvider.saveRecordingMetadata(recordingInfo) as Promise; } + async getRecordingMetadata(recordingId: string): Promise<{ recordingInfo: MRec; metadataFilePath: string }> { + return this.storageProvider.getRecordingMetadata(recordingId) as Promise<{ + recordingInfo: MRec; + metadataFilePath: string; + }>; + } + /** * Returns the default global preferences. * @returns {GPrefs}