ekyc

Electronic KYC process with uploading ID document using OAuth 2.1 (experimental)
Log | Files | Refs | README | LICENSE

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 }