< Summary

Information
Class: OzonOrdersWeb.Areas.Admin.Controllers.AuditLogController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Controllers/AuditLogController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 27
Coverable lines: 27
Total lines: 65
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 14
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%210%
Index()0%620%
Grid()0%2040%
GridFacets()0%4260%
Details()0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Admin/Controllers/AuditLogController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc;
 2using Microsoft.EntityFrameworkCore;
 3using OzonOrdersWeb.WebServices.Admin;
 4using OzonOrdersWeb.WebServices.Grid;
 5using OzonRepositories.Context;
 6
 7namespace OzonOrdersWeb.Areas.Admin.Controllers;
 8
 9/// <summary>
 10/// Журнал аудита изменений системы прав: серверный грид AG Grid (фильтры, сортировка, фасеты — на сервере).
 11/// </summary>
 12public class AuditLogController : AdminAreaControllerBase
 13{
 14    private readonly ApplicationDbContext _db;
 015    public AuditLogController(ApplicationDbContext db) { _db = db; }
 16
 17    /// <summary>Каркас журнала: строки грузит серверный грид (Grid/GridFacets).</summary>
 18    public IActionResult Index()
 19    {
 020        ViewData["Title"] = "Журнал изменений";
 021        ViewData["Breadcrumb"] = new List<(string, string?)> { ("Админка", Url.Action("Index", "Home")), ("Журнал", null
 22        // Только query-строка: параметр «action» у действия связывается со значением маршрута (Index).
 023        ViewBag.F = new[] { "action", "entity", "user" }.ToDictionary(k => k, k => (string?)Request.Query[k].ToString())
 024        return View();
 25    }
 26
 27    /// <summary>Блок строк журнала для AG Grid Infinite Row Model (фильтры, сортировка, поиск — по всему журналу).</sum
 28    [HttpPost]
 29    [ValidateAntiForgeryToken]
 30    public async Task<IActionResult> Grid([FromBody] ServerGridRequest? request, CancellationToken ct)
 31    {
 032        var error = ServerGridQuery.Validate(request);
 033        if (error != null) return BadRequest(new { success = false, error });
 34
 035        var query = AdminAuditGridDefinition.ApplyParams(_db.AuditLogEntries.AsNoTracking(), request!.Params);
 036        var (items, total) = await ServerGridQuery.PageAsync(query, AdminAuditGridDefinition.Entries, request, ct);
 037        var rows = items.Select(e => new { e.Id, e.Timestamp, e.ActorUserName, e.Action, e.EntityType, e.EntityId, e.IpA
 038        var lastRow = request.StartRow + rows.Count >= total ? total : -1;
 039        return Ok(new { success = true, rows, totalCount = total, lastRow });
 040    }
 41
 42    /// <summary>Счётчики значений set-фильтров журнала (действие, сущность, пользователь).</summary>
 43    [HttpPost]
 44    [ValidateAntiForgeryToken]
 45    public async Task<IActionResult> GridFacets([FromBody] ServerGridRequest? request, CancellationToken ct)
 46    {
 047        if (request is null || string.IsNullOrWhiteSpace(request.ColId)) return BadRequest(new { success = false, error 
 048        request.StartRow = 0;
 049        request.EndRow = 1;
 050        var error = ServerGridQuery.Validate(request);
 051        if (error != null) return BadRequest(new { success = false, error });
 52
 053        var query = AdminAuditGridDefinition.ApplyParams(_db.AuditLogEntries.AsNoTracking(), request.Params);
 054        var values = await ServerGridQuery.FacetsAsync(query, AdminAuditGridDefinition.Entries, request, ct);
 055        return Ok(new { success = true, values });
 056    }
 57
 58    public async Task<IActionResult> Details(long id, CancellationToken ct)
 59    {
 060        var e = await _db.AuditLogEntries.FirstOrDefaultAsync(x => x.Id == id, ct);
 061        if (e == null) return NotFound();
 062        ViewData["Title"] = $"Запись #{e.Id}";
 063        return View(e);
 064    }
 65}