import { Achievement, AchievementProps } from '@core/identity/domain/entities/Achievement'; import { Result } from '@core/shared/application/Result'; import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode'; import type { Logger } from '@core/shared/application'; export interface IAchievementRepository { save(achievement: Achievement): Promise; findById(id: string): Promise; } export type CreateAchievementInput = Omit; export type CreateAchievementResult = { achievement: Achievement; }; export type CreateAchievementErrorCode = 'REPOSITORY_ERROR'; export type CreateAchievementApplicationError = ApplicationErrorCode< CreateAchievementErrorCode, { message: string } >; export class CreateAchievementUseCase { constructor( private readonly achievementRepository: IAchievementRepository, private readonly logger: Logger, ) {} async execute(input: CreateAchievementInput): Promise< Result > { try { const achievement = Achievement.create(input); await this.achievementRepository.save(achievement); const result: CreateAchievementResult = { achievement }; return Result.ok(result); } catch (error) { const message = error instanceof Error && error.message ? error.message : 'Failed to execute CreateAchievementUseCase'; this.logger.error( 'CreateAchievementUseCase.execute failed', error instanceof Error ? error : undefined, { input }, ); return Result.err({ code: 'REPOSITORY_ERROR', details: { message }, } as CreateAchievementApplicationError); } } }