65 lines
2.1 KiB
C#

using ManagerService.Data;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using NSwag.Annotations;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace ManagerService.Controllers
{
[Authorize(Policy = ManagerService.Service.Security.Policies.SuperAdmin)]
[ApiController, Route("api/[controller]")]
[OpenApiTag("Audit", Description = "Audit trail — SuperAdmin only")]
public class AuditController : ControllerBase
{
private readonly MyInfoMateDbContext _db;
private readonly ILogger<AuditController> _logger;
public AuditController(MyInfoMateDbContext db, ILogger<AuditController> logger)
{
_db = db;
_logger = logger;
}
[HttpGet]
public async Task<IActionResult> GetAuditLogs(
[FromQuery] string? instanceId,
[FromQuery] string? entityType,
[FromQuery] string? userId,
[FromQuery] DateTime? from,
[FromQuery] DateTime? to,
[FromQuery] int page = 1,
[FromQuery] int limit = 50)
{
var query = _db.AuditLogs.AsQueryable();
if (!string.IsNullOrEmpty(instanceId))
query = query.Where(a => a.InstanceId == instanceId);
if (!string.IsNullOrEmpty(entityType))
query = query.Where(a => a.EntityType == entityType);
if (!string.IsNullOrEmpty(userId))
query = query.Where(a => a.UserId == userId);
if (from.HasValue)
query = query.Where(a => a.Timestamp >= from.Value);
if (to.HasValue)
query = query.Where(a => a.Timestamp <= to.Value);
var total = await query.CountAsync();
var items = await query
.OrderByDescending(a => a.Timestamp)
.Skip((page - 1) * limit)
.Take(limit)
.ToListAsync();
return Ok(new { total, page, limit, items });
}
}
}