diff --git a/Installers/InstallFilters.cs b/Installers/InstallFilters.cs new file mode 100644 index 0000000..686fa09 --- /dev/null +++ b/Installers/InstallFilters.cs @@ -0,0 +1,21 @@ +using Diary.Shared; +using Microsoft.AspNetCore.Mvc; + +namespace Diary.Installers +{ + public static class InstallFilters + { + public static void AddFilters(this IServiceCollection services) + { + services + .Configure(opt => + { + opt.SuppressModelStateInvalidFilter = true; + }) + .AddControllers(opt => + { + opt.Filters.Add(); + }); + } + } +} \ No newline at end of file diff --git a/Program.cs b/Program.cs index ea1d753..0aa37cb 100644 --- a/Program.cs +++ b/Program.cs @@ -10,17 +10,16 @@ using System.Reflection; /* - * Settings - Done by sefaulr + * Settings - Done * Logging - Done - * Database - Donw - * Dependencies + * Database - Done * Automapper - Done * Cors - * Views/Filters/Validation + * Views * Swagger - Done * Auth * Exception Middleware - Done - * Validation Filter + * Validation Filter - Done * */ //+Setup Logger @@ -59,6 +58,7 @@ builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly()); builder.Services.AddControllers(); builder.Services.AddExceptionsMiddleware(); +builder.Services.AddFilters(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); diff --git a/Shared/ValidationFilter.cs b/Shared/ValidationFilter.cs new file mode 100644 index 0000000..7179402 --- /dev/null +++ b/Shared/ValidationFilter.cs @@ -0,0 +1,43 @@ +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.Filters; +using Microsoft.AspNetCore.Mvc.ModelBinding; + +namespace Diary.Shared +{ + public class ValidationFilter : IAsyncActionFilter + { + public const string OverviewTitle = "The request is invalid."; + public const string OverviewMessage = "The request sent data that is not correct for the request."; + + public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next) + { + if (context.ModelState.IsValid) + { + await next(); + } + else + { + ValidationExceptionDetails errorObj = new() + { + Title = OverviewTitle, + Message = OverviewMessage, + ModelState = GetErrors(context.ModelState) + }; + context.Result = new BadRequestObjectResult(errorObj); + } + } + + private static List GetErrors(ModelStateDictionary modelState) + { + List errors = new(); + + return modelState.Where(ms => ms.Value?.Errors.Count > 0) + .Select(x => new ValidationProblemDescriptor + { + Property = x.Key, + Errors = x.Value?.Errors.Select(e => e.ErrorMessage).ToArray() + }) + .ToList(); + } + } +} \ No newline at end of file