login.ts (1243B)
1 import { AuthRepository } from "#core/application/authn/auth_repository.ts"; 2 import { ExceedingLimit } from "#core/domain/limiter.ts"; 3 import { PasswordMismatch } from "#core/domain/password.ts"; 4 import { UUID } from "#core/domain/uuid.ts"; 5 6 export type AuthLoginRequest = { 7 uuid: string; 8 password: string; 9 }; 10 11 export type AuthLoginResponse = { 12 status: "loggedIn" | "invalid" | "blocked"; 13 delay: number; 14 sessionToken: string | null; 15 }; 16 17 export class AuthLoginUseCase { 18 constructor(private readonly authRepo: AuthRepository) { 19 } 20 21 async execute(request: AuthLoginRequest): Promise<AuthLoginResponse> { 22 try { 23 const uuid = new UUID(request.uuid); 24 const auth = await this.authRepo.find(uuid); 25 const sessionToken = auth.login(request.password).toString(); 26 await this.authRepo.store(auth); 27 return { 28 status: "loggedIn", 29 delay: 0, 30 sessionToken, 31 }; 32 } catch (error) { 33 if ( 34 error instanceof ExceedingLimit || error instanceof PasswordMismatch 35 ) { 36 return { 37 status: error instanceof PasswordMismatch ? "invalid" : "blocked", 38 delay: error.delay, 39 sessionToken: null, 40 }; 41 } 42 throw error; 43 } 44 } 45 }