Files
EonaCat.LogStack/EonaCat.LogStack.Status/Pages/Admin/Incidents.cshtml.cs
2026-04-06 08:15:54 +02:00

139 lines
4.3 KiB
C#

using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.EntityFrameworkCore;
using EonaCat.LogStack.Status.Data;
using EonaCat.LogStack.Status.Models;
using Monitor = EonaCat.LogStack.Status.Models.Monitor;
namespace EonaCat.LogStack.Status.Pages.Admin;
// This file is part of the EonaCat project(s) which is released under the Apache License.
// See the LICENSE file or go to https://EonaCat.com/License for full license details.
public class IncidentsModel : PageModel
{
private readonly DatabaseContext _database;
public IncidentsModel(DatabaseContext database) => _database = database;
public List<Incident> Incidents { get; set; } = new();
public List<Monitor> Monitors { get; set; } = new();
public string? Message { get; set; }
[BindProperty] public Incident NewIncident { get; set; } = new();
public class UpdateDto
{
public int IncidentId { get; set; }
public IncidentStatus Status { get; set; }
public string Message { get; set; } = "";
}
[BindProperty] public UpdateDto UpdateDtoModel { get; set; } = new();
public async Task<IActionResult> OnGetAsync()
{
if (HttpContext.Session.GetString("IsAdmin") != "true")
{
return RedirectToPage("/Admin/Login");
}
Incidents = await _database.Incidents
.Include(i => i.Updates)
.Include(i => i.Monitor)
.OrderByDescending(i => i.CreatedAt)
.ToListAsync();
Monitors = await _database.Monitors.Where(m => m.IsActive).ToListAsync();
return Page();
}
public async Task<IActionResult> OnPostCreateAsync()
{
if (HttpContext.Session.GetString("IsAdmin") != "true")
{
return RedirectToPage("/Admin/Login");
}
NewIncident.CreatedAt = DateTime.UtcNow;
NewIncident.UpdatedAt = DateTime.UtcNow;
_database.Incidents.Add(NewIncident);
await _database.SaveChangesAsync();
Message = "Incident created.";
return await OnGetAsync();
}
public async Task<IActionResult> OnPostPostUpdateAsync()
{
if (HttpContext.Session.GetString("IsAdmin") != "true")
{
return RedirectToPage("/Admin/Login");
}
var incident = await _database.Incidents.FindAsync(UpdateDtoModel.IncidentId);
if (incident != null)
{
incident.Status = UpdateDtoModel.Status;
incident.UpdatedAt = DateTime.UtcNow;
if (UpdateDtoModel.Status == IncidentStatus.Resolved)
{
incident.ResolvedAt = DateTime.UtcNow;
}
_database.IncidentUpdates.Add(new IncidentUpdate
{
IncidentId = incident.Id,
Message = UpdateDtoModel.Message,
Status = UpdateDtoModel.Status
});
await _database.SaveChangesAsync();
}
Message = "Update posted.";
return await OnGetAsync();
}
public async Task<IActionResult> OnPostResolveAsync(int id)
{
if (HttpContext.Session.GetString("IsAdmin") != "true")
{
return RedirectToPage("/Admin/Login");
}
var incident = await _database.Incidents.FindAsync(id);
if (incident != null)
{
incident.Status = IncidentStatus.Resolved;
incident.ResolvedAt = DateTime.UtcNow;
incident.UpdatedAt = DateTime.UtcNow;
_database.IncidentUpdates.Add(new IncidentUpdate
{
IncidentId = id,
Message = "Incident resolved.",
Status = IncidentStatus.Resolved
});
await _database.SaveChangesAsync();
}
Message = "Incident resolved.";
return await OnGetAsync();
}
public async Task<IActionResult> OnPostDeleteAsync(int id)
{
if (HttpContext.Session.GetString("IsAdmin") != "true")
{
return RedirectToPage("/Admin/Login");
}
var incident = await _database.Incidents.FindAsync(id);
if (incident != null)
{
_database.Incidents.Remove(incident);
await _database.SaveChangesAsync();
}
Message = "Incident deleted.";
return await OnGetAsync();
}
}