/** * Use Case: SelectAvatarUseCase * * Allows a user to select one of the generated avatars as their profile avatar. */ import type { AsyncUseCase } from '@gridpilot/shared/application'; import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository'; export interface SelectAvatarCommand { requestId: string; userId: string; avatarIndex: number; } export interface SelectAvatarResult { success: boolean; selectedAvatarUrl?: string; errorMessage?: string; } export class SelectAvatarUseCase implements AsyncUseCase { constructor( private readonly avatarRepository: IAvatarGenerationRepository, ) {} async execute(command: SelectAvatarCommand): Promise { const request = await this.avatarRepository.findById(command.requestId); if (!request) { return { success: false, errorMessage: 'Avatar generation request not found', }; } if (request.userId !== command.userId) { return { success: false, errorMessage: 'You do not have permission to select this avatar', }; } if (request.status !== 'completed') { return { success: false, errorMessage: 'Avatar generation is not yet complete', }; } try { request.selectAvatar(command.avatarIndex); await this.avatarRepository.save(request); const selectedAvatarUrl = request.selectedAvatarUrl; const result: SelectAvatarResult = selectedAvatarUrl !== undefined ? { success: true, selectedAvatarUrl } : { success: true }; return result; } catch (error) { return { success: false, errorMessage: error instanceof Error ? error.message : 'Failed to select avatar', }; } } }