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;
}