/** * Use Case: SelectAvatarUseCase * * Handles the business logic for selecting a generated avatar from the options. */ import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; import type { Logger } from '@core/shared/application'; import type { ISelectAvatarPresenter } from '../presenters/ISelectAvatarPresenter'; export interface SelectAvatarInput { requestId: string; selectedIndex: number; } export interface SelectAvatarResult { success: boolean; selectedAvatarUrl?: string; errorMessage?: string; } export interface ISelectAvatarPresenter { present(result: SelectAvatarResult): void; } export class SelectAvatarUseCase { constructor( private readonly avatarRepo: IAvatarGenerationRepository, private readonly logger: Logger, ) {} async execute( input: SelectAvatarInput, presenter: ISelectAvatarPresenter, ): Promise { try { this.logger.info('[SelectAvatarUseCase] Selecting avatar', { requestId: input.requestId, selectedIndex: input.selectedIndex, }); const request = await this.avatarRepo.findById(input.requestId); if (!request) { presenter.present({ success: false, errorMessage: 'Avatar generation request not found', }); return; } if (request.status !== 'completed') { presenter.present({ success: false, errorMessage: 'Avatar generation is not completed yet', }); return; } request.selectAvatar(input.selectedIndex); await this.avatarRepo.save(request); const selectedAvatarUrl = request.selectedAvatarUrl; presenter.present({ success: true, selectedAvatarUrl, }); this.logger.info('[SelectAvatarUseCase] Avatar selected successfully', { requestId: input.requestId, selectedAvatarUrl, }); } catch (error) { this.logger.error('[SelectAvatarUseCase] Error selecting avatar', { error: error instanceof Error ? error.message : 'Unknown error', requestId: input.requestId, }); presenter.present({ success: false, errorMessage: 'Internal error occurred while selecting avatar', }); } } }