using FluentValidation; using PARR.API.Contracts.V1.Requests; using PARR.BLL.Contracts; using PARR.DAL.Services.Interfaces; namespace PARR.API.Validators { public class GeneratorTemplateRequestValidator : AbstractValidator { private readonly IApplicationsInWorkService applicationsInWorkService; private bool? isValid = null; public GeneratorTemplateRequestValidator(IApplicationsInWorkService applicationsInWorkService) { this.applicationsInWorkService = applicationsInWorkService; RuleFor(t => t.WorkId) .MustAsync(async (entity, value, c) => await IsApplicationContainWork(entity, entity.ApplicationId)) .WithMessage("У данной работы нет связанных приложений"); RuleFor(t => t.ApplicationId) .MustAsync(async (entity, value, c) => await IsApplicationContainWork(entity, value)) .WithMessage("У данного приложения нет связанных работ"); //TODO: возможно сделать проверку, по данному выражению есть ли ЭК RuleFor(t => t.Ek).NotEmpty().WithMessage("ЭК, принимает регулярное выражение. Например: *, ВРТ-*-ДВС"); RuleFor(t => t.Action) .Must(t => t.ToLower() == GenerateTemplateActionsEnum.create.ToString() || t.ToLower() == GenerateTemplateActionsEnum.deactivate.ToString()) .WithMessage($"Допустимые значения: {GenerateTemplateActionsEnum.create}, {GenerateTemplateActionsEnum.deactivate}"); } private async Task IsApplicationContainWork(GeneratorTemplateRequest request, Guid applicationId) { //чтобы не делать 2 раза валидацию if (isValid.HasValue) return isValid.Value; isValid = await applicationsInWorkService.Get(applicationId, request.WorkId) != null; return isValid.Value; } } }