public ExclusivityModelBaseValidation(SponsoredItemModelBase sponsoredItemModelBase = null)
        {
            _sponsoredItemModelBase = sponsoredItemModelBase;

            When(model => model != null, () =>
            {
                When(RestrictionTypeIsRequired, () =>
                {
                    RuleFor(model => model.RestrictionType)
                    .Must(ContainRestrictionType)
                    .WithMessage($"A valid {nameof(SponsoredItemModelBase.RestrictionType)} is required");
                });

                When(RestrictionTypeIsNotRequired, () =>
                {
                    RuleFor(model => model.RestrictionType)
                    .Must(NotContainAnyRestrictionType)
                    .WithMessage($"{nameof(SponsoredItemModelBase.RestrictionType)} is not required");
                });

                When(RestrictionValueIsRequired, () =>
                {
                    RuleFor(model => model.RestrictionValue)
                    .Must(ContainRestrictionValue)
                    .WithMessage($"A valid {nameof(SponsoredItemModelBase.RestrictionValue)} is required");
                });

                When(RestrictionValueIsRequired, () =>
                {
                    RuleFor(model => model.RestrictionValue)
                    .Must(IfHasValueContainPositiveIntegerRestrictionValue)
                    .When(CalculationTypeIsFlat)
                    .WithMessage($"{nameof(SponsoredItemModelBase.RestrictionValue)} is not positive integer. Acceptable values are any whole number greater than 0");
                });

                When(RestrictionValueIsRequired, () =>
                {
                    RuleFor(model => model.RestrictionValue)
                    .Must(IfHasValueContainPercentageRestrictionValue)
                    .When(CalculationTypeIsPercentage)
                    .WithMessage($"{nameof(SponsoredItemModelBase.RestrictionValue)} is not percentage. Acceptable values are 1 to 100");
                });

                When(RestrictionValueIsNotRequired, () =>
                {
                    RuleFor(model => model.RestrictionValue)
                    .Must(NotContainAnyRestrictionValue)
                    .WithMessage($"{nameof(SponsoredItemModelBase.RestrictionValue)} is not required");
                });
            });
        }
        public ClashExclusivityModelBaseValidation(IClashRepository clashRepository,
                                                   SponsoredItemModelBase sponsoredItemModelBase = null)
            : base(sponsoredItemModelBase)
        {
            _clashRepository = clashRepository;

            RuleFor(model => model).NotNull()
            .WithMessage("A valid ClashExclusivity is required");

            When(model => model != null, () =>
            {
                RuleFor(model => model.ClashExternalRef)
                .Must(ContainClashExternalRef)
                .WithMessage("ClashExternalRef is required");
            });
        }
        public AdvertiserExclusivityModelBaseValidation(IProductRepository productRepository,
                                                        SponsoredItemModelBase sponsoredItemModelBase = null)
            : base(sponsoredItemModelBase)
        {
            _productRepository = productRepository;

            RuleFor(model => model).NotNull()
            .WithMessage("A valid AdvertiserExclusivity is required");

            When(model => model != null, () =>
            {
                RuleFor(model => model.AdvertiserIdentifier)
                .Must(ContainAdvertiserIdentifier)
                .WithMessage("AdvertiserIdentifier is required");

                When(ContainsAdvertiserIdentifier, () =>
                {
                    RuleFor(model => model.AdvertiserIdentifier)
                    .Must(ContainOnlyExistingAdvertiserIdentifier)
                    .WithMessage(model => $"AdvertiserIdentifier: {model.AdvertiserIdentifier} do not exists");
                });
            });
        }
 private bool ApplicabilityIsEachCompetitor(SponsoredItemModelBase model)
 {
     return(model?.Applicability == SponsorshipApplicability.EachCompetitor);
 }
 private bool ApplicabilityIsAllCompetitors(SponsoredItemModelBase model)
 {
     return(model?.Applicability == SponsorshipApplicability.AllCompetitors);
 }
 public CreateClashExclusivityModelValidation(IClashRepository clashRepository,
                                              SponsoredItemModelBase sponsoredItemModelBase = null)
     : base(clashRepository, sponsoredItemModelBase)
 {
 }
 public CreateAdvertiserExclusivityModelValidation(IProductRepository productRepository,
                                                   SponsoredItemModelBase sponsoredItemModelBase = null)
     : base(productRepository, sponsoredItemModelBase)
 {
 }