diff --git a/backend/Directory.Packages.props b/backend/Directory.Packages.props
index 55b277f..022fa01 100644
--- a/backend/Directory.Packages.props
+++ b/backend/Directory.Packages.props
@@ -6,6 +6,8 @@
+
+
diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs b/backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs
index 9c0644a..2b0d5a8 100644
--- a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs
+++ b/backend/src/Tnsu.ApprovalRoute.Api/Controllers/RequestTypesController.cs
@@ -20,11 +20,11 @@ public sealed class RequestTypesController(RequestTypeService service) : Control
[HttpPost]
public async Task Create(CreateRequestTypeRequest body, CancellationToken ct) =>
- (await service.CreateAsync(body.Name, body.PageUrl, ct)).ToActionResult();
+ (await service.CreateAsync(body, ct)).ToActionResult();
[HttpPut("{id:guid}")]
public async Task Update(Guid id, UpdateRequestTypeRequest body, CancellationToken ct) =>
- (await service.UpdateAsync(id, body.Name, body.PageUrl, ct)).ToActionResult();
+ (await service.UpdateAsync(id, body, ct)).ToActionResult();
[HttpDelete("{id:guid}")]
public async Task Delete(Guid id, CancellationToken ct) =>
diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs b/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs
index 473034f..368d8a7 100644
--- a/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs
+++ b/backend/src/Tnsu.ApprovalRoute.Api/Controllers/TemplateRoutesController.cs
@@ -2,7 +2,6 @@ using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Tnsu.ApprovalRoute.Api.Common;
using Tnsu.ApprovalRoute.Application.TemplateRoutes;
-using Tnsu.ApprovalRoute.Domain.Enums;
namespace Tnsu.ApprovalRoute.Api.Controllers;
@@ -12,13 +11,8 @@ namespace Tnsu.ApprovalRoute.Api.Controllers;
public sealed class TemplateRoutesController(TemplateRouteService service) : ControllerBase
{
[HttpGet("resolve")]
- public async Task Resolve(
- [FromQuery] Guid requestTypeId,
- [FromQuery] string? userEmail,
- [FromQuery] Guid? projectId,
- [FromQuery] RouteStepStatus status,
- CancellationToken ct) =>
- (await service.ResolveAsync(requestTypeId, userEmail, projectId, status, ct)).ToActionResult();
+ public async Task Resolve([FromQuery] ResolveTemplateRouteRequest request, CancellationToken ct) =>
+ (await service.ResolveAsync(request, ct)).ToActionResult();
[HttpGet]
public async Task List([FromQuery] Guid? requestTypeId, CancellationToken ct) =>
diff --git a/backend/src/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs b/backend/src/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs
new file mode 100644
index 0000000..ff4ecf4
--- /dev/null
+++ b/backend/src/Tnsu.ApprovalRoute.Api/Filters/ValidationActionFilter.cs
@@ -0,0 +1,35 @@
+using FluentValidation;
+using Microsoft.AspNetCore.Mvc;
+using Microsoft.AspNetCore.Mvc.Filters;
+
+namespace Tnsu.ApprovalRoute.Api.Filters;
+
+// Валидирует аргументы action'ов, для которых зарегистрирован IValidator — без валидации внутри сервисов.
+public sealed class ValidationActionFilter(IServiceProvider serviceProvider) : IAsyncActionFilter
+{
+ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ {
+ foreach (var argument in context.ActionArguments.Values)
+ {
+ if (argument is null)
+ continue;
+
+ var validatorType = typeof(IValidator<>).MakeGenericType(argument.GetType());
+ if (serviceProvider.GetService(validatorType) is not IValidator validator)
+ continue;
+
+ var validationContext = new ValidationContext