0

I have some check for each method in WEB API on token from the header to match the record in database. I need to use this validation for each WEB API method. In that case for each method I need copy/paste the same piece of code. How to redesign the methods in order to avoid code duplication?

Below is an example of two methods that at the begging has the same piece of code.

[HttpPost]
[Route("QRCConnect")]
public async Task<IHttpActionResult> QRCConnect([Required]string userId, [Required]int eventId, [Required]int supplierId)
{
    try
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...

[HttpGet]
[Route("GetBuyerInfo")]
public async Task<IHttpActionResult> GetBuyerInfo(string userId)
{
    try
    {
        var token = GetTokenFromHeader(Request.Headers);
        var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
        if (api == null)
        {
            return Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
        }

        if (api.IsExpired)
        {
            return Ok(GenerateErrorsModel(400, TokenExpiredMessage));
        }
        ...
Dumitru Gutu
  • 579
  • 1
  • 7
  • 19

1 Answers1

2

You could create a Base Class for all your controllers and move the common code to it. For example,

public class BaseController
{
     protected bool ValidateApiResult(ApiResult api,out IHttpActionResult result)
     {
         if(api == null)
         {
              result  = Ok(GenerateErrorsModel(404, TokenNotFoundMessage));
              return false;
         }

         if (api.IsExpired)
         {
              result  = Ok(GenerateErrorsModel(400, TokenExpiredMessage));
              return false;
         }
         result = default;
         return true;
     } 
}

Now, in rest of the controllers, you could use

var api = await _webApiService.GetApiByToken(token).ConfigureAwait(false);
if(!base.ValidateApiResult(api,var out result))
{
   return result;
}
Anu Viswan
  • 17,797
  • 2
  • 22
  • 51