This commit is contained in:
2025-12-16 10:50:15 +01:00
parent 775d41e055
commit 8ed6ba1fd1
144 changed files with 5763 additions and 1985 deletions

View File

@@ -0,0 +1,13 @@
export interface RequestAvatarGenerationResultDTO {
requestId: string;
status: 'validating' | 'generating' | 'completed' | 'failed';
avatarUrls?: string[];
errorMessage?: string;
}
export interface IRequestAvatarGenerationPresenter {
reset(): void;
present(dto: RequestAvatarGenerationResultDTO): void;
get viewModel(): any;
getViewModel(): any;
}

View File

@@ -1,7 +1,8 @@
import type { AsyncUseCase, Logger } from '@gridpilot/shared/application';
import type { UseCase, Logger } from '@gridpilot/shared/application';
import type { IAvatarGenerationRepository } from '../../domain/repositories/IAvatarGenerationRepository';
import type { FaceValidationPort } from '../ports/FaceValidationPort';
import type { AvatarGenerationPort } from '../ports/AvatarGenerationPort';
import type { IRequestAvatarGenerationPresenter, RequestAvatarGenerationResultDTO } from '../presenters/IRequestAvatarGenerationPresenter';
import { AvatarGenerationRequest } from '../../domain/entities/AvatarGenerationRequest';
import type { RacingSuitColor, AvatarStyle } from '../../domain/types/AvatarGenerationRequest';
@@ -12,15 +13,8 @@ export interface RequestAvatarGenerationCommand {
style?: AvatarStyle;
}
export interface RequestAvatarGenerationResult {
requestId: string;
status: 'validating' | 'generating' | 'completed' | 'failed';
avatarUrls?: string[];
errorMessage?: string;
}
export class RequestAvatarGenerationUseCase
implements AsyncUseCase<RequestAvatarGenerationCommand, RequestAvatarGenerationResult> {
implements UseCase<RequestAvatarGenerationCommand, RequestAvatarGenerationResultDTO, any, IRequestAvatarGenerationPresenter> {
constructor(
private readonly avatarRepository: IAvatarGenerationRepository,
private readonly faceValidation: FaceValidationPort,
@@ -28,7 +22,8 @@ export class RequestAvatarGenerationUseCase
private readonly logger: Logger,
) {}
async execute(command: RequestAvatarGenerationCommand): Promise<RequestAvatarGenerationResult> {
async execute(command: RequestAvatarGenerationCommand, presenter: IRequestAvatarGenerationPresenter): Promise<void> {
presenter.reset();
this.logger.debug(
`Executing RequestAvatarGenerationUseCase for userId: ${command.userId}`,
command,
@@ -64,11 +59,12 @@ export class RequestAvatarGenerationUseCase
request.fail(errorMessage);
await this.avatarRepository.save(request);
this.logger.error(`Face validation failed for request ${requestId}: ${errorMessage}`);
return {
presenter.present({
requestId,
status: 'failed',
errorMessage: validationResult.errorMessage || 'Please upload a clear photo of your face',
};
});
return;
}
if (!validationResult.hasFace) {
@@ -76,11 +72,12 @@ export class RequestAvatarGenerationUseCase
request.fail(errorMessage);
await this.avatarRepository.save(request);
this.logger.error(`No face detected for request ${requestId}: ${errorMessage}`);
return {
presenter.present({
requestId,
status: 'failed',
errorMessage: 'No face detected. Please upload a photo that clearly shows your face.',
};
});
return;
}
if (validationResult.faceCount > 1) {
@@ -88,11 +85,12 @@ export class RequestAvatarGenerationUseCase
request.fail(errorMessage);
await this.avatarRepository.save(request);
this.logger.error(`Multiple faces detected for request ${requestId}: ${errorMessage}`);
return {
presenter.present({
requestId,
status: 'failed',
errorMessage: 'Multiple faces detected. Please upload a photo with only your face.',
};
});
return;
}
this.logger.info(`Face validation successful for request ${requestId}.`);
@@ -119,11 +117,12 @@ export class RequestAvatarGenerationUseCase
request.fail(errorMessage);
await this.avatarRepository.save(request);
this.logger.error(`Avatar generation failed for request ${requestId}: ${errorMessage}`);
return {
presenter.present({
requestId,
status: 'failed',
errorMessage: generationResult.errorMessage || 'Failed to generate avatars. Please try again.',
};
});
return;
}
// Complete with generated avatars
@@ -132,18 +131,18 @@ export class RequestAvatarGenerationUseCase
await this.avatarRepository.save(request);
this.logger.info(`Avatar generation completed successfully for request ${requestId}.`);
return {
presenter.present({
requestId,
status: 'completed',
avatarUrls,
};
});
} catch (error) {
this.logger.error(
`An unexpected error occurred during avatar generation for userId: ${command.userId}`,
error,
error as Error,
);
// Re-throw or return a generic error, depending on desired error handling strategy
throw error;
throw error;
}
}