From fccc352fbfc4ff4e6af4dd4be6e2147b577db17a Mon Sep 17 00:00:00 2001 From: Mikhail Kuznetsov Date: Fri, 29 Mar 2024 11:36:39 +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=BF=D0=BB=D0=B0=D0=BD=D0=B8=D1=80=D0=BE=D0=B2=D1=89=D0=B8?= =?UTF-8?q?=D0=BA=D0=B0,=20ApplicationInWorkController=20=D0=B4=D0=BE?= =?UTF-8?q?=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=8C?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D1=8C=D0=BD=D0=B0=D1=8F=20?= =?UTF-8?q?=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9=D0=BA=D0=B0=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 | 11 ++- .../V1/ApplicationInWorkController.cs | 13 ++- .../Validators/ApplicationInWorkValidator.cs | 93 ++++++++++++++----- PARR.DAL/Models/EsppSchValue.cs | 1 - 4 files changed, 88 insertions(+), 30 deletions(-) diff --git a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs index ad23dea1..afe8f167 100644 --- a/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs +++ b/PARR.API/Contracts/V1/Requests/ApplicationInWorkRequest.cs @@ -28,16 +28,19 @@ } + public class ScheduleRequest { public DateTimeOffset NextRun { get; set; } - //public DateTimeOffset? LastRun { get; set; } + public List EsppSchValues { get; set; } = new List(); + } - //public string Timezone { get; set; } = string.Empty; - public required int TypeScheduleId { get; set; } + public class EsppSchValueRequest + { + public Guid TypeValueId { get; set; } - public List Values { get; set; } = new List(); + public Guid TypeConfigId { get; set; } } } diff --git a/PARR.API/Controllers/V1/ApplicationInWorkController.cs b/PARR.API/Controllers/V1/ApplicationInWorkController.cs index 599a53e1..13ae8953 100644 --- a/PARR.API/Controllers/V1/ApplicationInWorkController.cs +++ b/PARR.API/Controllers/V1/ApplicationInWorkController.cs @@ -63,7 +63,7 @@ namespace PARR.API.Controllers.V1 if (existSameAiW != null) return BadRequest(new Response(false, new List { - new ErrorModel { Message = $"Уже существует задание на выполнение работ для программного обеспечения id(\"{request.ApplicationId}\") и работой id({request.WorkId})." } } + new ErrorModel { Message = $"Уже существует задание на выполнение работ для программного обеспечения id({request.ApplicationId}) и работой id({request.WorkId})." } } )); var applicationInWork = new ApplicationsInWork @@ -82,7 +82,16 @@ namespace PARR.API.Controllers.V1 AgentScript = request.AgentScript }; - //TODO Schedule + //Добавляем настройки планировщика + foreach (var esppSchValue in request.Schedule.EsppSchValues) + { + applicationInWork.EsppSchValues.Add(new EsppSchValue + { + ApplicationsInWorkId = applicationInWork.Id, + TypeConfigId = esppSchValue.TypeConfigId, + TypeValueId = esppSchValue.TypeValueId + }); + } 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 d59b29e5..9cc0b118 100644 --- a/PARR.API/Validators/ApplicationInWorkValidator.cs +++ b/PARR.API/Validators/ApplicationInWorkValidator.cs @@ -19,6 +19,8 @@ namespace PARR.API.Validators this.applicationsInWorkService = applicationsInWorkService; this.workService = workService; this.esppSchTypeConfigService = esppSchTypeConfigService; + + RuleFor(t => t.TemplateDuration) .NotNull().NotEmpty().WithMessage("Длительность данного задания на выполнение работ не может быть пустым") .Matches("^\\d{1,2}\\s\\d{1,2}[:]\\d{1,2}[:]\\d{1,2}$") @@ -45,53 +47,98 @@ namespace PARR.API.Validators //Проверяем настройки планировщика 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.EsppSchValues) + .NotNull().NotEmpty().When(t => t.Schedule != null).WithMessage("Настройки планировщика задания на выполнение работ не могут быть пустыми") + .Must((entity, value, c) => IsEsppSchValuesExist(entity)).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("Не удалось найти подходящую конфигруцию планировщика задания на выполнение работ"); + //RuleFor(t => t.Schedule.Values) + // .NotNull().NotEmpty().WithMessage($"Настройки значений планировщика задания на выполнение работ не могут быть пустыми") + // .Must((entity, value, c) => IsScheduleTypeValueIdExist(entity)) + // .When(t => t.Schedule != null).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).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) + private bool IsEsppSchValuesExist(ApplicationInWorkRequest request) { var configs = esppSchTypeConfigService.GetWithSchIncludes().ToList(); - var mustValues = configs.Where(t => t.TypeScheduleId == request.Schedule.TypeScheduleId).ToList(); - var values = request.Schedule.Values; + //Проверяем полученные Id конфигураций и Id конфигураций в базе + var typeConfigIdList = request.Schedule.EsppSchValues.Select(t => t.TypeConfigId); + var foundTypeConfigIdList = configs.Where(t => typeConfigIdList.Contains(t.Id)).Distinct(); + if (foundTypeConfigIdList.Count() == 0 //Не найдено совпадений с базой + || foundTypeConfigIdList.Select(t => t.TypeScheduleId).Distinct().Count() > 1) //или имеют разный тип планировщика + return false; - foreach (var mustValue in mustValues) + var typeScheduleId = foundTypeConfigIdList.Select(t => t.TypeScheduleId).FirstOrDefault(); + + if (foundTypeConfigIdList.Count() != configs.Where(t => t.TypeScheduleId == typeScheduleId).Count()) //не все typeConfig найдены в базе + return false; + + //Теперь проверяем значения + foreach (var item in request.Schedule.EsppSchValues) { - var mlValues = mustValue?.EsppSchType?.EsppSchTypeValues.Select(t => t.Id); + var curTypeConfig = configs.Where(t => t.Id == item.TypeConfigId).Single(); - if (mlValues == null) - return false; + var isCurValueExist = curTypeConfig!.EsppSchType!.EsppSchTypeValues.Where(t => t.Id == item.TypeValueId).Any(); - if (!mlValues.Intersect(values).Any()) + if (!isCurValueExist) return false; } return true; } + private async Task IsWorkExist(ApplicationInWorkRequest request) { return await workService.GetAsync(request.WorkId) != null; } + private async Task IsApplicationExist(ApplicationInWorkRequest request) { return await workService.GetAsync(request.WorkId) != null; } + + + //private bool IsTypeScheduleIdExist(ApplicationInWorkRequest request) + //{ + // var configs = esppSchTypeConfigService.GetWithSchIncludes().ToList(); + //var result = configs.Where(t => t.TypeId == request.Schedule.TypeScheduleId).FirstOrDefault() != null; + //return result; + // return false; + //} + + + //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; + //} + } } diff --git a/PARR.DAL/Models/EsppSchValue.cs b/PARR.DAL/Models/EsppSchValue.cs index 9290b00a..2a294ae0 100644 --- a/PARR.DAL/Models/EsppSchValue.cs +++ b/PARR.DAL/Models/EsppSchValue.cs @@ -1,5 +1,4 @@ using Microsoft.EntityFrameworkCore; -using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace PARR.DAL.Models