87 lines
2.2 KiB
TypeScript
87 lines
2.2 KiB
TypeScript
/**
|
|
* 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<void> {
|
|
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',
|
|
});
|
|
}
|
|
}
|
|
} |