Files
asistencia-desktop/Asistencia/Services/AuthService.cs
T
Nurfog fb275508ee Alinear BD local con esquema de produccion, login offline y publicacion portable
- Modelos renombrados para coincidir con columnas de MariaDB (ApPaterno/ApMaterno, HoraSalida, FechaFin, IdAsistenciaProfesor)
- Agregado campo IdAlumno a DetalleContrato
- Seed data con IDs reales de produccion (16451, 16493, profesor 15668563-1)
- Login offline: solo valida RUT contra BD local, sin contraseña
- ConnectivityService: checkea internet al inicio, bloquea si hay conexion
- ViewLocator corregido: busca tipos en todos los ensamblados
- Todos los ViewModels heredan de ViewModelBase
- Publicacion self-contained para win-x64, linux-x64, osx-x64, osx-arm64
- Agregado .gitignore, removidos bin/obj/publish del tracking
2026-08-19 16:43:52 -04:00

90 lines
3.2 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))
return (false, "Ingrese su RUT");
var profesor = await _profesorRepo.BuscarPorRutAsync(rut);
if (profesor == null)
return (false, "Usuario no encontrado");
_currentUser = profesor;
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;
}
}