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 }