0

I have to throw custom exceptions when validating properties, based on model state, in many of the actions the code is repetive.

How can this be refactored ?

Example of current code

[HttpGet("{jobId}/employeeLog")]
public async Task<IActionResult> GetFileLog(Guid jobId,
    [FromQuery] Guid employeeId,
    [SkipAndTopFromQuery] int? skip,
    [SkipAndTopFromQuery] int? top,
    [FromHeader(Name = "X-Correlation-ID")] string correlationId)
{
    var employeeIdToValidate = ModelState["employeeId"];
    var jobIdToValidate = ModelState["jobId"];
    if (employeeIdToValidate == null || employeeIdToValidate != null && employeeIdToValidate.Errors.Any())
        throw new InvalidFileIdException();
    if (jobIdToValidate == null || jobIdToValidate != null && jobIdToValidate.Errors.Any())
        throw new InvalidApplicationIdException();
    if (!ModelState.IsValid)
        return StatusCode((int)HttpStatusCode.BadRequest);

    ....
}

1 Answer 1

1

If you want to simplify your if statements, you can use Null Propagation Operator in C#

public async Task<IActionResult> GetFileLog(Guid jobId,
    [FromQuery] Guid employeeId,
    [SkipAndTopFromQuery] int? skip,
    [SkipAndTopFromQuery] int? top,
    [FromHeader(Name = "X-Correlation-ID")] string correlationId)
{
    var employeeIdToValidate = ModelState["employeeId"];
    var jobIdToValidate = ModelState["jobId"];

    if (employeeIdToValidate?.Errors?.Any() ?? true)
        throw new InvalidFileIdException();

    if (jobIdToValidate?.Errors?.Any() ?? true)
        throw new InvalidApplicationIdException();

    if (!ModelState.IsValid)
        return StatusCode((int)HttpStatusCode.BadRequest);

    ....
}

Also if your ModelState returns the same object, or object with common interface, you can move your checks into some method.

By the way, you can split your validation from your method by creating some sort of class like validator:

class GetFileLogValidatior: ValidatorBase {

    public override void Validate(GetFileLogValidatiorContext context) {

        var employeeIdToValidate = context.EmployeeIdToValidate;
        var jobIdToValidate = context.JobIdToValidate;

        if (employeeIdToValidate?.Errors?.Any() ?? true)
            throw new InvalidFileIdException();

        if (jobIdToValidate?.Errors?.Any() ?? true)
            throw new InvalidApplicationIdException();
    }

}
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.