diff --git a/WebApi/Endpoints/PlayListEndpoints.cs b/WebApi/Endpoints/PlayListEndpoints.cs index a85560c..da800c5 100644 --- a/WebApi/Endpoints/PlayListEndpoints.cs +++ b/WebApi/Endpoints/PlayListEndpoints.cs @@ -12,8 +12,7 @@ public static class PlayListEndpoints public static IEndpointRouteBuilder MapPlayListEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/playlists") - .WithTags("PlayLists") - .AddEndpointFilter(); + .WithTags("PlayLists"); group.MapGet("/", GetPlayLists) .WithName("GetPlayLists") @@ -29,11 +28,13 @@ public static class PlayListEndpoints group.MapPost("/users/{userId}", CreatePlayList) .WithName("CreatePlayList") - .WithSummary("Create a new playlist."); + .WithSummary("Create a new playlist.") + .AddEndpointFilter>(); group.MapPut("/{playlistId}/users/{userId}", UpdatePlayList) .WithName("UpdatePlayList") - .WithSummary("Update an existing playlist."); + .WithSummary("Update an existing playlist.") + .AddEndpointFilter>(); group.MapDelete("/{playlistId}/users/{userId}", DeletePlayList) .WithName("DeletePlayList") @@ -41,7 +42,8 @@ public static class PlayListEndpoints group.MapPost("/upload-picture/users/{userId}", RequestPlayListPictureUpload) .WithName("RequestPlayListPictureUpload") - .WithSummary("Request a pre-signed URL to upload a playlist picture."); + .WithSummary("Request a pre-signed URL to upload a playlist picture.") + .AddEndpointFilter>(); return app; } diff --git a/WebApi/Endpoints/TrackEndpoints.cs b/WebApi/Endpoints/TrackEndpoints.cs index c44e8f5..4ac35e1 100644 --- a/WebApi/Endpoints/TrackEndpoints.cs +++ b/WebApi/Endpoints/TrackEndpoints.cs @@ -12,8 +12,7 @@ public static class TrackEndpoints public static IEndpointRouteBuilder MapTrackEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/tracks") - .WithTags("Tracks") - .AddEndpointFilter(); + .WithTags("Tracks"); group.MapGet("/", GetTracks) .WithName("GetTracks") @@ -29,7 +28,8 @@ public static class TrackEndpoints group.MapPost("/users/{userId}", CreateTrack) .WithName("CreateTrack") - .WithSummary("Create a new track."); + .WithSummary("Create a new track.") + .AddEndpointFilter>(); group.MapDelete("/{trackId}/users/{userId}", DeleteTrack) .WithName("DeleteTrack") @@ -37,7 +37,8 @@ public static class TrackEndpoints group.MapPost("/upload-urls/users/{userId}", RequestTrackUploadUrls) .WithName("RequestTrackUploadUrls") - .WithSummary("Request pre-signed URLs to upload track picture and audio."); + .WithSummary("Request pre-signed URLs to upload track picture and audio.") + .AddEndpointFilter>(); return app; } diff --git a/WebApi/Endpoints/UserEndpoints.cs b/WebApi/Endpoints/UserEndpoints.cs index d123eab..daec332 100644 --- a/WebApi/Endpoints/UserEndpoints.cs +++ b/WebApi/Endpoints/UserEndpoints.cs @@ -12,8 +12,7 @@ public static class UserEndpoints public static IEndpointRouteBuilder MapUserEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/users") - .WithTags("Users") - .AddEndpointFilter(); + .WithTags("Users"); group.MapGet("/", GetUsers) .WithName("GetUsers") @@ -29,7 +28,8 @@ public static class UserEndpoints group.MapPost("/", CreateUser) .WithName("CreateUser") - .WithSummary("Create a new user."); + .WithSummary("Create a new user.") + .AddEndpointFilter>(); return app; } diff --git a/WebApi/Filters/ValidationFilter.cs b/WebApi/Filters/ValidationFilter.cs index 2f57d1f..fe8e7e7 100644 --- a/WebApi/Filters/ValidationFilter.cs +++ b/WebApi/Filters/ValidationFilter.cs @@ -2,27 +2,19 @@ using FluentValidation; namespace WebApi.Filters; -public sealed class ValidationFilter : IEndpointFilter +public sealed class ValidationFilter(IValidator validator) : IEndpointFilter where T : class { public async ValueTask InvokeAsync(EndpointFilterInvocationContext context, EndpointFilterDelegate next) { - foreach (var argument in context.Arguments) - { - if (argument is null) - continue; + var argument = context.Arguments.OfType().FirstOrDefault(); - var validatorType = typeof(IValidator<>).MakeGenericType(argument.GetType()); + if (argument is null) + return await next(context); - if (context.HttpContext.RequestServices.GetService(validatorType) is not IValidator validator) - continue; + var result = await validator.ValidateAsync(argument, context.HttpContext.RequestAborted); - var validationContext = new ValidationContext(argument); - var result = await validator.ValidateAsync(validationContext, context.HttpContext.RequestAborted); - - if (!result.IsValid) - return Results.ValidationProblem(result.ToDictionary()); - } - - return await next(context); + return result.IsValid + ? await next(context) + : Results.ValidationProblem(result.ToDictionary()); } -} +} \ No newline at end of file