Files
asistencia-desktop/Asistencia/Services/AuthService.cs
T

97 lines
3.5 KiB
C#

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;
}
}