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