Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ public FileLineProcessingContext(FileCommands.ProcessTransactionForFileLineComma
public Boolean TransactionDispatchSucceeded { get; set; }

public String TransactionDispatchFailureType { get; set; }
public String TransactionDispatchFailureResult { get; set; }

public Guid EstateId { get; set; }

Expand Down
197 changes: 78 additions & 119 deletions FileProcessor.Client/FileProcessorClient.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using System.Linq;
using System.Security.Cryptography;
using System.Net.Http.Headers;
using System.Text;
using Shared.Results;

namespace FileProcessor.Client {
Expand All @@ -19,70 +17,105 @@ namespace FileProcessor.Client {
using FileProcessor.Models;
using SimpleResults;

/// <summary>
///
/// </summary>
/// <seealso cref="ClientProxyBase" />
/// <seealso cref="FileProcessor.Client.IFileProcessorClient" />
public class FileProcessorClient : ClientProxyBase, IFileProcessorClient {
#region Fields
public enum SortDirection {
Ascending,
Descending,
}
public record PagingRequest(Int32 PageNumber, Int32 PageSize, SortDirection Direction);

/// <summary>
/// The base address resolver
/// </summary>
private readonly Func<String, String> BaseAddressResolver;
public interface IFileProcessorClient {

private readonly HttpClient HttpClient;
Task<Result<List<FileProfile>>> GetFileProfiles(String accessToken,
CancellationToken cancellationToken);

private readonly Func<Object, String> Serialise;
Task<Result<FileProfile>> GetFileProfile(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken);

private readonly Func<String, Type, Object> Deserialise;
Task<Result<List<FileProfile>>> GetFileProfileVersions(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken);

#endregion
Task<Result<FileProfile>> GetFileProfileVersion(String accessToken,
Guid fileProfileId,
Guid fileProfileVersionId,
CancellationToken cancellationToken);

Task<Result<FileProfile>> CreateFileProfile(String accessToken,
DataTransferObjects.Requests.CreateFileProfileRequest request,
CancellationToken cancellationToken);

Task<Result<FileProfile>> UpdateFileProfile(String accessToken,
Guid fileProfileId,
DataTransferObjects.Requests.UpdateFileProfileRequest request,
CancellationToken cancellationToken);

#region Constructors
Task<Result> ArchiveFileProfile(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken);

Task<Result<ApiFileDetails>> GetFile(String accessToken,
Guid estateId,
Guid fileId,
CancellationToken cancellationToken);

/// <returns></returns>
Task<Result<ApiFileImportLog>> GetFileImportLog(String accessToken,
Guid fileImportLogId,
Guid estateId,
Guid? merchantId,
CancellationToken cancellationToken);

Task<Result<FileImportLogList>> GetFileImportLogs(String accessToken,
Guid estateId,
DateOnly startDate,
DateOnly endDate,
Guid? merchantId,
PagingRequest pagingRequest,
CancellationToken cancellationToken);

Task<Result<Guid>> UploadFile(String accessToken,
String fileName,
Byte[] fileData,
UploadFileRequest uploadFileRequest,
CancellationToken cancellationToken);

}

public class FileProcessorClient : ClientProxyBase, IFileProcessorClient {

private readonly Func<String, String> BaseAddressResolver;

/// <summary>
/// Initializes a new instance of the <see cref="FileProcessorClient"/> class.
/// </summary>
/// <param name="baseAddressResolver">The base address resolver.</param>
/// <param name="httpClient">The HTTP client.</param>
public FileProcessorClient(Func<String, String> baseAddressResolver,
HttpClient httpClient,
Func<object, string> serialise,
Func<string, Type, object> deserialise) : base(httpClient, serialise, deserialise)
{
Func<string, Type, object> deserialise) : base(httpClient, serialise, deserialise) {
this.BaseAddressResolver = baseAddressResolver;
this.HttpClient = httpClient;
this.Serialise = serialise;
this.Deserialise = deserialise;
}

#endregion

#region Methods

public async Task<Result<List<FileProfile>>> GetFileProfiles(String accessToken,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl("/api/file-profiles");
return await this.SendRequest<List<FileProfile>>(HttpMethod.Get, requestUri, accessToken, null, cancellationToken);
return await this.Get<List<FileProfile>>(requestUri, accessToken, null, cancellationToken);
}

public async Task<Result<FileProfile>> GetFileProfile(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/file-profiles/{fileProfileId}");
return await this.SendRequest<FileProfile>(HttpMethod.Get, requestUri, accessToken, null, cancellationToken);
return await this.Get<FileProfile>(requestUri, accessToken, null, cancellationToken);
}

public async Task<Result<List<FileProfile>>> GetFileProfileVersions(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/file-profiles/{fileProfileId}/versions");
return await this.SendRequest<List<FileProfile>>(HttpMethod.Get, requestUri, accessToken, null, cancellationToken);
return await this.Get<List<FileProfile>>(requestUri, accessToken, null, cancellationToken);
}

public async Task<Result<FileProfile>> GetFileProfileVersion(String accessToken,
Expand All @@ -91,15 +124,15 @@ public async Task<Result<FileProfile>> GetFileProfileVersion(String accessToken,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/file-profiles/{fileProfileId}/versions/{fileProfileVersionId}");
return await this.SendRequest<FileProfile>(HttpMethod.Get, requestUri, accessToken, null, cancellationToken);
return await this.Get<FileProfile>(requestUri, accessToken, null, cancellationToken);
}

public async Task<Result<FileProfile>> CreateFileProfile(String accessToken,
CreateFileProfileRequest request,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl("/api/file-profiles");
return await this.SendRequest<FileProfile>(HttpMethod.Post, requestUri, accessToken, request, cancellationToken);
return await this.Post<CreateFileProfileRequest, FileProfile>(requestUri, request, accessToken, cancellationToken);
}

public async Task<Result<FileProfile>> UpdateFileProfile(String accessToken,
Expand All @@ -108,15 +141,15 @@ public async Task<Result<FileProfile>> UpdateFileProfile(String accessToken,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/file-profiles/{fileProfileId}");
return await this.SendRequest<FileProfile>(HttpMethod.Patch, requestUri, accessToken, request, cancellationToken);
return await this.Patch<UpdateFileProfileRequest>(requestUri, request, accessToken, cancellationToken);
}

public async Task<Result> ArchiveFileProfile(String accessToken,
Guid fileProfileId,
CancellationToken cancellationToken)
{
String requestUri = this.BuildRequestUrl($"/api/file-profiles/{fileProfileId}");
Result<FileProfile> result = await this.SendRequest<FileProfile>(HttpMethod.Delete, requestUri, accessToken, null, cancellationToken);
Result<FileProfile> result = await this.Delete(requestUri, accessToken, cancellationToken);

if (result.IsFailed)
{
Expand All @@ -126,14 +159,6 @@ public async Task<Result> ArchiveFileProfile(String accessToken,
return Result.Success();
}

/// <summary>
/// Gets the file.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="estateId">The estate identifier.</param>
/// <param name="fileId">The file identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
public async Task<Result<ApiFileDetails>> GetFile(String accessToken,
Guid estateId,
Guid fileId,
Expand All @@ -156,15 +181,6 @@ public async Task<Result<ApiFileDetails>> GetFile(String accessToken,
}
}

/// <summary>
/// Gets the file import log.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="fileImportLogId">The file import log identifier.</param>
/// <param name="estateId">The estate identifier.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
public async Task<Result<ApiFileImportLog>> GetFileImportLog(String accessToken,
Guid fileImportLogId,
Guid estateId,
Expand Down Expand Up @@ -192,27 +208,21 @@ public async Task<Result<ApiFileImportLog>> GetFileImportLog(String accessToken,
}
}

/// <summary>
/// Gets the file import logs.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="estateId">The estate identifier.</param>
/// <param name="startDate">The first calendar date.</param>
/// <param name="endDate">The last calendar date.</param>
/// <param name="merchantId">The merchant identifier.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
public async Task<Result<FileImportLogList>> GetFileImportLogs(String accessToken,
Guid estateId,
DateOnly startDate,
DateOnly endDate,
Guid? merchantId,
Int32 pageNumber,
Int32 pageSize,
Boolean descending,
PagingRequest pagingRequest,
CancellationToken cancellationToken) {

Boolean descending = pagingRequest.Direction switch {
SortDirection.Ascending => false,
_ => true
};

String requestUri = this.BuildRequestUrl(
$"/api/fileImportLogs?estateId={estateId}&startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}&pageNumber={pageNumber}&pageSize={pageSize}&descending={descending}");
$"/api/fileImportLogs?estateId={estateId}&startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}&pageNumber={pagingRequest.PageNumber}&pageSize={pagingRequest.PageSize}&descending={descending}");

if (merchantId.HasValue)
requestUri += $"&merchantId={merchantId}";
Expand All @@ -221,15 +231,6 @@ public async Task<Result<FileImportLogList>> GetFileImportLogs(String accessToke
return result.IsFailed ? ResultHelpers.CreateFailure(result) : result;
}

/// <summary>
/// Uploads the file.
/// </summary>
/// <param name="accessToken">The access token.</param>
/// <param name="fileName">Name of the file.</param>
/// <param name="fileData">The file data.</param>
/// <param name="uploadFileRequest">The upload file request.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns></returns>
public async Task<Result<Guid>> UploadFile(String accessToken,
String fileName,
Byte[] fileData,
Expand Down Expand Up @@ -276,11 +277,6 @@ private Guid CreateGuidFromFileData(Byte[] fileContents)
}
}

/// <summary>
/// Builds the request URL.
/// </summary>
/// <param name="route">The route.</param>
/// <returns></returns>
private String BuildRequestUrl(String route) {
String baseAddress = this.BaseAddressResolver("FileProcessorApi");

Expand All @@ -289,43 +285,6 @@ private String BuildRequestUrl(String route) {
return requestUri;
}

private async Task<Result<T>> SendRequest<T>(HttpMethod method,
String requestUri,
String accessToken,
Object body,
CancellationToken cancellationToken)
{
using HttpRequestMessage request = new(method, requestUri);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

if (body != null)
{
String payload = this.Serialise(body);
request.Content = new StringContent(payload, Encoding.UTF8, "application/json");
}

HttpResponseMessage response = await this.HttpClient.SendAsync(request, cancellationToken);
String responseContent = response.Content == null ? null : await response.Content.ReadAsStringAsync(cancellationToken);

if (response.IsSuccessStatusCode == false)
{
String message = String.IsNullOrWhiteSpace(responseContent)
? $"Request failed with status code {(Int32)response.StatusCode}"
: responseContent;

return response.StatusCode == System.Net.HttpStatusCode.NotFound
? Result.NotFound(message)
: Result.Failure(message);
}

if (String.IsNullOrWhiteSpace(responseContent))
{
return Result.Success(default(T));
}

Object deserialised = this.Deserialise(responseContent, typeof(T));
return Result.Success((T)deserialised);
}

#endregion
}
Expand Down
Loading
Loading