From 2042db8d4b0b2c9e85cfe5f0413a27ec2a83dec0 Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Thu, 28 Mar 2024 16:21:22 +1000 Subject: [PATCH] =?UTF-8?q?feat(api):=20ApplicationInWorkValidator=20?= =?UTF-8?q?=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=B2=D0=B0=D0=BB=D0=B8=D0=B4=D0=B0=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B5=D0=BA=20=D0=BF?= =?UTF-8?q?=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D1=89=D0=B8=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../V1/Requests/ApplicationInWorkRequest.cs | 16 ++++++ .../V1/ApplicationInWorkController.cs | 2 + .../Validators/ApplicationInWorkValidator.cs | 49 +++++++++++++++++-- 3 files changed, 64 insertions(+), 3 deletions(-) diff --git a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs index 422c535a..ad23dea1 100644 --- a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs +++ b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs @@ -23,5 +23,21 @@ public int? AgentTimeOutSec { get; set; } public string? AgentScript { get; set; } + + public required ScheduleRequest Schedule { get; set; } + + } + + public class ScheduleRequest + { + public DateTimeOffset NextRun { get; set; } + + //public DateTimeOffset? LastRun { get; set; } + + //public string Timezone { get; set; } = string.Empty; + + public required int TypeScheduleId { get; set; } + + public List Values { get; set; } = new List(); } } diff --git a/PARR.API/Controllers/V1/ApplicationInWorkController.cs b/PARR.API/Controllers/V1/ApplicationInWorkController.cs index 2d679cda..599a53e1 100644 --- a/PARR.API/Controllers/V1/ApplicationInWorkController.cs +++ b/PARR.API/Controllers/V1/ApplicationInWorkController.cs @@ -82,6 +82,8 @@ namespace PARR.API.Controllers.V1 AgentScript = request.AgentScript }; + //TODO Schedule + if (!await applicationsInWorkService.CreateAsync(applicationInWork) || !await applicationsInWorkService.CommitAsync()) return BadRequest(new Response(false, new List { new ErrorModel { Message = "Ошибка при записи нового задания на выполнение работ в базу данных" } })); diff --git a/PARR.API/Validators/ApplicationInWorkValidator.cs b/PARR.API/Validators/ApplicationInWorkValidator.cs index ec0af5b4..d59b29e5 100644 --- a/PARR.API/Validators/ApplicationInWorkValidator.cs +++ b/PARR.API/Validators/ApplicationInWorkValidator.cs @@ -8,18 +8,20 @@ namespace PARR.API.Validators { private readonly IApplicationsInWorkService applicationsInWorkService; private readonly IWorkService workService; + private readonly IEsppSchTypeConfigService esppSchTypeConfigService; public ApplicationInWorkValidator( IApplicationsInWorkService applicationsInWorkService, - IWorkService workService + IWorkService workService, + IEsppSchTypeConfigService esppSchTypeConfigService ) { this.applicationsInWorkService = applicationsInWorkService; this.workService = workService; - + this.esppSchTypeConfigService = esppSchTypeConfigService; RuleFor(t => t.TemplateDuration) .NotNull().NotEmpty().WithMessage("Длительность данного задания на выполнение работ не может быть пустым") - .Matches("^\\d{1,2}\\s\\d{2}[:]\\d{2}[:]\\d{2}$") + .Matches("^\\d{1,2}\\s\\d{1,2}[:]\\d{1,2}[:]\\d{1,2}$") .WithMessage("Длительность данного задания на выполнение работ должна соответствовать шаблону dd hh:mm:ss(7 00:00:00)"); RuleFor(t => t.ShortDescription) @@ -38,8 +40,49 @@ namespace PARR.API.Validators RuleFor(t => t.ApplicationId) .MustAsync(async (entity, value, c) => await IsApplicationExist(entity)) .WithMessage("У данного задания на выполнение работ указан несуществующий Id программного обеспечения"); + + + //Проверяем настройки планировщика + RuleFor(t => t.Schedule).NotNull().NotEmpty().WithMessage("Настройки планировщика задания на выполнение работ не могут быть пустыми"); + + RuleFor(t => t.Schedule.TypeScheduleId) + .NotNull().NotEmpty().WithMessage($"Тип планировщика задания на выполнение работ не может быть пустым") + .Must((entity, value, c) => IsTypeScheduleIdExist(entity)) + .When(t => t.Schedule != null).WithMessage($"Не удалось найти указанный тип планировщика задания на выполнение работ"); + + RuleFor(t => t.Schedule.Values) + .NotNull().NotEmpty().WithMessage($"Настройки значений планировщика задания на выполнение работ не могут быть пустыми") + .Must((entity, value, c) => IsScheduleTypeValueIdExist(entity)) + .When(t => t.Schedule != null && t.Schedule.TypeScheduleId > 0).WithMessage("Не удалось найти подходящую конфигруцию планировщика задания на выполнение работ"); } + private bool IsTypeScheduleIdExist(ApplicationInWorkRequest request) + { + var configs = esppSchTypeConfigService.GetWithSchIncludes().ToList(); + var result = configs.Where(t => t.TypeScheduleId == request.Schedule.TypeScheduleId).FirstOrDefault() != null; + return result; + } + + private bool IsScheduleTypeValueIdExist(ApplicationInWorkRequest request) + { + var configs = esppSchTypeConfigService.GetWithSchIncludes().ToList(); + + var mustValues = configs.Where(t => t.TypeScheduleId == request.Schedule.TypeScheduleId).ToList(); + var values = request.Schedule.Values; + + foreach (var mustValue in mustValues) + { + var mlValues = mustValue?.EsppSchType?.EsppSchTypeValues.Select(t => t.Id); + + if (mlValues == null) + return false; + + if (!mlValues.Intersect(values).Any()) + return false; + } + + return true; + } private async Task IsWorkExist(ApplicationInWorkRequest request) {