using FluentValidation; using PARR.API.Contracts.V1.Requests; using PARR.Core.Repositories.Interfaces; namespace PARR.API.Validators { public class WorkRequestValidator : AbstractValidator { private readonly ITnkRepository tnkService; private bool? isValid = null; public WorkRequestValidator( ITnkRepository tnkService //ITemplateMaskValidator templateMaskValidator ) { this.tnkService = tnkService; RuleFor(t => t.Name).NotEmpty().NotNull(); RuleFor(t => t.TemplateNameMask) .NotEmpty() .NotNull(); //TODO Сделать проверку по шорткодам и возможным полям //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; } } }