Skip to content

Commit

Permalink
Split http request off
Browse files Browse the repository at this point in the history
  • Loading branch information
Aaron committed May 13, 2020
1 parent 59b1fc5 commit 471ece8
Show file tree
Hide file tree
Showing 4 changed files with 63 additions and 58 deletions.
5 changes: 1 addition & 4 deletions DVSA.MOT.SDK/Interfaces/IProcessApiResponse.cs
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
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);
Task<ApiResponse> GetData(List<KeyValuePair<string, string>> parameters);
}
}
2 changes: 1 addition & 1 deletion DVSA.MOT.SDK/Interfaces/ISingleVehicleService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,6 @@ namespace DVSA.MOT.SDK.Interfaces
public interface ISingleVehicleService
{
Task<ApiResponse> GetSingleVehicleMotHistoryByRegistration(string registration);
MotTestResponses GetSingleVehicleMotHistoryById(string id);
Task<ApiResponse> GetSingleVehicleMotHistoryById(string id);
}
}
54 changes: 49 additions & 5 deletions DVSA.MOT.SDK/Services/ProcessApiResponse.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,62 @@
using System.Collections.Generic;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Web;
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 ProcessApiResponse : IProcessApiResponse
{
private readonly IOptions<ApiKey> _apiKey;
private readonly ILogger<ProcessApiResponse> _logger;

public ProcessApiResponse(ILogger<ProcessApiResponse> logger)
public ProcessApiResponse(ILogger<ProcessApiResponse> logger, IOptions<ApiKey> apiKey)
{
_logger = logger;
_apiKey = apiKey;
}
public async Task<ApiResponse> GetData(List<KeyValuePair<string, string>> parameters)
{
var apiResponse = new ApiResponse();
using (var httpClient = new HttpClient())
{
httpClient.DefaultRequestHeaders.Clear();
httpClient.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue(Constants.ApiAcceptHeader));
httpClient.DefaultRequestHeaders.Add(Constants.ApiKeyHeader, _apiKey.Value.DVSAApiKey);

public async Task<List<VehicleDetails>> ConvertToObject(HttpContent httpContent)
var url = GenerateUrl(parameters);
var request = await httpClient.GetAsync(url);
apiResponse.ReasonPhrase = request.ReasonPhrase;
apiResponse.StatusCode = (int)request.StatusCode;
var responseMessage = ResponseMessage(request.StatusCode);
apiResponse.ResponseMessage = responseMessage;
apiResponse.VehicleDetails = await ConvertToObject(request.Content);

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

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

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

var motTestResponses = JsonConvert.DeserializeObject<List<VehicleDetails>>(json);
Expand All @@ -40,7 +70,7 @@ public async Task<List<VehicleDetails>> ConvertToObject(HttpContent httpContent)
}
}

public string ResponseMessage(HttpStatusCode statusCode)
private string ResponseMessage(HttpStatusCode statusCode)
{
var responseMessage = string.Empty;
try
Expand Down Expand Up @@ -88,5 +118,19 @@ public string ResponseMessage(HttpStatusCode statusCode)
return responseMessage;
}
}

private static string GenerateUrl(IEnumerable<KeyValuePair<string, string>> parameters)
{
var baseURl = $"{Constants.ApiRootUrl}{Constants.ApiPath}";
var uriBuilder = new UriBuilder(baseURl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
foreach (var param in parameters)
{
query.Add(param.Key, param.Value);
}
uriBuilder.Query = query.ToString();
baseURl = uriBuilder.ToString();
return baseURl;
}
}
}
60 changes: 12 additions & 48 deletions DVSA.MOT.SDK/Services/SingleVehicleService.cs
Original file line number Diff line number Diff line change
@@ -1,23 +1,19 @@
using System;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Collections.Generic;
using System.Threading.Tasks;
using DVSA.MOT.SDK.Interfaces;
using DVSA.MOT.SDK.Models;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;

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, IProcessApiResponse processApiResponse)
public SingleVehicleService(ILogger<SingleVehicleService> logger, IProcessApiResponse processApiResponse)
{
_apiKey = apiKey;
_logger = logger;
_processApiResponse = processApiResponse;
}
Expand All @@ -27,32 +23,16 @@ public async Task<ApiResponse> GetSingleVehicleMotHistoryByRegistration(string r
try
{
var apiResponse = new ApiResponse();
string responseMessage;
if (!string.IsNullOrEmpty(registration))
{
using (var httpClient = new HttpClient())
var parameters = new List<KeyValuePair<string, string>>
{
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;
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;
}
new KeyValuePair<string, string>(Constants.Parameters.Registration, registration)
};
return await _processApiResponse.GetData(parameters);
}

responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
var responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
_logger.Log(LogLevel.Error, responseMessage);
apiResponse.ResponseMessage = responseMessage;
return apiResponse;
Expand All @@ -68,32 +48,16 @@ public async Task<ApiResponse> GetSingleVehicleMotHistoryById(string id)
try
{
var apiResponse = new ApiResponse();
string responseMessage;
if (!string.IsNullOrEmpty(id))
{
using (var httpClient = new HttpClient())
var parameters = new List<KeyValuePair<string, string>>
{
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;
}
new KeyValuePair<string, string>(Constants.Parameters.VehicleId, id)
};
return await _processApiResponse.GetData(parameters);
}

responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
var responseMessage = Constants.LanguageStrings.SingleVehicleMotHistory.NullRegistrationException;
_logger.Log(LogLevel.Error, responseMessage);
apiResponse.ResponseMessage = responseMessage;
return apiResponse;
Expand Down

0 comments on commit 471ece8

Please sign in to comment.