diff --git a/AsbCloudApp/Exceptions/ArgumentInvalidException.cs b/AsbCloudApp/Exceptions/ArgumentInvalidException.cs index b8014098..4b1abd34 100644 --- a/AsbCloudApp/Exceptions/ArgumentInvalidException.cs +++ b/AsbCloudApp/Exceptions/ArgumentInvalidException.cs @@ -1,11 +1,13 @@ using System; +using AsbCloudApp.Exceptions.Interfaces; namespace AsbCloudApp.Exceptions { /// /// Argument validation fail Exception /// - public class ArgumentInvalidException : Exception + public class ArgumentInvalidException : Exception, + IHasValidation { /// /// название аргумента @@ -27,7 +29,7 @@ namespace AsbCloudApp.Exceptions /// преобразование в объект валидации /// /// - public object ToValaidationErrorObject() + public object ToValidationErrorObject() => MakeValidationError(ParamName, Message); /// diff --git a/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs b/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs new file mode 100644 index 00000000..afc38b03 --- /dev/null +++ b/AsbCloudApp/Exceptions/ArgumentsInvalidException.cs @@ -0,0 +1,47 @@ +using System; +using AsbCloudApp.Exceptions.Interfaces; + +namespace AsbCloudApp.Exceptions; + +/// +/// Èñêëþ÷åíèå äëÿ íåñêîëüêèõ íåâàëèäíûõ àãðóìåíòîâ +/// +public class ArgumentsInvalidException : Exception, + IHasValidation +{ + /// + /// Èìåíà ïàðàìåòðîâ + /// + public string[] ParamNames { get; } = Array.Empty(); + + /// + /// Êîíòñðóêòîð èñêëþ÷åíèÿ + /// + /// + /// + public ArgumentsInvalidException(string message, + string[] paramNames) + { + ParamNames = paramNames; + } + + /// + /// ïðåîáðàçîâàíèå â îáúåêò âàëèäàöèè + /// + /// + public object ToValidationErrorObject() + => MakeValidationError(ParamNames, Message); + + /// + /// ôàáðèêà îáúåêòà âàëèäàöèè + /// + /// + /// + /// + public static object MakeValidationError(string[] paramNames, params string[] errors) + => new + { + names = paramNames, + errors, + }; +} \ No newline at end of file diff --git a/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs b/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs new file mode 100644 index 00000000..c4759b1b --- /dev/null +++ b/AsbCloudApp/Exceptions/Interfaces/IHasValidation.cs @@ -0,0 +1,13 @@ +namespace AsbCloudApp.Exceptions.Interfaces; + +/// +/// Èíòåðôåéñ ìàðêåð äëÿ èñêëþ÷åíèé +/// +public interface IHasValidation +{ + /// + /// ïðåîáðàçîâàíèå â îáúåêò âàëèäàöèè + /// + /// + object ToValidationErrorObject(); +} \ No newline at end of file diff --git a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs index 589d8f9f..55e8c67c 100644 --- a/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs +++ b/AsbCloudWebApi/Middlewares/SimplifyExceptionsMiddleware.cs @@ -3,6 +3,7 @@ using Microsoft.AspNetCore.Http; using System; using System.IO; using System.Threading.Tasks; +using AsbCloudApp.Exceptions.Interfaces; namespace AsbCloudWebApi.Middlewares { @@ -30,6 +31,15 @@ namespace AsbCloudWebApi.Middlewares var body = MakeJsonBody(ex); await context.Response.WriteAsync(body); } + catch (ArgumentsInvalidException ex) + { + Console.WriteLine($"ArgumentExceptions in {context.Request.Method}: {ex.Message}"); + context.Response.Clear(); + context.Response.StatusCode = 400; + context.Response.ContentType = "application/json"; + var body = MakeJsonBody(ex); + await context.Response.WriteAsync(body); + } catch (ForbidException ex) { Console.WriteLine($"ForbidException in {context.Request.Method}: {ex.Message}"); @@ -49,9 +59,10 @@ namespace AsbCloudWebApi.Middlewares } } - private static string MakeJsonBody(ArgumentInvalidException ex) + private static string MakeJsonBody(TException ex) + where TException: Exception, IHasValidation { - object error = ex.ToValaidationErrorObject(); + object error = ex.ToValidationErrorObject(); var buffer = System.Text.Json.JsonSerializer.Serialize(error); return buffer; }