83 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			83 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
|  | using System.Collections.Generic; | ||
|  | using System.Linq; | ||
|  | using System.Threading.Tasks; | ||
|  | using Dapper; | ||
|  | using GestionIntegral.Api.Data; | ||
|  | using GestionIntegral.Api.Dtos.Anomalia; | ||
|  | using Microsoft.Extensions.Logging; | ||
|  | 
 | ||
|  | namespace GestionIntegral.Api.Services.Anomalia | ||
|  | { | ||
|  |     public class AlertaService : IAlertaService | ||
|  |     { | ||
|  |         private readonly DbConnectionFactory _dbConnectionFactory; | ||
|  |         private readonly ILogger<AlertaService> _logger; | ||
|  | 
 | ||
|  |         public AlertaService(DbConnectionFactory dbConnectionFactory, ILogger<AlertaService> logger) | ||
|  |         { | ||
|  |             _dbConnectionFactory = dbConnectionFactory; | ||
|  |             _logger = logger; | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<IEnumerable<AlertaGenericaDto>> ObtenerAlertasNoLeidasAsync() | ||
|  |         { | ||
|  |             // Apunta a la nueva tabla genérica 'Sistema_Alertas' | ||
|  |             var query = "SELECT * FROM Sistema_Alertas WHERE Leida = 0 ORDER BY FechaDeteccion DESC"; | ||
|  |             try | ||
|  |             { | ||
|  |                 using (var connection = _dbConnectionFactory.CreateConnection()) | ||
|  |                 { | ||
|  |                     var alertas = await connection.QueryAsync<AlertaGenericaDto>(query); | ||
|  |                     return alertas ?? Enumerable.Empty<AlertaGenericaDto>(); | ||
|  |                 } | ||
|  |             } | ||
|  |             catch (System.Exception ex) | ||
|  |             { | ||
|  |                 _logger.LogError(ex, "Error al obtener las alertas no leídas desde Sistema_Alertas."); | ||
|  |                 return Enumerable.Empty<AlertaGenericaDto>(); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<(bool Exito, string? Error)> MarcarComoLeidaAsync(int idAlerta) | ||
|  |         { | ||
|  |             var query = "UPDATE Sistema_Alertas SET Leida = 1 WHERE IdAlerta = @IdAlerta"; | ||
|  |             try | ||
|  |             { | ||
|  |                 using (var connection = _dbConnectionFactory.CreateConnection()) | ||
|  |                 { | ||
|  |                     var result = await connection.ExecuteAsync(query, new { IdAlerta = idAlerta }); | ||
|  |                     if (result > 0) | ||
|  |                     { | ||
|  |                         return (true, null); | ||
|  |                     } | ||
|  |                     return (false, "La alerta no fue encontrada o ya estaba marcada."); | ||
|  |                 } | ||
|  |             } | ||
|  |             catch (System.Exception ex) | ||
|  |             { | ||
|  |                 _logger.LogError(ex, "Error al marcar la alerta {IdAlerta} como leída.", idAlerta); | ||
|  |                 return (false, "Error interno del servidor."); | ||
|  |             } | ||
|  |         } | ||
|  | 
 | ||
|  |         public async Task<(bool Exito, string? Error)> MarcarGrupoComoLeidoAsync(string tipoAlerta, int idEntidad) | ||
|  |         { | ||
|  |             var query = "UPDATE Sistema_Alertas SET Leida = 1 WHERE TipoAlerta = @TipoAlerta AND IdEntidad = @IdEntidad AND Leida = 0"; | ||
|  |             try | ||
|  |             { | ||
|  |                  using (var connection = _dbConnectionFactory.CreateConnection()) | ||
|  |                 { | ||
|  |                     var result = await connection.ExecuteAsync(query, new { TipoAlerta = tipoAlerta, IdEntidad = idEntidad }); | ||
|  |                     // No es un error si no se actualizan filas (puede que no hubiera ninguna para ese grupo) | ||
|  |                     _logger.LogInformation("Marcadas como leídas {Count} alertas para Tipo: {Tipo}, EntidadID: {IdEntidad}", result, tipoAlerta, idEntidad); | ||
|  |                     return (true, null);  | ||
|  |                 } | ||
|  |             } | ||
|  |             catch (System.Exception ex) | ||
|  |             { | ||
|  |                 _logger.LogError(ex, "Error al marcar grupo de alertas como leídas. Tipo: {Tipo}, EntidadID: {IdEntidad}", tipoAlerta, idEntidad); | ||
|  |                 return (false, "Error interno del servidor."); | ||
|  |             } | ||
|  |         } | ||
|  |     } | ||
|  | } |