feat(worker): implement background jobs for incidents
This commit is contained in:
64
src/IncidentOps.Worker/Jobs/EscalateIfUnackedJob.cs
Normal file
64
src/IncidentOps.Worker/Jobs/EscalateIfUnackedJob.cs
Normal file
@@ -0,0 +1,64 @@
|
||||
using Hangfire;
|
||||
using IncidentOps.Domain.Entities;
|
||||
using IncidentOps.Domain.Enums;
|
||||
using IncidentOps.Infrastructure.Data.Repositories;
|
||||
using IncidentOps.Infrastructure.Jobs;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace IncidentOps.Worker.Jobs;
|
||||
|
||||
public class EscalateIfUnackedJob : IEscalateIfUnackedJob
|
||||
{
|
||||
private readonly IIncidentEventRepository _incidentEventRepository;
|
||||
private readonly IBackgroundJobClient _backgroundJobClient;
|
||||
private readonly ILogger<EscalateIfUnackedJob> _logger;
|
||||
|
||||
public EscalateIfUnackedJob(
|
||||
IIncidentEventRepository incidentEventRepository,
|
||||
IBackgroundJobClient backgroundJobClient,
|
||||
ILogger<EscalateIfUnackedJob> logger)
|
||||
{
|
||||
_incidentEventRepository = incidentEventRepository;
|
||||
_backgroundJobClient = backgroundJobClient;
|
||||
_logger = logger;
|
||||
}
|
||||
|
||||
public async Task ExecuteAsync(Guid incidentId, int step)
|
||||
{
|
||||
_logger.LogInformation("Checking escalation for incident {IncidentId}, step {Step}", incidentId, step);
|
||||
|
||||
using var connection = new Npgsql.NpgsqlConnection(
|
||||
Environment.GetEnvironmentVariable("ConnectionStrings__Postgres") ?? "");
|
||||
|
||||
var incident = await Dapper.SqlMapper.QuerySingleOrDefaultAsync<Incident>(
|
||||
connection, "SELECT * FROM incidents WHERE id = @Id", new { Id = incidentId });
|
||||
|
||||
if (incident == null)
|
||||
{
|
||||
_logger.LogWarning("Incident {IncidentId} not found for escalation", incidentId);
|
||||
return;
|
||||
}
|
||||
|
||||
if (incident.Status != IncidentStatus.Triggered)
|
||||
{
|
||||
_logger.LogInformation("Incident {IncidentId} is no longer in Triggered state, skipping escalation",
|
||||
incidentId);
|
||||
return;
|
||||
}
|
||||
|
||||
// Record escalation event
|
||||
await _incidentEventRepository.CreateAsync(new IncidentEvent
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
IncidentId = incidentId,
|
||||
EventType = IncidentEventType.EscalationTriggered,
|
||||
Payload = $"{{\"step\": {step}}}",
|
||||
CreatedAt = DateTime.UtcNow
|
||||
});
|
||||
|
||||
_logger.LogInformation("Escalation triggered for incident {IncidentId}, step {Step}", incidentId, step);
|
||||
|
||||
// TODO: Implement secondary notification targets or on-call escalation
|
||||
// For now, just log the escalation
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user