Skip to content

Commit

Permalink
Merge pull request #45 from VladiTitov/feature/failed_requests_handli…
Browse files Browse the repository at this point in the history
…ng_implementation

Implemented processing of unsuccessful requests to the Wallet Pay API
  • Loading branch information
VladiTitov committed Jun 24, 2024
2 parents 3832c5e + 8882e9c commit 98a62a6
Show file tree
Hide file tree
Showing 4 changed files with 77 additions and 12 deletions.
50 changes: 50 additions & 0 deletions src/Wallet.Pay/Extensions/HttpResponseMessageExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
namespace Wallet.Pay.Extensions;

internal static class HttpResponseMessageExtensions
{
internal static async Task<T> DeserializeContentAsync<T>(
this HttpResponseMessage httpResponse,
CancellationToken cancellationToken = default) where T : class
{
if (httpResponse.Content is null)
{
throw new RequestException(
message: "Response doesn't contain any content",
httpStatusCode: httpResponse.StatusCode);
}

T? deserializedObject;

try
{
var content = await httpResponse.Content.ReadAsStringAsync(cancellationToken);
deserializedObject = JsonConvert.DeserializeObject<T>(content);
}
catch (Exception exception)
{
throw CreateRequestException(
httpResponse: httpResponse,
message: "Required properties not found in response",
exception: exception
);
}

if (deserializedObject is null)
{
throw CreateRequestException(
httpResponse: httpResponse,
message: "Required properties not found in response"
);
}

return deserializedObject;
}

static RequestException CreateRequestException(
HttpResponseMessage httpResponse,
string message,
Exception? exception = default)
=> exception is null
? new(message, httpResponse.StatusCode)
: new(message, httpResponse.StatusCode, exception);
}
11 changes: 11 additions & 0 deletions src/Wallet.Pay/Extensions/StringExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
namespace Wallet.Pay.Extensions;

internal static class StringExtensions
{
public static TEnum ToEnum<TEnum>(this string valueToEnum) where TEnum : struct
=> string.IsNullOrEmpty(valueToEnum)
? throw new ArgumentNullException(nameof(valueToEnum))
: Enum.TryParse(valueToEnum, out TEnum result)
? result
: throw new InvalidCastException(nameof(valueToEnum));
}
7 changes: 7 additions & 0 deletions src/Wallet.Pay/Responses/ApiResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
namespace Wallet.Pay.Responses;

public class ApiResponse(string status, string message)
{
public ResponseStatus Status { get; private set; } = status.ToEnum<ResponseStatus>();
public string Message { get; private set; } = message;
}
21 changes: 9 additions & 12 deletions src/Wallet.Pay/WalletPayClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,13 +41,14 @@ public async Task<IResponse<TResponse>> MakeRequestAsync<TResponse>(

if (httpResponse.StatusCode != HttpStatusCode.OK)
{
//Error
throw new NotImplementedException();
var failedApiResponse = await httpResponse
.DeserializeContentAsync<ApiResponse>(cancellationToken);
throw new RequestException(
message: failedApiResponse.Message,
httpStatusCode: httpResponse.StatusCode);
}

var content = await httpResponse.Content.ReadAsStringAsync(cancellationToken);
return JsonConvert.DeserializeObject<ResponseBase<TResponse>>(value: content)
?? throw new ArgumentNullException(nameof(content));
return await httpResponse
.DeserializeContentAsync<ResponseBase<TResponse>>(cancellationToken);
}

static async Task<HttpResponseMessage> SendRequestAsync(
Expand All @@ -70,15 +71,11 @@ static async Task<HttpResponseMessage> SendRequestAsync(
throw;
}

throw new RequestException(
message: "Request timed out",
exception: ex);
throw new RequestException("Request timed out", ex);
}
catch (Exception ex)
{
throw new RequestException
(message: "Exception during making request",
exception: ex);
throw new RequestException("Exception during making request", ex);
}

return httpResponseMessage;
Expand Down

0 comments on commit 98a62a6

Please sign in to comment.