ekyc

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

verify_sms.ts (1454B)


      1 import { PhoneRepository } from "#core/application/phone/phone_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 PhoneVerifySmsRequest = {
      8   uuid: string;
      9   code: string;
     10 };
     11 
     12 export type PhoneVerifySmsResponse = {
     13   status: "verified" | "blocked" | "invalid";
     14   delay: number;
     15 };
     16 
     17 export class PhoneVerifySmsUseCase {
     18   constructor(private readonly repo: PhoneRepository) {
     19   }
     20 
     21   async execute(
     22     request: PhoneVerifySmsRequest,
     23   ): Promise<PhoneVerifySmsResponse> {
     24     try {
     25       const uuid = new UUID(request.uuid);
     26       const code = new Code(request.code);
     27       const phoneEKY = await this.repo.findOrCreate(uuid);
     28       try {
     29         phoneEKY.verifySmsChallenge(code);
     30       } finally {
     31         await this.repo.store(phoneEKY);
     32       }
     33       return { status: "verified", delay: 0 };
     34     } catch (error) {
     35       if (
     36         error instanceof InvalidUUID ||
     37         error instanceof InvalidCode
     38       ) {
     39         return { status: "invalid", delay: 0 };
     40       }
     41       if (error instanceof InvalidCodeChallenge) {
     42         return { status: "invalid", delay: error.delay };
     43       }
     44       if (error instanceof ExceedingLimit) {
     45         return { status: "blocked", delay: error.delay };
     46       }
     47       throw error;
     48     }
     49   }
     50 }