DamianEdwards / MiniValidation

A minimalist validation library for .NET built atop the existing features in `System.ComponentModel.DataAnnotations` namespace
MIT License
321 stars 25 forks source link

Error when calling post from Swagger #29

Closed Peppe426 closed 2 years ago

Peppe426 commented 2 years ago

API

app.MapPost("/register", async Task<IResult> (RegisterRequest request) =>
{
    if (MiniValidator.TryValidate(request, out var errors) is false)
    {
        return Results.ValidationProblem(errors);
    }
    if (request == null)
        return Results.BadRequest();

    await _identityProvider.Register(request);

    return Results.Ok(request.Email);
})

Request body

{
  "email": "user@example.com",
  "password": "string",
  "confirmPassword": "string",
  "returnUrl": "string"  
}

Register request model

public class RegisterRequest
{
    [Required]
    [EmailAddress]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} and at max {1} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }

    public string? ReturnUrl { get; set; }
    public List<AuthenticationScheme>? ExternalLogins { get; set; }

}

Error message 500 internal server error. TypeDetailsCache

System.InvalidOperationException: This operation is only valid on generic types.

   at System.RuntimeType.GetGenericTypeDefinition()

   at MiniValidation.TypeDetailsCache.GetEnumerableType(Type type) in /_/src/MiniValidation/TypeDetailsCache.cs:line 120

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 38

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 79

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 66

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 66

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 79

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 79

   at MiniValidation.TypeDetailsCache.Visit(Type type, HashSet`1 visited) in /_/src/MiniValidation/TypeDetailsCache.cs:line 66

   at MiniValidation.TypeDetailsCache.Visit(Type type) in /_/src/MiniValidation/TypeDetailsCache.cs:line 33

   at MiniValidation.TypeDetailsCache.Get(Type type) in /_/src/MiniValidation/TypeDetailsCache.cs:line 24

   at MiniValidation.MiniValidator.TryValidateImpl(Object target, Boolean recurse, Dictionary`2 workingErrors, Dictionary`2 validatedObjects, List`1 validationResults, String prefix, Int32 currentDepth) in /_/src/MiniValidation/MiniValidator.cs:line 86

   at MiniValidation.MiniValidator.TryValidate(Object target, Boolean recurse, IDictionary`2& errors) in /_/src/MiniValidation/MiniValidator.cs:line 58

   at MiniValidation.MiniValidator.TryValidate(Object target, IDictionary`2& errors) in /_/src/MiniValidation/MiniValidator.cs:line 38

   at Program.<>c__DisplayClass0_0.<<<Main>$>b__8>d.MoveNext() in C:\develop\Identity.Identity.Provider\Identity.Provider.Api\Program.cs:line 94

--- End of stack trace from previous location ---

   at Microsoft.AspNetCore.Http.RequestDelegateFactory.ExecuteTaskResult[T](Task`1 task, HttpContext httpContext)

   at Microsoft.AspNetCore.Http.RequestDelegateFactory.<>c__DisplayClass46_3.<<HandleRequestBodyAndCompileRequestDelegate>b__2>d.MoveNext()

--- End of stack trace from previous location ---

   at Microsoft.AspNetCore.Routing.EndpointMiddleware.<Invoke>g__AwaitRequestTask|6_0(Endpoint endpoint, Task requestTask, ILogger logger)

   at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)

   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)

   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)

   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)
DamianEdwards commented 2 years ago

Thanks for the bug report, I'll take a look.

DamianEdwards commented 2 years ago

This fix is now available in release 0.5.1-pre.20220429.53