65 lines
2.1 KiB
C#
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 });
|
|
}
|
|
}
|
|
}
|