2024-03-27 11:13:52 +10:00
using FluentValidation ;
2024-06-04 12:03:15 +10:00
using Microsoft.EntityFrameworkCore ;
2024-03-27 11:13:52 +10:00
using PARR.API.Contracts.V1.Requests ;
using PARR.DAL.Services.Interfaces ;
namespace PARR.API.Validators
{
public class ApplicationInWorkValidator : AbstractValidator < ApplicationInWorkRequest >
{
private readonly IApplicationsInWorkService applicationsInWorkService ;
private readonly IWorkService workService ;
2024-03-28 16:21:22 +10:00
private readonly IEsppSchTypeConfigService esppSchTypeConfigService ;
2024-06-04 12:03:15 +10:00
private readonly IWorkGroupService workGroupService ;
2024-03-27 11:13:52 +10:00
public ApplicationInWorkValidator (
IApplicationsInWorkService applicationsInWorkService ,
2024-03-28 16:21:22 +10:00
IWorkService workService ,
2024-06-04 12:03:15 +10:00
IEsppSchTypeConfigService esppSchTypeConfigService ,
IWorkGroupService workGroupService
2024-03-27 11:13:52 +10:00
)
{
this . applicationsInWorkService = applicationsInWorkService ;
this . workService = workService ;
2024-03-28 16:21:22 +10:00
this . esppSchTypeConfigService = esppSchTypeConfigService ;
2024-06-04 12:03:15 +10:00
this . workGroupService = workGroupService ;
2024-03-29 11:36:39 +10:00
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . TemplateDuration )
2024-04-10 11:54:54 +10:00
. NotNull ( ) . NotEmpty ( ) //.WithMessage("Длительность данного задания на выполнение работ не может быть пустым")
2024-03-28 16:21:22 +10:00
. Matches ( "^\\d{1,2}\\s\\d{1,2}[:]\\d{1,2}[:]\\d{1,2}$" )
2024-04-10 11:54:54 +10:00
//.WithMessage("Длительность данного задания на выполнение работ должна соответствовать шаблону dd hh:mm:ss(7 00:00:00)");
. WithMessage ( "Значение не соответствует шаблону dd hh:mm:ss(7 00:00:00)" ) ;
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . ShortDescription )
2024-04-10 11:54:54 +10:00
. NotNull ( ) . NotEmpty ( ) ; //.WithMessage("Краткое описание данного задания на выполнение работ не может быть пустым");
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . FullDescription )
2024-04-10 11:54:54 +10:00
. NotNull ( ) . NotEmpty ( ) ; //.WithMessage("Подробное описание данного задания на выполнение работ не может быть пустым");
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . Solution )
2024-04-10 11:54:54 +10:00
. NotNull ( ) . NotEmpty ( ) ; //.WithMessage("Решение данного задания на выполнение работ не может быть пустым");
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . WorkId )
. MustAsync ( async ( entity , value , c ) = > await IsWorkExist ( entity ) )
2024-04-10 11:54:54 +10:00
. WithMessage ( "Указан несуществующий Id работы" ) ;
//.WithMessage("У данного задания на выполнение работ указан несуществующий Id работы");
2024-03-27 11:13:52 +10:00
RuleFor ( t = > t . ApplicationId )
. MustAsync ( async ( entity , value , c ) = > await IsApplicationExist ( entity ) )
2024-04-17 09:07:46 +10:00
. WithMessage ( "Указан несуществующий Id программного обеспечения" ) ;
2024-06-04 12:03:15 +10:00
//.MustAsync(async (entity, value, c) => await AppInWorkIsUnique(entity))
// .WithMessage("Задание на выполнение работ с такими ПО и работой уже существует");
2024-04-10 11:54:54 +10:00
//.WithMessage("У данного задания на выполнение работ указан несуществующий Id программного обеспечения");
2024-03-28 16:21:22 +10:00
2024-04-10 11:54:54 +10:00
#region old schedule
//Проверяем настройки планировщика
//RuleFor(t => t.Schedule).NotNull().NotEmpty()
// .WithMessage("Настройки планировщика задания на выполнение работ не могут быть пустыми");
//RuleFor(t => t.Schedule.EsppSchValues)
// .NotNull().NotEmpty()
// .When(t => t.Schedule != null)
// .WithMessage("Настройки планировщика задания на выполнение работ не могут быть пустыми")
// .Must((entity, value, c) => IsEsppSchValuesExist(entity))
// .WithMessage("Н е удалось найти подходящую конфигруцию планировщика задания на выполнение работ");
#endregion
RuleFor ( t = > t . Schedule )
. NotNull ( ) . NotEmpty ( )
. When ( t = > t . Schedule . Count ( ) > 0 )
. WithMessage ( "Настройки планировщика не могут быть пустыми" )
. Must ( ( entity , value , c ) = > IsEsppSchValuesExist ( entity . Schedule ) )
. WithMessage ( "Н е удалось найти подходящую конфигруцию планировщика задания" ) ;
#region comment
2024-03-28 16:21:22 +10:00
2024-03-29 11:36:39 +10:00
//RuleFor(t => t.Schedule.Values)
// .NotNull().NotEmpty().WithMessage($"Настройки значений планировщика задания на выполнение работ не могут быть пустыми")
// .Must((entity, value, c) => IsScheduleTypeValueIdExist(entity))
// .When(t => t.Schedule != null).WithMessage("Н е удалось найти подходящую конфигруцию планировщика задания на выполнение работ");
2024-03-28 16:21:22 +10:00
2024-03-29 11:36:39 +10:00
//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("Н е удалось найти подходящую конфигруцию планировщика задания на выполнение работ");
2024-04-10 11:54:54 +10:00
#endregion
2024-06-04 12:03:15 +10:00
RuleFor ( t = > t . WorkGroups )
. MustAsync ( async ( entity , value , c ) = > await IsWorkGroupsExistAsync ( entity ) )
. WithMessage ( "Указаные несуществующие Id рабочих групп" ) ;
}
private async Task < bool > IsWorkGroupsExistAsync ( ApplicationInWorkRequest entity )
{
var result = await workGroupService . Get ( ) . Where ( t = > entity . WorkGroups . Contains ( t . Id ) ) . ToListAsync ( ) ;
return entity . WorkGroups . Count ( ) = = result . Count ( ) ;
2024-03-27 11:13:52 +10:00
}
2024-04-10 11:54:54 +10:00
//private bool IsEsppSchValuesExist(ApplicationInWorkRequest request)
private bool IsEsppSchValuesExist ( List < EsppSchValueRequest > listSchedule )
2024-03-28 16:21:22 +10:00
{
var configs = esppSchTypeConfigService . GetWithSchIncludes ( ) . ToList ( ) ;
2024-03-29 11:36:39 +10:00
//Проверяем полученные Id конфигураций и Id конфигураций в базе
2024-04-10 11:54:54 +10:00
var typeConfigIdList = listSchedule . Select ( t = > t . TypeConfigId ) ;
2024-03-29 11:36:39 +10:00
var foundTypeConfigIdList = configs . Where ( t = > typeConfigIdList . Contains ( t . Id ) ) . Distinct ( ) ;
2024-04-10 11:54:54 +10:00
2024-03-29 11:36:39 +10:00
if ( foundTypeConfigIdList . Count ( ) = = 0 //Н е найдено совпадений с базой
| | foundTypeConfigIdList . Select ( t = > t . TypeScheduleId ) . Distinct ( ) . Count ( ) > 1 ) //или имеют разный тип планировщика
return false ;
2024-03-28 16:21:22 +10:00
2024-03-29 11:36:39 +10:00
var typeScheduleId = foundTypeConfigIdList . Select ( t = > t . TypeScheduleId ) . FirstOrDefault ( ) ;
if ( foundTypeConfigIdList . Count ( ) ! = configs . Where ( t = > t . TypeScheduleId = = typeScheduleId ) . Count ( ) ) //не все typeConfig найдены в базе
return false ;
//Теперь проверяем значения
2024-04-10 11:54:54 +10:00
foreach ( var item in listSchedule )
2024-03-28 16:21:22 +10:00
{
2024-03-29 11:36:39 +10:00
var curTypeConfig = configs . Where ( t = > t . Id = = item . TypeConfigId ) . Single ( ) ;
2024-03-28 16:21:22 +10:00
2024-03-29 11:36:39 +10:00
var isCurValueExist = curTypeConfig ! . EsppSchType ! . EsppSchTypeValues . Where ( t = > t . Id = = item . TypeValueId ) . Any ( ) ;
2024-03-28 16:21:22 +10:00
2024-03-29 11:36:39 +10:00
if ( ! isCurValueExist )
2024-03-28 16:21:22 +10:00
return false ;
}
return true ;
}
2024-03-27 11:13:52 +10:00
2024-04-17 09:07:46 +10:00
//private async Task<bool> AppInWorkIsUnique(ApplicationInWorkRequest request)
//{
// //уникальная запись по полям ApplicationId, WorkId
2024-04-16 11:08:25 +10:00
2024-04-17 09:07:46 +10:00
// var existSameAiW = await applicationsInWorkService.GetAsync(request.ApplicationId, request.WorkId);
2024-04-16 11:08:25 +10:00
2024-04-17 09:07:46 +10:00
// //TODO: тут спорно, нужна ли эта проверка? Мы же можем создать несколько Р Р на одно и тоже ПО но с разным расписанием?
// //к тому же, в методе update, такой проверки нет!
// //if (existSameAiW != null)
// // return BadRequest(new Response(false, new List<ErrorModel> {
// // new ErrorModel { Message = $"Уже существует задание на выполнение работ для программного обеспечения id({request.ApplicationId}) и работой id({request.WorkId})." } }
// // ));
2024-04-16 11:08:25 +10:00
2024-04-17 09:07:46 +10:00
// return existSameAiW == null;
//}
2024-03-29 11:36:39 +10:00
2024-03-27 11:13:52 +10:00
private async Task < bool > IsWorkExist ( ApplicationInWorkRequest request )
{
return await workService . GetAsync ( request . WorkId ) ! = null ;
}
2024-03-29 11:36:39 +10:00
2024-03-27 11:13:52 +10:00
private async Task < bool > IsApplicationExist ( ApplicationInWorkRequest request )
{
return await workService . GetAsync ( request . WorkId ) ! = null ;
}
2024-03-29 11:36:39 +10:00
//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;
//}
2024-03-27 11:13:52 +10:00
}
}