Skip to content

Commit

Permalink
Refactored
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaron committed May 13, 2020
1 parent 999eb68 commit 59b1fc5
Show file tree
Hide file tree
Showing 4 changed files with 187 additions and 87 deletions.
12 changes: 11 additions & 1 deletion DVSA.MOT.SDK/Constants.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
namespace DVSA.MOT.SDK
using System.Net;

namespace DVSA.MOT.SDK
{
public static class Constants
{
Expand All @@ -7,6 +9,14 @@ public static class Constants
public static string ApiAcceptHeader => "application/json+v6";
public static string ApiKeyHeader => "x-api-key";

public static class Parameters
{
public static string Registration => "registration";
public static string VehicleId => "vehicleId";
public static string Page => "page";
public static string Date => "date";
}

public static class LanguageStrings
{
public static string Ok => "Your request was serviced";
Expand Down
14 changes: 14 additions & 0 deletions DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using DVSA.MOT.SDK.Models;

namespace DVSA.MOT.SDK.Interfaces
{
public interface IProcessApiResponse
{
Task<List<VehicleDetails>> ConvertToObject(HttpContent json);
string ResponseMessage(HttpStatusCode statusCode);
}
}
92 changes: 92 additions & 0 deletions DVSA.MOT.SDK/Services/ProcessApiResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Threading.Tasks;
using DVSA.MOT.SDK.Interfaces;
using DVSA.MOT.SDK.Models;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;

namespace DVSA.MOT.SDK.Services
{
public class ProcessApiResponse : IProcessApiResponse
{
private readonly ILogger<ProcessApiResponse> _logger;

public ProcessApiResponse(ILogger<ProcessApiResponse> logger)
{
_logger = logger;
}

public async Task<List<VehicleDetails>> ConvertToObject(HttpContent httpContent)
{
try
{
if (httpContent == null)
return null;

var json = await httpContent.ReadAsStringAsync();
if (string.IsNullOrEmpty(json))
return null;

var motTestResponses = JsonConvert.DeserializeObject<List<VehicleDetails>>(json);
return motTestResponses;
}
catch (Exception ex)
{
_logger.Log(LogLevel.Error, ex, ex.Message);
return null;
}
}

public string ResponseMessage(HttpStatusCode statusCode)
{
var responseMessage = string.Empty;
try
{
switch (statusCode)
{
case HttpStatusCode.OK:
responseMessage = Constants.LanguageStrings.Ok;
break;
case HttpStatusCode.NotFound:
responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.VehicleNotFound;
break;
case HttpStatusCode.BadRequest:
responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.BadRequest;
break;
case HttpStatusCode.Forbidden:
responseMessage = Constants.LanguageStrings.MissingApiKey;
break;
case HttpStatusCode.UnsupportedMediaType:
responseMessage = Constants.LanguageStrings.IncorrectContentType;
break;
case HttpStatusCode.InternalServerError:
responseMessage = Constants.LanguageStrings.ServerError;
break;
case HttpStatusCode.ServiceUnavailable:
responseMessage = Constants.LanguageStrings.ServiceNotAvailable;
break;
case HttpStatusCode.GatewayTimeout:
responseMessage = Constants.LanguageStrings.GatewayTimeout;
break;
default:
if ((int)statusCode == 429)
{
responseMessage = Constants.LanguageStrings.TooManyRequests;
}
break;
}

return responseMessage;
}
catch (Exception ex)
{
responseMessage = ex.Message;
_logger.Log(LogLevel.Error, ex, ex.Message);
return responseMessage;
}
}
}
}
156 changes: 70 additions & 86 deletions DVSA.MOT.SDK/Services/SingleVehicleService.cs
Original file line number Diff line number Diff line change
@@ -1,124 +1,108 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using DVSA.MOT.SDK.Interfaces;
using DVSA.MOT.SDK.Models;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;

namespace DVSA.MOT.SDK.Services
{
public class SingleVehicleService : ISingleVehicleService
{
private readonly IProcessApiResponse _processApiResponse;
private readonly IOptions<ApiKey> _apiKey;
private readonly ILogger<SingleVehicleService> _logger;

public SingleVehicleService(IOptions<ApiKey> apiKey, ILogger<SingleVehicleService> logger)
public SingleVehicleService(IOptions<ApiKey> apiKey, ILogger<SingleVehicleService> logger, IProcessApiResponse processApiResponse)
{
_apiKey = apiKey;
_logger = logger;
_processApiResponse = processApiResponse;
}

public async Task<ApiResponse> GetSingleVehicleMotHistoryByRegistration(string registration)
{
var apiResponse = new ApiResponse();
string errorMessage;
if (!string.IsNullOrEmpty(registration))
try
{
using (var httpClient = new HttpClient())
var apiResponse = new ApiResponse();
string responseMessage;
if (!string.IsNullOrEmpty(registration))
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader));
httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey);

if (!string.IsNullOrEmpty(registration))
using (var httpClient = new HttpClient())
{
var request = await httpClient.GetAsync($"{Constants.ApiRootUrl}{Constants.ApiPath}?registration={registration}");
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader));
httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey);

var request = await httpClient.GetAsync($"{Constants.ApiRootUrl}{Constants.ApiPath}?{Constants.Parameters.Registration}={registration}");
apiResponse.ReasonPhrase = request.ReasonPhrase;
apiResponse.StatusCode = (int)request.StatusCode;
string responseMessage;
switch (request.StatusCode)
{
case HttpStatusCode.OK:
errorMessage = $"{Constants.LanguageStrings.Ok} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Information, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.NotFound:
errorMessage = $"{Constants.LanguageStrings.SingleVehicleMotHistory.VehicleNotFound} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Information, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.BadRequest:
errorMessage = $"{Constants.LanguageStrings.SingleVehicleMotHistory.BadRequest} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.Forbidden:
errorMessage = $"{Constants.LanguageStrings.MissingApiKey} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.UnsupportedMediaType:
errorMessage = $"{Constants.LanguageStrings.IncorrectContentType} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.InternalServerError:
errorMessage = $"{Constants.LanguageStrings.ServerError} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.ServiceUnavailable:
errorMessage = $"{Constants.LanguageStrings.ServiceNotAvailable} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
case HttpStatusCode.GatewayTimeout:
errorMessage = $"{Constants.LanguageStrings.GatewayTimeout} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
break;
default:
if ((int)request.StatusCode == 429)
{
errorMessage = $"{Constants.LanguageStrings.TooManyRequests} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
}
else
{
errorMessage = $"{request.StatusCode} - {request.ReasonPhrase}";
_logger.Log(LogLevel.Critical, errorMessage);
responseMessage = errorMessage;
}
break;
}
var jsonResponse = await request.Content.ReadAsStringAsync();
if (!string.IsNullOrEmpty(jsonResponse))
responseMessage = _processApiResponse.ResponseMessage(request.StatusCode);
apiResponse.ResponseMessage = responseMessage;
apiResponse.VehicleDetails = await _processApiResponse.ConvertToObject(request.Content);

if (!request.IsSuccessStatusCode)
{
var motTestResponses = JsonConvert.DeserializeObject<List<VehicleDetails>>(jsonResponse);
apiResponse.VehicleDetails = motTestResponses;
_logger.Log(LogLevel.Error, responseMessage);
}
return apiResponse;
}
}
}

errorMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
_logger.Log(LogLevel.Critical, errorMessage);
apiResponse.ResponseMessage = errorMessage;
return apiResponse;
responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
_logger.Log(LogLevel.Error, responseMessage);
apiResponse.ResponseMessage = responseMessage;
return apiResponse;
}
catch (Exception ex)
{
_logger.Log(LogLevel.Error, ex, ex.Message);
return null;
}
}

public MotTestResponses GetSingleVehicleMotHistoryById(string id)
public async Task<ApiResponse> GetSingleVehicleMotHistoryById(string id)
{
throw new NotImplementedException();
try
{
var apiResponse = new ApiResponse();
string responseMessage;
if (!string.IsNullOrEmpty(id))
{
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader));
httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey);

var request = await httpClient.GetAsync($"{Constants.ApiRootUrl}{Constants.ApiPath}?{Constants.Parameters.Registration}={id}");
apiResponse.ReasonPhrase = request.ReasonPhrase;
apiResponse.StatusCode = (int)request.StatusCode;
responseMessage = _processApiResponse.ResponseMessage(request.StatusCode);
apiResponse.ResponseMessage = responseMessage;
apiResponse.VehicleDetails = await _processApiResponse.ConvertToObject(request.Content);

if (!request.IsSuccessStatusCode)
{
_logger.Log(LogLevel.Error, responseMessage);
}
return apiResponse;
}
}

responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
_logger.Log(LogLevel.Error, responseMessage);
apiResponse.ResponseMessage = responseMessage;
return apiResponse;
}
catch (Exception ex)
{
_logger.Log(LogLevel.Error, ex, ex.Message);
return null;
}
}
}
}

0 comments on commit 59b1fc5

Please sign in to comment.