1

I am working in asp. net core 6.0 web API project (clean architecture (CQRS)).

I am using fluent validation for validate command and queries.

public class CreateSiteDestinationSectionsCommand : IRequest<x>
{
    public int DestinationSectionId { get; set; }
    public int DestinationSectionTitleId { get; set; }
    public int SiteCodeId { get; set; }
    public string Description { get; set; }

    public List<DestinationImageDto> Images { get; set; }

    public List<string> Links { get; set; }
}

This is i did inside CreateSiteDestinationSectionsCommandHandler.

var DestinationSectionTitleId = request.DestinationSectionTitleId;

            if (DestinationSectionTitleId != 10)
            {

                if (DestinationSectionTitleId == 1
                || DestinationSectionTitleId == 2
                || DestinationSectionTitleId == 5
                || DestinationSectionTitleId == 7
                || DestinationSectionTitleId == 8
                || DestinationSectionTitleId == 9
                || DestinationSectionTitleId == 11)
                {
                    var sectionimageCount = request.Images.Count;

                    if (sectionimageCount != 1)
                    {
                        throw new ApiValidationException("Section has not more than one image");
                    }
                   else (DestinationSectionTitleId == 10 && request.Images != null)
                   {

                      var sectionimageCount = request.Images.Count;
                      if (sectionimageCount != 0)
                       {
                         throw new ApiValidationException("Section  doesnot have any image");

                       }

                   }

                }

            }

But instead of handling validation inside commandHandler, I have to handle validation in CreateSiteDestinationSectionsCommandValidator.

I tried this,

  RuleFor(x => x.Images)
         .Must(x => x != null)
                .When(x => x.DestinationSectionId != 10)
                .WithMessage("Site Section image required");

        RuleFor(x => x.DestinationSectionId).NotEmpty();
        RuleFor(x => x.Images)
                .Must(x => x.Count != 1)
                .When(x => x.DestinationSectionId == 1
                && x.DestinationSectionId == 1
                && x.DestinationSectionId == 2
                && x.DestinationSectionId == 5
                && x.DestinationSectionId == 7
                && x.DestinationSectionId == 8
                && x.DestinationSectionId == 9
                && x.DestinationSectionId == 11
                )
                .WithMessage("Site Section has not more than one image");
    }

When I check throug postman request, Even I send with DestinationSectionId = 10 (and not sending any images), I got validation error as

"errors": {
        "Images": [
            "Site Section image required"
        ]
    }

And Even I send more than 1 images for DestinationSectionId = 1, I did not get validation error. BUT I shoud get validation error as Site Section has not more than one image

Why this validations not work correctly? What I missed?

1 Answer 1

1

For this part:

And Even I send more than 1 images for DestinationSectionId = 1, I did not get validation error. BUT I shoud get validation error as Site Section has not more than one image

you are not getting any error because you wrote:

.When(x => x.DestinationSectionId == 1
                && x.DestinationSectionId == 1
                && x.DestinationSectionId == 2
                && x.DestinationSectionId == 5
                && x.DestinationSectionId == 7
                && x.DestinationSectionId == 8
                && x.DestinationSectionId == 9
                && x.DestinationSectionId == 11
                )

which means that DestinationSectionId must be 1 and 2 and 5 and 7 and 8 and 9 and 11 at the same time, which is not possible.

Instead you should write:

.When(x => x.DestinationSectionId == 1
                    || x.DestinationSectionId == 2
                    || x.DestinationSectionId == 5
                    || x.DestinationSectionId == 7
                    || x.DestinationSectionId == 8
                    || x.DestinationSectionId == 9
                    || x.DestinationSectionId == 11
                    )

For this part:

When I check throug postman request, Even I send with DestinationSectionId = 10 (and not sending any images), I got validation error as...

can you add postman request to the question?

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.