2025-12-19 19:15:58 +10:00
// ValidatorService.cs
using Microsoft.EntityFrameworkCore ;
using PARR.DAL.Services.Interfaces ;
2025-08-14 15:20:04 +10:00
using PARR.DAL.Services.Interfaces.Job ;
using PARR.DAL.Services.Interfaces.Unit ;
namespace PARR.TemplateGeneratorWorker.Services
{
internal class ValidatorService : IValidatorService
{
private readonly ILogger < ValidatorService > logger ;
2025-08-19 11:13:56 +10:00
private readonly IJobService jobService ;
private readonly IUnitService unitService ;
2025-12-19 19:15:58 +10:00
private readonly ITemplateService templateService ;
2025-08-14 15:20:04 +10:00
public ValidatorService (
2025-08-19 11:13:56 +10:00
ILogger < ValidatorService > logger ,
IJobService jobService ,
2025-12-19 19:15:58 +10:00
IUnitService unitService ,
ITemplateService templateService
2025-08-14 15:20:04 +10:00
)
{
this . logger = logger ;
2025-08-19 11:13:56 +10:00
this . jobService = jobService ;
this . unitService = unitService ;
2025-12-19 19:15:58 +10:00
this . templateService = templateService ;
2025-08-14 15:20:04 +10:00
}
2025-12-19 19:15:58 +10:00
public async Task < bool > IsValidAsync ( Guid jobId , Guid unitId , int? index , List < Guid > ? unitsInTemplate = null )
2025-08-14 15:20:04 +10:00
{
2025-12-19 19:15:58 +10:00
// Проверяем JobId
2025-08-19 11:13:56 +10:00
var job = await jobService
. Get ( ) . AsNoTracking ( )
. FirstOrDefaultAsync ( t = > t . Id = = jobId ) ;
if ( job = = null )
2025-08-14 15:20:04 +10:00
{
2025-08-19 11:13:56 +10:00
logger . LogError ( $"Н е найдена регалментная работа {nameof(jobId)}: {jobId}" ) ;
return false ;
2025-08-14 15:20:04 +10:00
}
2025-12-19 19:15:58 +10:00
// Проверяем UnitId (UnitId - это ID регионального юнита)
2025-08-19 11:13:56 +10:00
var unit = await unitService
. Get ( ) . AsNoTracking ( )
. FirstOrDefaultAsync ( t = > t . Id = = unitId ) ;
2025-08-14 15:20:04 +10:00
2025-08-19 11:13:56 +10:00
if ( unit = = null )
{
logger . LogError ( $"Н е найден элемент конфигурации {nameof(unitId)}: {unitId}" ) ;
return false ;
}
2025-08-14 15:20:04 +10:00
2025-12-19 19:15:58 +10:00
// Проверяем уникальность (JobId, UnitId, Index)
var existingTemplate = await templateService
. Get ( ) . AsNoTracking ( )
. FirstOrDefaultAsync ( t = > t . JobId = = jobId & & t . UnitId = = unitId & & t . Index = = index ) ;
if ( existingTemplate ! = null )
{
logger . LogError ( "Шаблон с JobId={JobId}, UnitId={UnitId}, Index={Index} уже существует." , jobId , unitId , index ) ;
return false ;
}
// Проверяем, что все UnitId в UnitsInTemplate существуют (если список не null и не пуст)
if ( unitsInTemplate ! = null & & unitsInTemplate . Any ( ) )
{
var unitIdsToCheck = unitsInTemplate . ToHashSet ( ) ;
var existingUnitIdsCount = await unitService . Get ( )
. AsNoTracking ( )
. Where ( u = > unitIdsToCheck . Contains ( u . Id ) )
. Select ( u = > u . Id )
. CountAsync ( ) ;
if ( existingUnitIdsCount ! = unitIdsToCheck . Count )
{
logger . LogError ( "Н е все UnitId из UnitsInTemplate существуют в базе данных. Ожидается: {ExpectedCount}, Найдено: {FoundCount}" , unitIdsToCheck . Count , existingUnitIdsCount ) ;
return false ;
}
}
2025-08-19 11:13:56 +10:00
return true ;
2025-08-14 15:20:04 +10:00
}
}
2025-12-19 19:15:58 +10:00
}