feat: implement core domain models, authentication service, and UI components for the attendance system
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
using Asistencia.Data.Repositories;
|
||||
using Asistencia.Models;
|
||||
|
||||
namespace Asistencia.Services;
|
||||
|
||||
public class AuthService
|
||||
{
|
||||
private readonly ProfesorRepository _profesorRepo;
|
||||
private Profesor? _currentUser;
|
||||
|
||||
public AuthService(ProfesorRepository profesorRepo)
|
||||
{
|
||||
_profesorRepo = profesorRepo;
|
||||
}
|
||||
|
||||
public Profesor? CurrentUser => _currentUser;
|
||||
|
||||
public async Task<(bool Success, string Message)> LoginAsync(string rut, string password)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(rut) || string.IsNullOrWhiteSpace(password))
|
||||
return (false, "Ingrese usuario y contraseña");
|
||||
|
||||
var profesor = await _profesorRepo.BuscarPorRutAsync(rut);
|
||||
if (profesor == null)
|
||||
return (false, "Usuario no encontrado");
|
||||
|
||||
if (profesor.CrearClave)
|
||||
return (false, "Debe crear su contraseña primero");
|
||||
|
||||
var authenticated = await _profesorRepo.AutenticarAsync(rut, password);
|
||||
if (authenticated == null)
|
||||
return (false, "Contraseña incorrecta");
|
||||
|
||||
_currentUser = authenticated;
|
||||
return (true, "Inicio de sesión exitoso");
|
||||
}
|
||||
|
||||
public async Task<(bool Success, string Message)> CrearClaveAsync(string rut, string nuevaClave, string confirmarClave)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(nuevaClave))
|
||||
return (false, "Ingrese una contraseña");
|
||||
|
||||
if (nuevaClave.Length < 6)
|
||||
return (false, "La contraseña debe tener al menos 6 caracteres");
|
||||
|
||||
if (nuevaClave != confirmarClave)
|
||||
return (false, "Las contraseñas no coinciden");
|
||||
|
||||
var encrypted = Helpers.CryptoHelper.Encriptar(nuevaClave);
|
||||
var result = await _profesorRepo.ActualizarClaveAsync(rut, encrypted);
|
||||
return result ? (true, "Contraseña creada exitosamente") : (false, "Error al crear contraseña");
|
||||
}
|
||||
|
||||
public async Task<(bool Success, string Message)> ActualizarEmailAsync(string email)
|
||||
{
|
||||
if (_currentUser == null) return (false, "No hay sesión activa");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(email) || !email.Contains("@"))
|
||||
return (false, "Ingrese un email válido");
|
||||
|
||||
var result = await _profesorRepo.ActualizarEmailAsync(_currentUser.RutPasaporte, email);
|
||||
if (result)
|
||||
{
|
||||
_currentUser.Email = email;
|
||||
return (true, "Email actualizado exitosamente");
|
||||
}
|
||||
return (false, "Error al actualizar email");
|
||||
}
|
||||
|
||||
public async Task<(bool Success, string Message)> CambiarClaveAsync(string claveActual, string nuevaClave, string confirmarClave)
|
||||
{
|
||||
if (_currentUser == null) return (false, "No hay sesión activa");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(claveActual))
|
||||
return (false, "Ingrese la contraseña actual");
|
||||
|
||||
if (string.IsNullOrWhiteSpace(nuevaClave) || nuevaClave.Length < 6)
|
||||
return (false, "La nueva contraseña debe tener al menos 6 caracteres");
|
||||
|
||||
if (nuevaClave != confirmarClave)
|
||||
return (false, "Las contraseñas no coinciden");
|
||||
|
||||
var authenticated = await _profesorRepo.AutenticarAsync(_currentUser.RutPasaporte, claveActual);
|
||||
if (authenticated == null)
|
||||
return (false, "La contraseña actual es incorrecta");
|
||||
|
||||
var encrypted = Helpers.CryptoHelper.Encriptar(nuevaClave);
|
||||
var result = await _profesorRepo.ActualizarClaveAsync(_currentUser.RutPasaporte, encrypted);
|
||||
return result ? (true, "Contraseña cambiada exitosamente") : (false, "Error al cambiar contraseña");
|
||||
}
|
||||
|
||||
public void Logout()
|
||||
{
|
||||
_currentUser = null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user