Offside.FastEndpoint é o único pacote Offside que referencia FastEndpoints. Falhas de validação e falhas de Result viram o mesmo documento OffsideProblem.
dotnet add package Offside
dotnet add package Offside.AspNetCore
dotnet add package Offside.FastEndpoint
Targets: net8.0, net10.0. Exige FastEndpoints 8.3 ou superior.
builder.Services.AddOffside(options => { /* catálogos */ });
builder.Services.AddOffsideAspNetCore();
builder.Services.AddFastEndpoints();
app.UseFastEndpoints(c => c.UseOffside());
UseOffside faz quatro coisas:
Errors.ResponseBuilder para serializar falhas FluentValidation como OffsideProblem.Errors.ProducesMetadataType como typeof(OffsideProblem).Errors.ContentType como application/problem+json.Produces<OffsideProblem> para cada status Offside (400, 401, 403, 404, 409, 410, 412, 422, 429, 500, 503, 504) em todos os endpoints.O FastEndpoints não expõe o Endpoints.Configurator anterior a outros assemblies. Se já tiver um, passe-o:
app.UseFastEndpoints(c => c.UseOffside(ep =>
{
ep.AllowAnonymous();
}));
Não atribua c.Endpoints.Configurator depois de UseOffside — isso substitui os metadados Offside.
Health e outros endpoints que não devem anunciar status de erro Offside:
public override void Configure()
{
Get("/health");
Definition.DontProduceOffside();
}
public override Task HandleAsync(CancellationToken ct) =>
orders.Get(id).SendOffsideAsync(HttpContext, ct);
Sucesso é 204 para Result e 200 com o valor para Result<T>. Falha é o documento de problema Offside habitual.
Use .WithErrorCode("email.required") para a chave do catálogo (Error.Code). O identificador de tela desses erros é VALIDATION. Ver FluentValidation.
AddError / ThrowError sem propriedade no FastEndpoints definem PropertyName como GeneralErrorsField (default "GeneralErrors"). O Offside trata isso como erro sem campo (field: null). Validação de classe do FluentValidation (PropertyName vazio) segue o mesmo caminho. Com LegacyAliases ligado, errors[].name é "generalErrors", não "GeneralErrors".