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 _logger; public AuditController(MyInfoMateDbContext db, ILogger logger) { _db = db; _logger = logger; } [HttpGet] public async Task 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 }); } } }