[AZ-1132] [AZ-1133] Cycle 15 closeout and cycle 16 task setup

Doc ripple for FluentValidation bump, cycle 15 retro, and AZ-1133
perf preflight task queued for cycle 16.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Oleksandr Bezdieniezhnykh
2026-06-26 17:50:29 +03:00
parent 24b8aa3076
commit fb9e3ee31a
10 changed files with 190 additions and 11 deletions
@@ -14,7 +14,7 @@ Defines the uniform RFC 7807 ProblemDetails / ValidationProblemDetails shape eve
The contract is enforced by two collaborating pieces of shared infrastructure:
1. **Deserializer-level rejection**`JsonSerializerOptions.UnmappedMemberHandling.Disallow` (.NET 8+) catches unknown fields, type mismatches, and malformed JSON. The framework's `BadHttpRequestException` carries a `System.Text.Json.JsonException` as its inner exception; `GlobalExceptionHandler` (`SatelliteProvider.Api/GlobalExceptionHandler.cs`) extracts the JSON path and emits a `ValidationProblemDetails` body.
2. **Business-rule rejection**`FluentValidation` (12.0.0) validators wired through the generic `ValidationEndpointFilter<T>` (`SatelliteProvider.Api/Validators/ValidationEndpointFilter.cs`). Endpoints opt in via `RouteHandlerBuilder.WithValidation<T>()`. The filter calls `Results.ValidationProblem(result.ToDictionary())`, which produces an identically-shaped body.
2. **Business-rule rejection**`FluentValidation` (12.1.1) validators wired through the generic `ValidationEndpointFilter<T>` (`SatelliteProvider.Api/Validators/ValidationEndpointFilter.cs`). Endpoints opt in via `RouteHandlerBuilder.WithValidation<T>()`. The filter calls `Results.ValidationProblem(result.ToDictionary())`, which produces an identically-shaped body.
Both paths produce `Content-Type: application/problem+json`. Both populate the same `errors` map keyed by request-body field path.