Spaces:
Running
Running
File size: 4,100 Bytes
f0d69b8 9fb631c f0d69b8 9fb631c f0d69b8 9fb631c f0d69b8 ecb51fa f0d69b8 ecb51fa f0d69b8 ecb51fa f0d69b8 ecb51fa f0d69b8 9fb631c f0d69b8 765efa7 ecb51fa f0d69b8 9fb631c f0d69b8 9fb631c f0d69b8 9fb631c f0d69b8 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 | using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using TaskTrackingSystem.Database.AppDbContextModels;
using TaskTrackingSystem.Shared;
using TaskTrackingSystem.Shared.Models.AuditLog;
using TaskTrackingSystem.WebApi.Infrastructure;
namespace TaskTrackingSystem.WebApi.Features.Audit
{
[Route("api/[controller]")]
[ApiController]
[Authorize]
public class AuditLogController : ControllerBase
{
private readonly AppDbContext _db;
private readonly PermissionAuthorizationService _permissionAuthorizationService;
public AuditLogController(AppDbContext db, PermissionAuthorizationService permissionAuthorizationService)
{
_db = db;
_permissionAuthorizationService = permissionAuthorizationService;
}
[HttpGet]
[ProducesResponseType(typeof(PagedResult<AuditLogDto>), StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status401Unauthorized)]
public async Task<ActionResult> GetAuditLogs(
[FromQuery] string? search,
[FromQuery] PaginationQuery? paging = null)
{
if (!await _permissionAuthorizationService.CanAccessAsync(User, "api/AuditLog", "List"))
{
return Forbid();
}
var query = _db.AuditLogs
.Include(a => a.User)
.AsQueryable();
if (!string.IsNullOrWhiteSpace(search))
{
var searchLower = search.Trim().ToLower();
query = query.Where(a =>
a.Action.ToLower().Contains(searchLower) ||
a.Module.ToLower().Contains(searchLower) ||
a.Description.ToLower().Contains(searchLower) ||
(a.User != null && (a.User.Username.ToLower().Contains(searchLower) ||
(a.User.FirstName + " " + a.User.LastName).ToLower().Contains(searchLower))) ||
(a.IpAddress != null && a.IpAddress.ToLower().Contains(searchLower))
);
}
if (paging == null || (!paging.Page.HasValue && !paging.Limit.HasValue))
{
var fullLogs = await query
.OrderByDescending(a => a.CreatedAt)
.Select(a => new AuditLogDto
{
Id = a.Id,
UserId = a.UserId,
Username = a.User != null ? a.User.Username : "System",
UserFullName = a.User != null ? $"{a.User.FirstName} {a.User.LastName}" : "System",
Action = a.Action,
Module = a.Module,
Description = a.Description,
IpAddress = a.IpAddress,
CreatedAt = a.CreatedAt ?? System.DateTime.UtcNow
})
.ToListAsync();
return Ok(fullLogs);
}
var page = PaginationExtensions.NormalizePage(paging.Page);
var limit = PaginationExtensions.NormalizePageSize(paging.Limit ?? 0);
var pagedLogs = await query
.OrderByDescending(a => a.CreatedAt)
.Select(a => new AuditLogDto
{
Id = a.Id,
UserId = a.UserId,
Username = a.User != null ? a.User.Username : "System",
UserFullName = a.User != null ? $"{a.User.FirstName} {a.User.LastName}" : "System",
Action = a.Action,
Module = a.Module,
Description = a.Description,
IpAddress = a.IpAddress,
CreatedAt = a.CreatedAt ?? System.DateTime.UtcNow
})
.ToPagedResultAsync(page, limit);
return Ok(pagedLogs);
}
}
}
|