< Summary

Information
Class: OzonOrdersWeb.Observability.InvalidModelStatePageFilter
Assembly: OzonOrdersWeb
File(s): /home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Observability/InvalidModelStatePageFilter.cs
Line coverage
0%
Covered lines: 0
Uncovered lines: 28
Coverable lines: 28
Total lines: 46
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 8
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%
OnPageHandlerSelectionAsync(...)100%210%
OnPageHandlerExecutionAsync()0%2040%

File(s)

/home/runner/work/Studio2Prod/Studio2Prod/OzonOrdersWeb/Observability/InvalidModelStatePageFilter.cs

#LineLine coverage
 1using Microsoft.AspNetCore.Mvc.Filters;
 2
 3namespace OzonOrdersWeb.Observability;
 4
 05public sealed class InvalidModelStatePageFilter(ILogger<InvalidModelStatePageFilter> logger) : IAsyncPageFilter
 6{
 07    public Task OnPageHandlerSelectionAsync(PageHandlerSelectedContext context) => Task.CompletedTask;
 8
 9    public async Task OnPageHandlerExecutionAsync(
 10        PageHandlerExecutingContext context,
 11        PageHandlerExecutionDelegate next)
 12    {
 013        if (!context.ModelState.IsValid)
 14        {
 015            var errors = context.ModelState
 016                .Where(pair => pair.Value is { Errors.Count: > 0 })
 017                .ToDictionary(
 018                    pair => pair.Key,
 019                    pair => pair.Value!.Errors.Select(error =>
 020                        string.IsNullOrWhiteSpace(error.ErrorMessage)
 021                            ? error.Exception?.GetType().Name ?? "ValidationError"
 022                            : error.ErrorMessage).ToArray());
 23
 024            var summary = string.Join("; ", errors.Take(3).Select(e => $"{e.Key}: {string.Join(", ", e.Value)}"));
 025            if (errors.Count > 3)
 26            {
 027                summary += $" (+{errors.Count - 3} ещё)";
 28            }
 29
 030            using var scope = logger.BeginScope(new Dictionary<string, object?>
 031            {
 032                ["EventKind"] = "FormValidationFailed",
 033                ["EventCategory"] = "forms",
 034                ["RequestPath"] = context.HttpContext.Request.Path.Value,
 035                ["HttpMethod"] = context.HttpContext.Request.Method,
 036                ["Page"] = context.ActionDescriptor.DisplayName,
 037                ["TraceId"] = context.HttpContext.TraceIdentifier,
 038                ["ValidationErrors"] = errors
 039            });
 040            logger.LogWarning("Razor Page форма {Method} {Path} не прошла серверную валидацию: {ValidationSummary}",
 041                context.HttpContext.Request.Method, context.HttpContext.Request.Path, summary);
 42        }
 43
 044        await next();
 045    }
 46}