< Summary

Information
Class: OzonOrdersWeb.Areas.Studio2.Controllers.ApiSupplierRequestAuditController
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/ApiSupplierRequestAuditController.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 36
Coverable lines: 36
Total lines: 80
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()100%210%
GridRows()0%4260%
GridFacets()0%4260%
Details()0%620%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Areas/Studio2/Controllers/ApiSupplierRequestAuditController.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Authorization;
 2using Microsoft.AspNetCore.Mvc;
 3using Microsoft.EntityFrameworkCore;
 4using OzonDomains.Models.Authorization.Enums;
 5using OzonOrdersWeb.Authorization;
 6using OzonOrdersWeb.WebServices.Grid;
 7using OzonOrdersWeb.WebServices.Journals;
 8using OzonRepositories.Context;
 9
 10namespace OzonOrdersWeb.Areas.Studio2.Controllers;
 11
 12/// <summary>
 13/// Журнал вызовов API-поставщиков: каркас страницы, серверный грид (сотни тысяч строк) и запрос/ответ одной записи.
 14/// </summary>
 15[Area("Studio2")]
 16[Authorize(Roles = "User,Admin")]
 17[Route("Studio2/ApiSupplierRequestAudit")]
 18public sealed class ApiSupplierRequestAuditController : Controller
 19{
 20    private const string PageCode = "Studio2.ApiSupplierRequestAudit.Index";
 21    private readonly ApplicationDbContext _db;
 22
 023    public ApiSupplierRequestAuditController(ApplicationDbContext db) => _db = db;
 24
 25    [HttpGet("")]
 026    public IActionResult Index() => View();
 27
 28    [HttpPost("grid")]
 29    [ValidateAntiForgeryToken]
 30    [PageAuthorize(PageCode, AccessType.View)]
 31    public async Task<IActionResult> GridRows([FromBody] ServerGridRequest? request, CancellationToken cancellationToken
 32    {
 033        var error = ServerGridQuery.Validate(request);
 034        if (error != null) return BadRequest(new { success = false, error });
 35
 036        var def = JournalGridDefinitions.ApiSupplierAudit;
 037        var filtered = ServerGridQuery.ApplyFilters(_db.ApiSupplierRequestAuditEntries.AsNoTracking(), def, request!);
 038        var total = await filtered.CountAsync(cancellationToken);
 039        var start = Math.Max(0, request!.StartRow);
 040        var take = Math.Clamp(request.EndRow - start, 1, ServerGridQuery.MaxBlockSize);
 041        var rows = start >= total
 042            ? []
 043            : await ServerGridQuery.ApplySort(filtered, def, request.SortModel).Skip(start).Take(take)
 044                .Select(x => new
 045                {
 046                    x.Id, x.OccurredAtUtc, x.ProviderKey, x.IsSuccess, x.StatusCode, x.Method, x.Endpoint, x.Source, x.A
 047                    x.DurationMs
 048                })
 049                .ToListAsync(cancellationToken);
 050        var lastRow = start + rows.Count >= total ? total : -1;
 051        return Ok(new { success = true, rows, totalCount = total, lastRow });
 052    }
 53
 54    [HttpPost("grid/facets")]
 55    [ValidateAntiForgeryToken]
 56    [PageAuthorize(PageCode, AccessType.View)]
 57    public async Task<IActionResult> GridFacets([FromBody] ServerGridRequest? request, CancellationToken cancellationTok
 58    {
 059        if (request is null || string.IsNullOrWhiteSpace(request.ColId)) return BadRequest(new { success = false, error 
 060        request.StartRow = 0;
 061        request.EndRow = 1;
 062        var error = ServerGridQuery.Validate(request);
 063        if (error != null) return BadRequest(new { success = false, error });
 064        var values = await ServerGridQuery.FacetsAsync(_db.ApiSupplierRequestAuditEntries.AsNoTracking(),
 065            JournalGridDefinitions.ApiSupplierAudit, request, cancellationToken);
 066        return Ok(new { success = true, values });
 067    }
 68
 69    /// <summary>Запрос и ответ вызова (longtext) — по кнопке «Открыть», в строки грида не входят.</summary>
 70    [HttpGet("{id:long}")]
 71    [PageAuthorize(PageCode, AccessType.View)]
 72    public async Task<IActionResult> Details(long id, CancellationToken cancellationToken)
 73    {
 074        var entry = await _db.ApiSupplierRequestAuditEntries.AsNoTracking()
 075            .Where(x => x.Id == id)
 076            .Select(x => new { x.Id, x.Method, x.Endpoint, x.Request, x.Response })
 077            .FirstOrDefaultAsync(cancellationToken);
 078        return entry == null ? NotFound() : Ok(entry);
 079    }
 80}