97 lines
3.5 KiB
C#
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;
|
|
}
|
|
}
|