feat: implement email verification and password reset features

- 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.
This commit is contained in:
2026-03-14 23:38:15 -03:00
parent f5f4e878b4
commit d5af338ee1
38 changed files with 1146 additions and 75 deletions
+26 -2
View File
@@ -21,14 +21,14 @@ export class LoginUseCase {
export class RegisterUseCase {
constructor(private readonly authRepo: AuthRepository) {}
async execute(input: RegisterInput): Promise<AuthSession> {
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.');
}
return this.authRepo.register(input);
await this.authRepo.register(input);
}
}
@@ -54,6 +54,18 @@ export class LogoutUseCase {
}
}
/**
* 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.
*/
@@ -65,6 +77,18 @@ export class ForgotPasswordUseCase {
}
}
/**
* 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.
*/