verify_email.ts (1426B)
1 import { AuthRepository } from "#core/application/authn/auth_repository.ts"; 2 import { Code, InvalidCode } from "#core/domain/code.ts"; 3 import { InvalidCodeChallenge } from "#core/domain/code_challenge.ts"; 4 import { ExceedingLimit } from "#core/domain/limiter.ts"; 5 import { InvalidUUID, UUID } from "#core/domain/uuid.ts"; 6 7 export type AuthVerifyEmailRequest = { 8 uuid: string; 9 code: string; 10 }; 11 12 export type AuthVerifyEmailResponse = { 13 status: "verified" | "blocked" | "invalid"; 14 delay: number; 15 }; 16 17 export class AuthVerifyEmailUseCase { 18 constructor(private readonly authRepo: AuthRepository) { 19 } 20 21 async execute( 22 request: AuthVerifyEmailRequest, 23 ): Promise<AuthVerifyEmailResponse> { 24 try { 25 const uuid = new UUID(request.uuid); 26 const code = new Code(request.code); 27 const auth = await this.authRepo.find(uuid); 28 try { 29 auth.verifyEmailChallenge(code); 30 } finally { 31 await this.authRepo.store(auth); 32 } 33 return { status: "verified", delay: 0 }; 34 } catch (error) { 35 if (error instanceof InvalidUUID || error instanceof InvalidCode) { 36 return { status: "invalid", delay: 0 }; 37 } 38 if (error instanceof InvalidCodeChallenge) { 39 return { status: "invalid", delay: error.delay }; 40 } 41 if (error instanceof ExceedingLimit) { 42 return { status: "blocked", delay: error.delay }; 43 } 44 throw error; 45 } 46 } 47 }