From 65963419f7c506225a105ce13428c450ed40d317 Mon Sep 17 00:00:00 2001 From: Mikhail Trubnikov Date: Fri, 5 Jul 2024 12:42:01 +1000 Subject: [PATCH] feat(api): DistributorController --- PARR.API/Contracts/V1/ApiRoutes.cs | 10 +++ .../V1/Requests/DistributeRequest.cs | 7 ++ .../V1/Responses/TemplateResponse.cs | 1 + .../Controllers/V1/DistributorController.cs | 65 +++++++++++++++++++ .../DomainToResponseProfile.cs | 3 +- .../Validators/DistributeRequestValidator.cs | 24 +++++++ 6 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 PARR.API/Contracts/V1/Requests/DistributeRequest.cs create mode 100644 PARR.API/Controllers/V1/DistributorController.cs create mode 100644 PARR.API/Validators/DistributeRequestValidator.cs diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index dc91e5c7..4af58ae9 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -356,6 +356,16 @@ #endregion + + #region Distributor + + public static class Distributor + { + public const string Distribute = Base + "/distributor/"; + } + + #endregion + } } diff --git a/PARR.API/Contracts/V1/Requests/DistributeRequest.cs b/PARR.API/Contracts/V1/Requests/DistributeRequest.cs new file mode 100644 index 00000000..26b81422 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/DistributeRequest.cs @@ -0,0 +1,7 @@ +namespace PARR.API.Contracts.V1.Requests +{ + public class DistributeRequest + { + public Guid ApplicationInWorkId { get; set; } + } +} diff --git a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs index bdeb1b84..d3bc86ae 100644 --- a/PARR.API/Contracts/V1/Responses/TemplateResponse.cs +++ b/PARR.API/Contracts/V1/Responses/TemplateResponse.cs @@ -23,6 +23,7 @@ public DateTimeOffset? LastRun { get; set; } public DateTimeOffset NextRun { get; set; } + public bool IsAutoDistributionEnabled { get; set; } public HostTemplateResponse? Host { get; set; } diff --git a/PARR.API/Controllers/V1/DistributorController.cs b/PARR.API/Controllers/V1/DistributorController.cs new file mode 100644 index 00000000..0a529956 --- /dev/null +++ b/PARR.API/Controllers/V1/DistributorController.cs @@ -0,0 +1,65 @@ +using FluentValidation; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; +using PARR.API.Contracts.V1; +using PARR.API.Contracts.V1.Requests; +using PARR.API.Contracts.V1.Responses.Base; +using PARR.API.Controllers.V1.Base; +using PARR.API.Settings; +using PARR.BLL.Domain.Mq; +using PARR.BLL.Services.Interfaces; +using PARR.Constants; +using System.Text.Json; + +namespace PARR.API.Controllers.V1 +{ + /// + /// Распределитель РР + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class DistributorController : BaseApiController + { + private readonly IMqService mqService; + private readonly MqSettings mqSettings; + private readonly IValidator validator; + + public DistributorController( + IMqService mqService, + MqSettings mqSettings, + IValidator validator + ) + { + this.mqService = mqService; + this.mqSettings = mqSettings; + this.validator = validator; + } + + + /// + /// Перераспределить шаблоны для регламентной работы + /// + /// + [HttpPost(ApiRoutes.Distributor.Distribute)] + public async Task Distribute([FromBody] DistributeRequest request) + { + var resultValidate = await validator.ValidateAsync(request); + if (!resultValidate.IsValid) + return BadRequest(new Response(resultValidate.Errors)); + + var requestToMq = new TemplateDistributorMq + { + ApplicationInWorkId = request.ApplicationInWorkId + }; + + var msg = JsonSerializer.Serialize(requestToMq); + + var sendResult = mqService.Send(mqSettings.TemplateDistributor, new[] { msg }); + + if (sendResult.IsSuccess) + return Created("", new Response(null, true, new List(), "Отправлен запрос на перераспределение регламентных работ.")); + else + return BadRequest(new Response(false, new List { new ErrorModel { Message="Ошибка при отправке данных."} })); + + } + } +} diff --git a/PARR.API/MappingProfiles/DomainToResponseProfile.cs b/PARR.API/MappingProfiles/DomainToResponseProfile.cs index 937a912c..1101863a 100644 --- a/PARR.API/MappingProfiles/DomainToResponseProfile.cs +++ b/PARR.API/MappingProfiles/DomainToResponseProfile.cs @@ -37,7 +37,8 @@ namespace PARR.API.MappingProfiles //.ForMember(d => d.LastRun, o => o.MapFrom(s => s.ApplicationsInWork!.LastRun)) .ForMember(d => d.NextRun, o => o.MapFrom(s => s.NextRun)) .ForMember(d => d.LastRun, o => o.MapFrom(s => s.LastRun)) - .ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count())); + .ForMember(d => d.OrderCount, o => o.MapFrom(s => s.Orders.Count())) + .ForMember(d=>d.IsAutoDistributionEnabled, o=>o.MapFrom(s=>s.ApplicationsInWork!.IsAutoDistributionEnabled)); // === Template === diff --git a/PARR.API/Validators/DistributeRequestValidator.cs b/PARR.API/Validators/DistributeRequestValidator.cs new file mode 100644 index 00000000..2f051a46 --- /dev/null +++ b/PARR.API/Validators/DistributeRequestValidator.cs @@ -0,0 +1,24 @@ +using FluentValidation; +using PARR.API.Contracts.V1.Requests; +using PARR.DAL.Services.Interfaces; + +namespace PARR.API.Validators +{ + public class DistributeRequestValidator : AbstractValidator + { + private readonly IApplicationsInWorkService applicationsInWorkService; + + public DistributeRequestValidator(IApplicationsInWorkService applicationsInWorkService) + { + this.applicationsInWorkService = applicationsInWorkService; + + + RuleFor(t => t.ApplicationInWorkId).NotEmpty().MustAsync(async (entity, value, c) => + { + var appInWork = await applicationsInWorkService.GetAsync(value); + + return appInWork != null; + }).WithMessage("Недопустимое значение"); + } + } +}