approve.ts (1425B)
1 import { EntityLocked } from "#core/application/repository_error.ts"; 2 3 import { AdminRepository } from "#core/application/id_document/admin_repository.ts"; 4 import { IDDocumentRepository } from "#core/application/id_document/id_document_repository.ts"; 5 import { IDDocumentOutOfState } from "#core/domain/id_document.ts"; 6 import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; 7 8 export type IDDocumentApproveRequest = { 9 uuid: string; 10 admin: string; 11 }; 12 13 export type IDDocumentApproveResponse = { 14 status: "approved" | "invalid"; 15 }; 16 17 export class IDDocumentApproveUseCase { 18 constructor( 19 private readonly adminRepo: AdminRepository, 20 private readonly idDocumentRepo: IDDocumentRepository, 21 ) {} 22 23 async execute( 24 request: IDDocumentApproveRequest, 25 ): Promise<IDDocumentApproveResponse> { 26 try { 27 const adminUuid = new UUID(request.admin); 28 const idDocumentUuid = new UUID(request.uuid); 29 const admin = await this.adminRepo.find(adminUuid); 30 const idDocument = await this.idDocumentRepo.findOrCreate(idDocumentUuid); 31 idDocument.approve(admin); 32 await this.idDocumentRepo.store(idDocument); 33 return { status: "approved" }; 34 } catch (error) { 35 if ( 36 error instanceof IDDocumentOutOfState || 37 error instanceof InvalidUUID || 38 error instanceof EntityLocked 39 ) { 40 return { status: "invalid" }; 41 } 42 throw error; 43 } 44 } 45 }