feat: implement core domain models, authentication service, and UI components for the attendance system
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
using Asistencia.Data.Repositories;
|
||||
using Asistencia.Models;
|
||||
|
||||
namespace Asistencia.Services;
|
||||
|
||||
public class AsistenciaService
|
||||
{
|
||||
private readonly CursoRepository _cursoRepo;
|
||||
private readonly AsistenciaRepository _asistenciaRepo;
|
||||
|
||||
public AsistenciaService(CursoRepository cursoRepo, AsistenciaRepository asistenciaRepo)
|
||||
{
|
||||
_cursoRepo = cursoRepo;
|
||||
_asistenciaRepo = asistenciaRepo;
|
||||
}
|
||||
|
||||
public Task<List<CursoAbierto>> ObtenerCursosProfesorAsync(string profesorRun)
|
||||
=> _cursoRepo.BuscarCursosPorProfesorAsync(profesorRun);
|
||||
|
||||
public Task<CursoAbierto?> ObtenerCursoAsync(int idCursoAbierto)
|
||||
=> _cursoRepo.BuscarCursoAbiertoPorIdAsync(idCursoAbierto);
|
||||
|
||||
public Task<List<DetalleContrato>> ObtenerAlumnosAsync(int idCursoAbierto)
|
||||
=> _cursoRepo.BuscarAlumnosPorCursoAsync(idCursoAbierto);
|
||||
|
||||
public Task<AsistenciaProfesor?> BuscarSesionActivaAsync(int idCursoAbierto)
|
||||
=> _asistenciaRepo.BuscarSesionActivaAsync(idCursoAbierto, DateTime.Today);
|
||||
|
||||
public async Task<AsistenciaProfesor> IniciarSesionAsync(int idCursoAbierto, string rut)
|
||||
{
|
||||
var now = DateTime.Now;
|
||||
return await _asistenciaRepo.IniciarSesionAsync(idCursoAbierto, rut, now.Date, now.ToString("HH:mm"));
|
||||
}
|
||||
|
||||
public async Task<bool> FinalizarSesionAsync(int idSesion)
|
||||
{
|
||||
return await _asistenciaRepo.FinalizarSesionAsync(idSesion, DateTime.Now.ToString("HH:mm"));
|
||||
}
|
||||
|
||||
public Task<Dictionary<int, int>> ObtenerAsistenciaAlumnosAsync(int idCursoAbierto)
|
||||
=> _asistenciaRepo.ObtenerAsistenciaAlumnosAsync(idCursoAbierto, DateTime.Today);
|
||||
|
||||
public async Task GuardarAsistenciaAlumnoAsync(int idDetalleContrato, int tipoAsistencia)
|
||||
{
|
||||
await _asistenciaRepo.GuardarAsistenciaAlumnoAsync(
|
||||
idDetalleContrato, DateTime.Today, DateTime.Now.ToString("HH:mm"), tipoAsistencia);
|
||||
}
|
||||
}
|
||||
@@ -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