import { Injectable, Inject } from '@nestjs/common'; import type { RequestAvatarGenerationInputDTO } from './dtos/RequestAvatarGenerationInputDTO'; import type { UploadMediaInputDTO } from './dtos/UploadMediaInputDTO'; import type { UpdateAvatarInputDTO } from './dtos/UpdateAvatarInputDTO'; import type { RacingSuitColor } from '@core/media/domain/types/AvatarGenerationRequest'; type RequestAvatarGenerationInput = RequestAvatarGenerationInputDTO; type UploadMediaInput = UploadMediaInputDTO; type UpdateAvatarInput = UpdateAvatarInputDTO; // Use cases import { RequestAvatarGenerationUseCase } from '@core/media/application/use-cases/RequestAvatarGenerationUseCase'; import { UploadMediaUseCase } from '@core/media/application/use-cases/UploadMediaUseCase'; import { GetMediaUseCase } from '@core/media/application/use-cases/GetMediaUseCase'; import { DeleteMediaUseCase } from '@core/media/application/use-cases/DeleteMediaUseCase'; import { GetAvatarUseCase } from '@core/media/application/use-cases/GetAvatarUseCase'; import { UpdateAvatarUseCase } from '@core/media/application/use-cases/UpdateAvatarUseCase'; // Presenters import { RequestAvatarGenerationPresenter } from './presenters/RequestAvatarGenerationPresenter'; import { UploadMediaPresenter } from './presenters/UploadMediaPresenter'; import { GetMediaPresenter } from './presenters/GetMediaPresenter'; import { DeleteMediaPresenter } from './presenters/DeleteMediaPresenter'; import { GetAvatarPresenter } from './presenters/GetAvatarPresenter'; import { UpdateAvatarPresenter } from './presenters/UpdateAvatarPresenter'; // Tokens import { REQUEST_AVATAR_GENERATION_USE_CASE_TOKEN, UPLOAD_MEDIA_USE_CASE_TOKEN, GET_MEDIA_USE_CASE_TOKEN, DELETE_MEDIA_USE_CASE_TOKEN, GET_AVATAR_USE_CASE_TOKEN, UPDATE_AVATAR_USE_CASE_TOKEN, LOGGER_TOKEN } from './MediaProviders'; import type { Logger } from '@core/shared/application'; @Injectable() export class MediaService { constructor( @Inject(REQUEST_AVATAR_GENERATION_USE_CASE_TOKEN) private readonly requestAvatarGenerationUseCase: RequestAvatarGenerationUseCase, @Inject(UPLOAD_MEDIA_USE_CASE_TOKEN) private readonly uploadMediaUseCase: UploadMediaUseCase, @Inject(GET_MEDIA_USE_CASE_TOKEN) private readonly getMediaUseCase: GetMediaUseCase, @Inject(DELETE_MEDIA_USE_CASE_TOKEN) private readonly deleteMediaUseCase: DeleteMediaUseCase, @Inject(GET_AVATAR_USE_CASE_TOKEN) private readonly getAvatarUseCase: GetAvatarUseCase, @Inject(UPDATE_AVATAR_USE_CASE_TOKEN) private readonly updateAvatarUseCase: UpdateAvatarUseCase, @Inject(LOGGER_TOKEN) private readonly logger: Logger, ) {} async requestAvatarGeneration(input: RequestAvatarGenerationInput): Promise { this.logger.debug('[MediaService] Requesting avatar generation.'); const presenter = new RequestAvatarGenerationPresenter(); await this.requestAvatarGenerationUseCase.execute({ userId: input.userId, facePhotoData: input.facePhotoData, suitColor: input.suitColor as RacingSuitColor, }, presenter); return presenter; } async uploadMedia(input: UploadMediaInput & { file: Express.Multer.File }): Promise { this.logger.debug('[MediaService] Uploading media.'); const presenter = new UploadMediaPresenter(); await this.uploadMediaUseCase.execute({ file: input.file, uploadedBy: input.userId, // Assuming userId is the uploader metadata: input.metadata, }, presenter); return presenter; } async getMedia(mediaId: string): Promise { this.logger.debug(`[MediaService] Getting media: ${mediaId}`); const presenter = new GetMediaPresenter(); await this.getMediaUseCase.execute({ mediaId }, presenter); return presenter; } async deleteMedia(mediaId: string): Promise { this.logger.debug(`[MediaService] Deleting media: ${mediaId}`); const presenter = new DeleteMediaPresenter(); await this.deleteMediaUseCase.execute({ mediaId }, presenter); return presenter; } async getAvatar(driverId: string): Promise { this.logger.debug(`[MediaService] Getting avatar for driver: ${driverId}`); const presenter = new GetAvatarPresenter(); await this.getAvatarUseCase.execute({ driverId }, presenter); return presenter; } async updateAvatar(driverId: string, input: UpdateAvatarInput): Promise { this.logger.debug(`[MediaService] Updating avatar for driver: ${driverId}`); const presenter = new UpdateAvatarPresenter(); await this.updateAvatarUseCase.execute({ driverId, mediaUrl: input.mediaUrl, }, presenter); return presenter; } }