using FluentValidation; using PARR.API.Contracts.V1.Requests; using PARR.BLL.Services.Interfaces; using PARR.Constants.Shortcodes; using PARR.DAL.Services.Interfaces; namespace PARR.API.Validators { public class WorkRequestValidator : AbstractValidator { private readonly ITnkService tnkService; private bool? isValid = null; public WorkRequestValidator( ITnkService tnkService, ITemplateMaskValidator templateMaskValidator ) { this.tnkService = tnkService; RuleFor(t => t.Name).NotEmpty().NotNull(); RuleFor(t => t.TemplateNameMask) .NotEmpty() .NotNull(); RuleFor(t => t.TemplateNameMask) .Must((entity, value, c) => templateMaskValidator .IsValid(entity.TemplateNameMask)) .WithMessage($"Неверно указана маска имени шаблонов. Обязательными условиями являются" + $" наличие кодового слова \"ПАРР\" и обязательное использование динамической составляющей" + $" %ЭК%. Доступные значения динамических составляющих:" + $" {string.Join(", ", Shortcodes.GetAll().Select(sc => sc.Name + " - " + sc.Description))}" ); RuleFor(t => t.EsppId).NotEmpty().NotNull().WithMessage("EsppId не может быть пустым"); RuleFor(t => t.TnkId).NotEmpty().NotNull(); RuleFor(t => t.TnkId) .MustAsync(async (entity, value, c) => await IsTnkExist(entity)) .WithMessage("Указан несуществующий Id ТНК"); } private async Task IsTnkExist(WorkRequest request) { //чтобы не делать 2 раза валидацию if (isValid.HasValue) return isValid.Value; isValid = await tnkService.GetAsync(request.TnkId) != null; return isValid.Value; } } }