diff --git a/PARR.API/Contracts/V1/ApiRoutes.cs b/PARR.API/Contracts/V1/ApiRoutes.cs index 4af58ae9..c0fec12e 100644 --- a/PARR.API/Contracts/V1/ApiRoutes.cs +++ b/PARR.API/Contracts/V1/ApiRoutes.cs @@ -325,6 +325,18 @@ public const string getParam = "{id}"; } + + + /// + /// Активатор/деактиватор шаблонов/расписаний + /// + public static class TemplateActivator + { + public const string SendRequest = Base + "/jobs/" + appInWorkId + "/template-activator"; + + public const string appInWorkId = "{applicationInWorkId}"; + } + #endregion public static class Application diff --git a/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs b/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs new file mode 100644 index 00000000..f2e5ad87 --- /dev/null +++ b/PARR.API/Contracts/V1/Requests/TemplateActivatorRequest.cs @@ -0,0 +1,12 @@ +using PARR.Constants; + +namespace PARR.API.Contracts.V1.Requests +{ + public class TemplateActivatorRequest + { + /// + /// Действие по активации/деактивации + /// + public TemplateActivatorActionsEnum Action { get; set; } + } +} diff --git a/PARR.API/Controllers/V1/TemplateActivatorController.cs b/PARR.API/Controllers/V1/TemplateActivatorController.cs new file mode 100644 index 00000000..afa5feb7 --- /dev/null +++ b/PARR.API/Controllers/V1/TemplateActivatorController.cs @@ -0,0 +1,82 @@ +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.Services.Interfaces; +using PARR.API.Settings; +using PARR.BLL.Domain.Mq; +using PARR.BLL.Services.Interfaces; +using PARR.Constants; +using PARR.DAL.Services.Interfaces; +using System.Text.Json; + +namespace PARR.API.Controllers.V1 +{ + /// + /// Отправка запросов на активацию/деактивацию шаблонов/расписаний + /// + [Authorize(Roles = ParrRoles.Administrator.Role)] + public class TemplateActivatorController : BaseApiController + { + private readonly IValidator validator; + private readonly IMqService mqService; + private readonly IUriService uriService; + private readonly MqSettings mqSettings; + private readonly IApplicationsInWorkService applicationsInWorkService; + + public TemplateActivatorController( + IValidator validator, + IMqService mqService, + IUriService uriService, + MqSettings mqSettings, + IApplicationsInWorkService applicationsInWorkService + ) + { + this.validator = validator; + this.mqService = mqService; + this.uriService = uriService; + this.mqSettings = mqSettings; + this.applicationsInWorkService = applicationsInWorkService; + } + + + /// + /// Отправить запрос на активацию/деактивацию шаблонов/расписаний + /// + /// + /// + [HttpPost(ApiRoutes.TemplateActivator.SendRequest)] + public async Task SendRequest([FromRoute] Guid applicationInWorkId, [FromBody] TemplateActivatorRequest request) + { + var resultValidate = await validator.ValidateAsync(request); + if (!resultValidate.IsValid) + return BadRequest(new Response(resultValidate.Errors)); + + var appInWork = await applicationsInWorkService.GetAsync(applicationInWorkId); + + if (appInWork == null) + return BadRequest(new Response(false, new List { new ErrorModel { FieldName = nameof(applicationInWorkId), Message = "Некорректное значение" } })); + + + var mqRequest = new TemplateActivatorMq + { + ApplicationInWorkId = applicationInWorkId, + Action = request.Action + }; + + var msg = JsonSerializer.Serialize(mqRequest); + + var sendResult = mqService.Send(mqSettings.TemplateActivator, new[] { msg }); + + if (!sendResult.IsSuccess) + return BadRequest(new Response(false, new List { new ErrorModel { Message = $"Ошибка при отправке данных." } })); + + var createdUri = uriService.GetAllUri(ApiRoutes.Template.GetAll); + + return Created(createdUri, new Response(null, true, new List(), "Отправлен запрос активатору шаблонов/расписаний.")); + } + } +} diff --git a/PARR.API/Settings/MqSettings.cs b/PARR.API/Settings/MqSettings.cs index 7989cb5c..228178cb 100644 --- a/PARR.API/Settings/MqSettings.cs +++ b/PARR.API/Settings/MqSettings.cs @@ -6,6 +6,7 @@ namespace PARR.API.Settings { public MqGenerateTemplates GenerateTemplates { get; set; } = new MqGenerateTemplates(); public MqTemplateDistributor TemplateDistributor { get; set; } = new MqTemplateDistributor(); + public MqTemplateActivator TemplateActivator { get; set; } = new MqTemplateActivator(); public MqStatistics Statistics { get; set; } = new MqStatistics(); } @@ -25,6 +26,14 @@ namespace PARR.API.Settings public string Password { get; set; } = string.Empty; } + public class MqTemplateActivator : IMqSettings + { + public string HostName { get; set; } = string.Empty; + public string QueueName { get; set; } = string.Empty; + public string User { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + } + public class MqStatistics { public StatMqAuth StatMqAuth { get; set; } = new StatMqAuth(); diff --git a/PARR.API/Validators/TemplateActivatorRequestValidator.cs b/PARR.API/Validators/TemplateActivatorRequestValidator.cs new file mode 100644 index 00000000..539e10d8 --- /dev/null +++ b/PARR.API/Validators/TemplateActivatorRequestValidator.cs @@ -0,0 +1,16 @@ +using FluentValidation; +using PARR.API.Contracts.V1.Requests; +using PARR.Constants; + +namespace PARR.API.Validators +{ + public class TemplateActivatorRequestValidator : AbstractValidator + { + public TemplateActivatorRequestValidator() + { + RuleFor(t => t.Action).Must(action => + Enum.IsDefined(typeof(TemplateActivatorActionsEnum), action) + ).WithMessage("Некорректное значение action"); + } + } +} diff --git a/PARR.API/appsettings.Development.json b/PARR.API/appsettings.Development.json index b1f1d5d6..ba21738f 100644 --- a/PARR.API/appsettings.Development.json +++ b/PARR.API/appsettings.Development.json @@ -27,6 +27,9 @@ "TemplateDistributor": { "HostName": "10.99.253.216" }, + "TemplateActivator": { + "HostName": "10.99.253.216" + }, "Statistics": { "StatMqAuth": { "HostName": "10.99.253.216" diff --git a/PARR.API/appsettings.json b/PARR.API/appsettings.json index b940116a..bee17318 100644 --- a/PARR.API/appsettings.json +++ b/PARR.API/appsettings.json @@ -51,6 +51,12 @@ "User": "template_distributor_writer", "Password": "KGgsdfu%%44qqwew" }, + "TemplateActivator": { + "HostName": "parr-rabbitmq", + "QueueName": "parr-template-activator", + "User": "template_activator_writer", + "Password": "Gfkjhsdg*%fsdf" + }, "Statistics": { "StatMqAuth": { "HostName": "parr-rabbitmq", diff --git a/PARR.Constants/TemplateActivatorActionsEnum.cs b/PARR.Constants/TemplateActivatorActionsEnum.cs index 0f5c070c..661577dd 100644 --- a/PARR.Constants/TemplateActivatorActionsEnum.cs +++ b/PARR.Constants/TemplateActivatorActionsEnum.cs @@ -8,42 +8,42 @@ /// /// Активировать все шаблоны /// - ActivateAllTemplates, + ActivateAllTemplates = 0, /// /// Активировать шаблоны у которых активировано расписание /// - ActivateTemplatesWithActiveSchedules, - + ActivateTemplatesWithActiveSchedules = 1, + /// /// Деактивировать все шаблоны /// - DeactivateAllTemplates, + DeactivateAllTemplates = 2, /// /// Деактивировать шаблоны у которынх деактивировано расписание /// - DeactivateTemplatesWithDeactivationSchedules, + DeactivateTemplatesWithDeactivationSchedules = 3, /// /// Активировать все расписания /// - ActivateAllSchedules, + ActivateAllSchedules = 4, /// /// Деактивировать все расписания /// - DeactivateAllSchedules, + DeactivateAllSchedules = 5, /// /// Активировать все расписания у которых активированы шаблоны /// - ActivateSchedulesWithActiveTemplates, + ActivateSchedulesWithActiveTemplates = 6, /// /// Деактивировать все расписания у которых деактивированы шаблоны /// - DeactivateSchedulesWithDeactivationTemplates + DeactivateSchedulesWithDeactivationTemplates = 7