- Add EmailTokenService for handling email verification and password reset tokens. - Create EmailService for sending verification and reset emails via SMTP. - Update AuthService to handle email verification status during login. - Modify user registration to redirect to a check email screen instead of issuing a token. - Implement resend verification email functionality. - Add deep link handling for email verification and password reset in the mobile app. - Update mobile app routes and components to support new email verification flow. - Enhance error handling for unverified emails during login attempts. - Update configuration to include SMTP settings for email service.
105 lines
2.7 KiB
TypeScript
105 lines
2.7 KiB
TypeScript
import type { AuthRepository } from '@ports/AuthRepository';
|
|
import type { AuthSession, LoginInput, RegisterInput, GoogleOAuthInput } from '@domain/User';
|
|
|
|
/**
|
|
* Caso de uso: Login com e-mail/senha.
|
|
*/
|
|
export class LoginUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(input: LoginInput): Promise<AuthSession> {
|
|
if (!input.email || !input.password) {
|
|
throw new Error('E-mail e senha são obrigatórios.');
|
|
}
|
|
return this.authRepo.login(input);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Cadastro de novo usuário.
|
|
*/
|
|
export class RegisterUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(input: RegisterInput): Promise<void> {
|
|
if (!input.email || !input.password) {
|
|
throw new Error('E-mail e senha são obrigatórios.');
|
|
}
|
|
if (input.password.length < 8) {
|
|
throw new Error('A senha deve ter ao menos 8 caracteres.');
|
|
}
|
|
await this.authRepo.register(input);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Login via OAuth Google.
|
|
*/
|
|
export class GoogleLoginUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(input: GoogleOAuthInput): Promise<AuthSession> {
|
|
return this.authRepo.loginWithGoogle(input);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Logout.
|
|
*/
|
|
export class LogoutUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(accessToken: string): Promise<void> {
|
|
await this.authRepo.logout(accessToken);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Reenviar e-mail de verificação de conta.
|
|
*/
|
|
export class ResendVerificationUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(email: string): Promise<void> {
|
|
if (!email) throw new Error('E-mail obrigatório.');
|
|
await this.authRepo.resendVerification(email);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Solicitar redefinição de senha.
|
|
*/
|
|
export class ForgotPasswordUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(email: string): Promise<void> {
|
|
await this.authRepo.forgotPassword(email);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Verificar e-mail com token recebido por deep link.
|
|
*/
|
|
export class VerifyEmailUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(token: string): Promise<void> {
|
|
if (!token) throw new Error('Token inválido.');
|
|
await this.authRepo.verifyEmail(token);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Caso de uso: Redefinir senha com token.
|
|
*/
|
|
export class ResetPasswordUseCase {
|
|
constructor(private readonly authRepo: AuthRepository) {}
|
|
|
|
async execute(token: string, newPassword: string): Promise<void> {
|
|
if (newPassword.length < 8) {
|
|
throw new Error('A nova senha deve ter ao menos 8 caracteres.');
|
|
}
|
|
await this.authRepo.resetPassword(token, newPassword);
|
|
}
|
|
}
|