diff --git a/EstateReportingAPI.BusinessLogic/EstateReportingAPI.BusinessLogic.csproj b/EstateReportingAPI.BusinessLogic/EstateReportingAPI.BusinessLogic.csproj index 49d9a39..5f3eb7d 100644 --- a/EstateReportingAPI.BusinessLogic/EstateReportingAPI.BusinessLogic.csproj +++ b/EstateReportingAPI.BusinessLogic/EstateReportingAPI.BusinessLogic.csproj @@ -7,6 +7,7 @@ + diff --git a/EstateReportingAPI.BusinessLogic/Queries/Queries.cs b/EstateReportingAPI.BusinessLogic/Queries/Queries.cs new file mode 100644 index 0000000..59ed4a3 --- /dev/null +++ b/EstateReportingAPI.BusinessLogic/Queries/Queries.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using EstateReportingAPI.Models; +using MediatR; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.WebUtilities; +using SimpleResults; + +namespace EstateReportingAPI.BusinessLogic.Queries +{ + public record TransactionQueries { + public record TodaysSalesQuery(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate) : IRequest>; + public record TodaysFailedSales(Guid estateId, DateTime comparisonDate, String responseCode) : IRequest>; + + public record TodaysSalesCountByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate) : IRequest>>; + public record TodaysSalesValueByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate) : IRequest>>; + + public record TransactionSearchQuery(Guid estateId, TransactionSearchRequest request, PagingRequest pagingRequest, Models.SortingRequest sortingRequest) : IRequest>>; + } + + public record CalendarQueries { + public record GetComparisonDatesQuery(Guid EstateId) : IRequest>>; + public record GetAllDatesQuery(Guid EstateId) : IRequest>>; + public record GetYearsQuery(Guid EstateId) : IRequest>>; + } + + public record MerchantQueries { + public record GetMerchantsQuery(Guid EstateId) : IRequest>>; + public record GetTransactionKpisQuery(Guid EstateId) : IRequest>; + public record GetByLastSaleQuery(Guid EstateId, DateTime StartDateTime, DateTime EndDateTime) : IRequest>>; + public record GetTopMerchantsBySalesValueQuery(Guid EstateId, Int32 numberOfMerchants) : IRequest>>; + public record GetBottomMerchantsBySalesValueQuery(Guid EstateId, Int32 numberOfMerchants) : IRequest>>; + public record GetMerchantPerformanceQuery(Guid EstateId, DateTime comparisonDate, List merchantReportingIds) : IRequest>; + } + + public record OperatorQueries { + public record GetOperatorsQuery(Guid EstateId) : IRequest>>; + public record GetOperatorPerformanceQuery(Guid EstateId, DateTime comparisonDate, List operatorReportingIds) : IRequest>; + public record GetTopOperatorsBySalesValueQuery(Guid EstateId, Int32 numberOfOperators) : IRequest>>; + public record GetBottomOperatorsBySalesValueQuery(Guid EstateId, Int32 numberOfOperators) : IRequest>>; + } + + public record ProductQueries + { + public record GetProductPerformanceQuery(Guid EstateId, DateTime comparisonDate, List productReportingIds) : IRequest>; + public record GetTopProductsBySalesValueQuery(Guid EstateId, Int32 numberOfProducts) : IRequest>>; + public record GetBottomProductsBySalesValueQuery(Guid EstateId, Int32 numberOfProducts) : IRequest>>; + } + + public record ResponseCodeQueries { + public record GetResponseCodesQuery(Guid EstateId) : IRequest>>; + } + + public record SettlementQueries { + public record GetTodaysSettlementQuery(Guid EstateId, Int32 MerchantReportingId, Int32 OperatorReportingId, DateTime ComparisonDate) : IRequest>; + + public record GetLastSettlementQuery(Guid EstateId) : IRequest>; + + public record GetUnsettledFeesQuery(Guid EstateId,DateTime StartDate, DateTime EndDate, List MerchantIdFilter, List OperatorIdFilter, List ProductIdFilter, GroupByOption GroupByOption) : IRequest>>; + + } +} diff --git a/EstateReportingAPI.BusinessLogic/RequestHandlers/CalendarRequestHandler.cs b/EstateReportingAPI.BusinessLogic/RequestHandlers/CalendarRequestHandler.cs new file mode 100644 index 0000000..50fcc79 --- /dev/null +++ b/EstateReportingAPI.BusinessLogic/RequestHandlers/CalendarRequestHandler.cs @@ -0,0 +1,275 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using EstateReportingAPI.BusinessLogic.Queries; +using EstateReportingAPI.Models; +using MediatR; +using SimpleResults; + +namespace EstateReportingAPI.BusinessLogic.RequestHandlers +{ + public class TransactionRequestHandler : IRequestHandler>, + IRequestHandler>, + IRequestHandler>>, + IRequestHandler>>, + IRequestHandler>> { + private readonly IReportingManager Manager; + + public TransactionRequestHandler(IReportingManager manager) { + this.Manager = manager; + } + + public async Task> Handle(TransactionQueries.TodaysFailedSales request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTodaysFailedSales(request.estateId, request.comparisonDate, request.responseCode, cancellationToken); + return Result.Success(result); + } + + public async Task> Handle(TransactionQueries.TodaysSalesQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTodaysSales(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(TransactionQueries.TodaysSalesCountByHour request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTodaysSalesCountByHour(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(TransactionQueries.TodaysSalesValueByHour request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTodaysSalesValueByHour(request.estateId, request.merchantReportingId, request.operatorReportingId, request.comparisonDate, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(TransactionQueries.TransactionSearchQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.TransactionSearch(request.estateId, request.request, request.pagingRequest, request.sortingRequest, cancellationToken); + return Result.Success(result); + } + + + } + + + + public class CalendarRequestHandler : IRequestHandler>>, + IRequestHandler>>, + IRequestHandler>> { + private readonly IReportingManager Manager; + public CalendarRequestHandler(IReportingManager manager) { + this.Manager = manager; + } + public async Task>> Handle(CalendarQueries.GetAllDatesQuery request, + CancellationToken cancellationToken) { + List result = await this.Manager.GetCalendarDates(request.EstateId, cancellationToken); + + if (result.Any() == false) { + return Result.NotFound("No calendar dates found"); + } + + return Result.Success(result); + + } + + public async Task>> Handle(CalendarQueries.GetComparisonDatesQuery request, + CancellationToken cancellationToken) { + List result = await this.Manager.GetCalendarComparisonDates(request.EstateId, cancellationToken); + if (result.Any() == false) + { + return Result.NotFound("No calendar comparison dates found"); + } + + return Result.Success(result); + } + + public async Task>> Handle(CalendarQueries.GetYearsQuery request, + CancellationToken cancellationToken) { + List result = await this.Manager.GetCalendarYears(request.EstateId, cancellationToken); + if (result.Any() == false) + { + return Result.NotFound("No calendar years found"); + } + + return Result.Success(result); + } + } + + public class MerchantRequestHandler :IRequestHandler>>, + IRequestHandler>>, + IRequestHandler>, + IRequestHandler>, + IRequestHandler>>, + IRequestHandler>> + { + private readonly IReportingManager Manager; + public MerchantRequestHandler(IReportingManager manager) + { + this.Manager = manager; + } + public async Task>> Handle(MerchantQueries.GetMerchantsQuery request, + CancellationToken cancellationToken) { + List result = await this.Manager.GetMerchants(request.EstateId, cancellationToken); + if (result.Any() == false) + { + return Result.NotFound("No merchants found"); + } + + return Result.Success(result); + } + + public async Task>> Handle(MerchantQueries.GetByLastSaleQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetMerchantsByLastSale(request.EstateId, request.StartDateTime, request.EndDateTime, cancellationToken); + return Result.Success(result); + } + + public async Task> Handle(MerchantQueries.GetMerchantPerformanceQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetMerchantPerformance(request.EstateId, request.comparisonDate, request.merchantReportingIds, cancellationToken); + return Result.Success(result); + } + + public async Task> Handle(MerchantQueries.GetTransactionKpisQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetMerchantsTransactionKpis(request.EstateId, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(MerchantQueries.GetBottomMerchantsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfMerchants, Dimension.Merchant, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(MerchantQueries.GetTopMerchantsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfMerchants, Dimension.Merchant, cancellationToken); + return Result.Success(result); + } + } + + public class OperatorRequestHandler : IRequestHandler>>, + IRequestHandler>, + IRequestHandler>>, + IRequestHandler>> + { + private readonly IReportingManager Manager; + public OperatorRequestHandler(IReportingManager manager) + { + this.Manager = manager; + } + + public async Task>> Handle(OperatorQueries.GetOperatorsQuery request, + CancellationToken cancellationToken) + { + List result = await this.Manager.GetOperators(request.EstateId, cancellationToken); + if (result.Any() == false) + { + return Result.NotFound("No operators found"); + } + + return Result.Success(result); + } + + public async Task> Handle(OperatorQueries.GetOperatorPerformanceQuery request, + CancellationToken cancellationToken) + { + var result = await this.Manager.GetOperatorPerformance(request.EstateId, request.comparisonDate, request.operatorReportingIds, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(OperatorQueries.GetTopOperatorsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfOperators, Dimension.Operator, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(OperatorQueries.GetBottomOperatorsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfOperators, Dimension.Operator, cancellationToken); + return Result.Success(result); + } + } + + public class ResponseCodeRequestHandler : IRequestHandler>> { + private readonly IReportingManager Manager; + + public ResponseCodeRequestHandler(IReportingManager manager) { + this.Manager = manager; + } + + public async Task>> Handle(ResponseCodeQueries.GetResponseCodesQuery request, + CancellationToken cancellationToken) { + List result = await this.Manager.GetResponseCodes(request.EstateId, cancellationToken); + if (result.Any() == false) { + return Result.NotFound("No response codes found"); + } + + return Result.Success(result); + } + } + + public class SettlementRequestHandler : IRequestHandler>, + IRequestHandler>, + IRequestHandler>> { + private readonly IReportingManager Manager; + public SettlementRequestHandler(IReportingManager manager) + { + this.Manager = manager; + } + + public async Task> Handle(SettlementQueries.GetTodaysSettlementQuery request, + CancellationToken cancellationToken) { + Models.TodaysSettlement model = await this.Manager.GetTodaysSettlement(request.EstateId, request.MerchantReportingId, request.OperatorReportingId, request.ComparisonDate, cancellationToken); + + return Result.Success(model); + } + + public async Task> Handle(SettlementQueries.GetLastSettlementQuery request, + CancellationToken cancellationToken) + { + LastSettlement model = await this.Manager.GetLastSettlement(request.EstateId, cancellationToken); + + return Result.Success(model); + } + + public async Task>> Handle(SettlementQueries.GetUnsettledFeesQuery request, + CancellationToken cancellationToken) { + List model = await this.Manager.GetUnsettledFees(request.EstateId, request.StartDate, request.EndDate, request.MerchantIdFilter, request.OperatorIdFilter, request.ProductIdFilter, request.GroupByOption, cancellationToken); + return Result.Success(model); + } + } + + public class ProductRequestHandler : IRequestHandler>, + IRequestHandler>>, + IRequestHandler>> + { + private readonly IReportingManager Manager; + + public ProductRequestHandler(IReportingManager manager) { + this.Manager = manager; + } + public async Task> Handle(ProductQueries.GetProductPerformanceQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetProductPerformance(request.EstateId, request.comparisonDate, request.productReportingIds, cancellationToken); + + return Result.Success(result); + } + + public async Task>> Handle(ProductQueries.GetTopProductsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Top, request.numberOfProducts, Dimension.Product, cancellationToken); + return Result.Success(result); + } + + public async Task>> Handle(ProductQueries.GetBottomProductsBySalesValueQuery request, + CancellationToken cancellationToken) { + var result = await this.Manager.GetTopBottomData(request.EstateId, TopBottom.Bottom, request.numberOfProducts, Dimension.Product, cancellationToken); + return Result.Success(result); + } + } +} diff --git a/EstateReportingAPI.Client/EstateReportingAPI.Client.csproj b/EstateReportingAPI.Client/EstateReportingAPI.Client.csproj index c208ee9..47dafd6 100644 --- a/EstateReportingAPI.Client/EstateReportingAPI.Client.csproj +++ b/EstateReportingAPI.Client/EstateReportingAPI.Client.csproj @@ -9,6 +9,7 @@ + diff --git a/EstateReportingAPI.Client/EstateReportingApiClient.cs b/EstateReportingAPI.Client/EstateReportingApiClient.cs index 0f254fe..678a2ec 100644 --- a/EstateReportingAPI.Client/EstateReportingApiClient.cs +++ b/EstateReportingAPI.Client/EstateReportingApiClient.cs @@ -1,6 +1,8 @@ using System; using System.Collections.Generic; using System.Text; +using Shared.Results; +using SimpleResults; namespace EstateReportingAPI.Client{ using System; @@ -13,8 +15,14 @@ namespace EstateReportingAPI.Client{ using ClientProxyBase; using DataTransferObjects; using DataTrasferObjects; + using Microsoft.AspNetCore.Http; using Newtonsoft.Json; + internal class ResponseData + { + public T Data { get; set; } + } + public class EstateReportingApiClient : ClientProxyBase, IEstateReportingApiClient{ #region Fields @@ -36,9 +44,7 @@ public EstateReportingApiClient(Func baseAddressResolver, #region Methods - public async Task> GetCalendarDates(String accessToken, Guid estateId, Int32 year, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetCalendarDates(String accessToken, Guid estateId, Int32 year, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl($"/api/dimensions/calendar/{year}/dates"); try{ @@ -50,10 +56,7 @@ public async Task> GetCalendarDates(String accessToken, Guid HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -61,12 +64,19 @@ public async Task> GetCalendarDates(String accessToken, Guid throw exception; } + } + + private async Task> ProcessResponse(HttpResponseMessage httpResponse, CancellationToken cancellationToken) { + Result result = await this.HandleResponseX(httpResponse, cancellationToken); + if (result.IsFailed) + return ResultHelpers.CreateFailure(result); - return response; + ResponseData response = JsonConvert.DeserializeObject>(result.Data); + + return Result.Success(response.Data); } - public async Task> GetCalendarYears(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; + public async Task>> GetCalendarYears(String accessToken, Guid estateId, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl("/api/dimensions/calendar/years"); @@ -79,10 +89,7 @@ public async Task> GetCalendarYears(String accessToken, Guid HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -90,13 +97,9 @@ public async Task> GetCalendarYears(String accessToken, Guid throw exception; } - - return response; } - public async Task> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl("/api/dimensions/calendar/comparisondates"); try{ @@ -108,10 +111,7 @@ public async Task> GetComparisonDates(String accessToken, G HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -119,11 +119,9 @@ public async Task> GetComparisonDates(String accessToken, G throw exception; } - - return response; } - public async Task GetLastSettlement(String accessToken, Guid estateId, CancellationToken cancellationToken){ + public async Task> GetLastSettlement(String accessToken, Guid estateId, CancellationToken cancellationToken){ LastSettlement response = null; String requestUri = this.BuildRequestUrl("/api/facts/settlements/lastsettlement"); @@ -137,10 +135,7 @@ public async Task GetLastSettlement(String accessToken, Guid est HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -152,9 +147,7 @@ public async Task GetLastSettlement(String accessToken, Guid est return response; } - public async Task> GetResponseCodes(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetResponseCodes(String accessToken, Guid estateId, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl("/api/dimensions/responsecodes"); try @@ -167,10 +160,7 @@ public async Task> GetResponseCodes(String accessToken, Guid HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch (Exception ex) { @@ -179,17 +169,13 @@ public async Task> GetResponseCodes(String accessToken, Guid throw exception; } - - return response; } - public async Task GetMerchantPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List merchantReportingIds, CancellationToken cancellationToken){ + public async Task> GetMerchantPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List merchantReportingIds, CancellationToken cancellationToken){ // Serialize the integer array into a comma-separated string string serializedArray = string.Join(",", merchantReportingIds); - TodaysSales response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchants/performance?comparisonDate={comparisonDate.Date:yyyy-MM-dd}&merchantReportingIds={serializedArray}"); try @@ -202,10 +188,7 @@ public async Task GetMerchantPerformance(String accessToken, Guid e HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch (Exception ex) { @@ -214,16 +197,12 @@ public async Task GetMerchantPerformance(String accessToken, Guid e throw exception; } - - return response; } - public async Task GetProductPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken){ + public async Task> GetProductPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken){ // Serialize the integer array into a comma-separated string string serializedArray = string.Join(",", productReportingIds); - TodaysSales response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/products/performance?comparisonDate={comparisonDate.Date:yyyy-MM-dd}&productReportingIds={serializedArray}"); try @@ -236,10 +215,7 @@ public async Task GetProductPerformance(String accessToken, Guid es HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch (Exception ex) { @@ -248,12 +224,9 @@ public async Task GetProductPerformance(String accessToken, Guid es throw exception; } - - return response; } - public async Task> GetMerchantsByLastSaleDate(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken){ - List response = new List(); + public async Task>> GetMerchantsByLastSaleDate(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchants/lastsale?startDate={startDate:yyyy-MM-dd HH:mm:ss}&enddate={endDate:yyyy-MM-dd HH:mm:ss}"); @@ -267,10 +240,7 @@ public async Task> GetMerchantsByLastSaleDate(String accessToken, HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch (Exception ex) { @@ -279,16 +249,12 @@ public async Task> GetMerchantsByLastSaleDate(String accessToken, throw exception; } - - return response; } - public async Task GetOperatorPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken){ + public async Task> GetOperatorPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken){ // Serialize the integer array into a comma-separated string string serializedArray = string.Join(",", operatorReportingIds); - TodaysSales response = null; - String requestUri = this.BuildRequestUrl($"/api/facts/transactions/operators/performance?comparisonDate={comparisonDate.Date:yyyy-MM-dd}&operatorReportingIds={serializedArray}"); try @@ -301,10 +267,7 @@ public async Task GetOperatorPerformance(String accessToken, Guid e HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch (Exception ex) { @@ -313,13 +276,9 @@ public async Task GetOperatorPerformance(String accessToken, Guid e throw exception; } - - return response; } - public async Task> TransactionSearch(String accessToken, Guid estateId, TransactionSearchRequest searchRequest, Int32? page, Int32? pageSize, SortField? sortField, SortDirection? sortDirection, CancellationToken cancellationToken){ - - List response = null; + public async Task>> TransactionSearch(String accessToken, Guid estateId, TransactionSearchRequest searchRequest, Int32? page, Int32? pageSize, SortField? sortField, SortDirection? sortDirection, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); if (page.HasValue){ builder.AddParameter("page", page.Value); @@ -351,10 +310,7 @@ public async Task> TransactionSearch(String accessToken, HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch (Exception ex) { @@ -363,12 +319,9 @@ public async Task> TransactionSearch(String accessToken, throw exception; } - - return response; } - public async Task> GetUnsettledFees(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, List merchantIds, List operatorIds, List productIds, GroupByOption groupBy, CancellationToken cancellationToken){ - List response = null; + public async Task>> GetUnsettledFees(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, List merchantIds, List operatorIds, List productIds, GroupByOption groupBy, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("startDate", $"{startDate:yyyy-MM-dd}"); builder.AddParameter("endDate", $"{endDate:yyyy-MM-dd}"); @@ -403,10 +356,7 @@ public async Task> GetUnsettledFees(String accessToken, Guid HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch (Exception ex) { @@ -416,13 +366,9 @@ public async Task> GetUnsettledFees(String accessToken, Guid throw exception; } - return response; - } - public async Task GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken){ - MerchantKpi response = null; - + public async Task> GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl("/api/facts/transactions/merchantkpis"); try{ @@ -434,10 +380,7 @@ public async Task GetMerchantKpi(String accessToken, Guid estateId, HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -445,13 +388,10 @@ public async Task GetMerchantKpi(String accessToken, Guid estateId, throw exception; } - - return response; } - public async Task> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken){ + String requestUri = this.BuildRequestUrl("/api/dimensions/merchants"); try{ @@ -463,10 +403,7 @@ public async Task> GetMerchants(String accessToken, Guid estateId HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -474,13 +411,10 @@ public async Task> GetMerchants(String accessToken, Guid estateId throw exception; } - - return response; } - public async Task> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken){ + String requestUri = this.BuildRequestUrl("/api/dimensions/operators"); try{ @@ -492,10 +426,7 @@ public async Task> GetOperators(String accessToken, Guid estateId HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -503,14 +434,9 @@ public async Task> GetOperators(String accessToken, Guid estateId throw exception; } - - return response; } - public async Task GetTodaysFailedSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken){ - TodaysSales response = null; - - + public async Task> GetTodaysFailedSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantReportingId", merchantReportingId); @@ -519,7 +445,7 @@ public async Task GetTodaysFailedSales(String accessToken, Guid est String requestUri = this.BuildRequestUrl($"/api/facts/transactions/todaysfailedsales?{builder.BuildQueryString()}"); - try{ + try { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", accessToken); request.Headers.Add("EstateId", estateId.ToString()); @@ -528,24 +454,17 @@ public async Task GetTodaysFailedSales(String accessToken, Guid est HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } - catch(Exception ex){ + catch (Exception ex) { // An exception has occurred, add some additional information to the message Exception exception = new Exception($"Error getting todays failed sales for estate {estateId} and response code {responseCode}.", ex); throw exception; } - - return response; } - public async Task GetTodaysSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ - TodaysSales response = null; - + public async Task> GetTodaysSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantReportingId", merchantReportingId); @@ -562,10 +481,7 @@ public async Task GetTodaysSales(String accessToken, Guid estateId, HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -573,14 +489,9 @@ public async Task GetTodaysSales(String accessToken, Guid estateId, throw exception; } - - return response; } - public async Task> GetTodaysSalesCountByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ - List response = null; - - + public async Task>> GetTodaysSalesCountByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantReportingId", merchantReportingId); @@ -597,10 +508,7 @@ public async Task> GetTodaysSalesCountByHour(String HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -608,14 +516,9 @@ public async Task> GetTodaysSalesCountByHour(String throw exception; } - - return response; } - public async Task> GetTodaysSalesValueByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ - List response = null; - - + public async Task>> GetTodaysSalesValueByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantReportingId", merchantReportingId); @@ -632,10 +535,7 @@ public async Task> GetTodaysSalesValueByHour(String HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -643,13 +543,9 @@ public async Task> GetTodaysSalesValueByHour(String throw exception; } - - return response; } - public async Task GetTodaysSettlement(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ - TodaysSettlement response = null; - + public async Task> GetTodaysSettlement(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){ QueryStringBuilder builder = new QueryStringBuilder(); builder.AddParameter("comparisonDate", $"{comparisonDate.Date:yyyy-MM-dd}"); builder.AddParameter("merchantReportingId", merchantReportingId); @@ -666,10 +562,7 @@ public async Task GetTodaysSettlement(String accessToken, Guid HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject(content); + return await ProcessResponse(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -677,13 +570,9 @@ public async Task GetTodaysSettlement(String accessToken, Guid throw exception; } - - return response; } - public async Task> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl($"/api/facts/transactions/merchants/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); try{ @@ -695,10 +584,7 @@ public async Task> GetTopBottomMerchantData(String a HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -706,13 +592,9 @@ public async Task> GetTopBottomMerchantData(String a throw exception; } - - return response; } - public async Task> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl($"/api/facts/transactions/operators/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); try{ @@ -724,10 +606,7 @@ public async Task> GetTopBottomOperatorData(String a HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -735,13 +614,9 @@ public async Task> GetTopBottomOperatorData(String a throw exception; } - - return response; } - public async Task> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ - List response = null; - + public async Task>> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken){ String requestUri = this.BuildRequestUrl($"/api/facts/transactions/products/topbottombyvalue?topOrBottom={(Int32)topBottom}&count={resultCount}"); try{ @@ -753,10 +628,7 @@ public async Task> GetTopBottomProductData(String acc HttpResponseMessage httpResponse = await this.HttpClient.SendAsync(request, cancellationToken); // Process the response - String content = await this.HandleResponse(httpResponse, cancellationToken); - - // call was successful so now deserialise the body to the response object - response = JsonConvert.DeserializeObject>(content); + return await ProcessResponse>(httpResponse, cancellationToken); } catch(Exception ex){ // An exception has occurred, add some additional information to the message @@ -764,8 +636,6 @@ public async Task> GetTopBottomProductData(String acc throw exception; } - - return response; } private String BuildRequestUrl(String route){ diff --git a/EstateReportingAPI.Client/IEstateReportingApiClient.cs b/EstateReportingAPI.Client/IEstateReportingApiClient.cs index 39f6456..9d10533 100644 --- a/EstateReportingAPI.Client/IEstateReportingApiClient.cs +++ b/EstateReportingAPI.Client/IEstateReportingApiClient.cs @@ -5,39 +5,40 @@ using System.Threading.Tasks; using DataTransferObjects; using DataTrasferObjects; + using SimpleResults; public interface IEstateReportingApiClient{ #region Methods - Task> GetCalendarDates(String accessToken, Guid estateId, Int32 year, CancellationToken cancellationToken); - Task> GetCalendarYears(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task GetLastSettlement(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task GetMerchantPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List merchantReportingIds, CancellationToken cancellationToken); - Task> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task>> GetCalendarDates(String accessToken, Guid estateId, Int32 year, CancellationToken cancellationToken); + Task>> GetCalendarYears(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task>> GetComparisonDates(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task> GetLastSettlement(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task> GetMerchantKpi(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task> GetMerchantPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List merchantReportingIds, CancellationToken cancellationToken); + Task>> GetMerchants(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task> GetMerchantsByLastSaleDate(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken); + Task>> GetMerchantsByLastSaleDate(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, CancellationToken cancellationToken); - Task GetOperatorPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken); - Task> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task> GetOperatorPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List operatorReportingIds, CancellationToken cancellationToken); + Task>> GetOperators(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task GetProductPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken); + Task> GetProductPerformance(String accessToken, Guid estateId, DateTime comparisonDate, List productReportingIds, CancellationToken cancellationToken); - Task> GetResponseCodes(String accessToken, Guid estateId, CancellationToken cancellationToken); + Task>> GetResponseCodes(String accessToken, Guid estateId, CancellationToken cancellationToken); - Task GetTodaysFailedSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken); - Task GetTodaysSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); - Task> GetTodaysSalesCountByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); - Task> GetTodaysSalesValueByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); - Task GetTodaysSettlement(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); - Task> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); + Task> GetTodaysFailedSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, String responseCode, DateTime comparisonDate, CancellationToken cancellationToken); + Task> GetTodaysSales(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); + Task>> GetTodaysSalesCountByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); + Task>> GetTodaysSalesValueByHour(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); + Task> GetTodaysSettlement(String accessToken, Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken); + Task>> GetTopBottomMerchantData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); - Task> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); - Task> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); + Task>> GetTopBottomOperatorData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); + Task>> GetTopBottomProductData(String accessToken, Guid estateId, TopBottom topBottom, Int32 resultCount, CancellationToken cancellationToken); - Task> TransactionSearch(String accessToken, Guid estateId, TransactionSearchRequest searchRequest, Int32? page, Int32? pageSize, SortField? sortField, SortDirection? sortDirection, CancellationToken cancellationToken); - Task> GetUnsettledFees(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, List merchantIds, List operatorIds, List productIds, GroupByOption groupBy, CancellationToken cancellationToken); + Task>> TransactionSearch(String accessToken, Guid estateId, TransactionSearchRequest searchRequest, Int32? page, Int32? pageSize, SortField? sortField, SortDirection? sortDirection, CancellationToken cancellationToken); + Task>> GetUnsettledFees(String accessToken, Guid estateId, DateTime startDate, DateTime endDate, List merchantIds, List operatorIds, List productIds, GroupByOption groupBy, CancellationToken cancellationToken); #endregion } diff --git a/EstateReportingAPI.IntegrationTests/ControllerTestsBase.cs b/EstateReportingAPI.IntegrationTests/ControllerTestsBase.cs index 25a86a5..5287034 100644 --- a/EstateReportingAPI.IntegrationTests/ControllerTestsBase.cs +++ b/EstateReportingAPI.IntegrationTests/ControllerTestsBase.cs @@ -1,4 +1,6 @@ -namespace EstateReportingAPI.IntegrationTests; +using SimpleResults; + +namespace EstateReportingAPI.IntegrationTests; using System.Net.Http.Headers; using System.Text; @@ -55,7 +57,7 @@ public virtual async Task DisposeAsync() protected Guid TestId; - internal async Task CreateAndSendHttpRequestMessage(String url, CancellationToken cancellationToken) + internal async Task> CreateAndSendHttpRequestMessage(String url, CancellationToken cancellationToken) { HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, url); requestMessage.Headers.Add("estateId", this.TestId.ToString()); @@ -65,10 +67,11 @@ public virtual async Task DisposeAsync() result.IsSuccessStatusCode.ShouldBeTrue(result.StatusCode.ToString()); String content = await result.Content.ReadAsStringAsync(cancellationToken); content.ShouldNotBeNull(); - return JsonConvert.DeserializeObject(content); + + return null; } - internal async Task CreateAndSendHttpRequestMessage(String url, String payload, CancellationToken cancellationToken) + internal async Task> CreateAndSendHttpRequestMessage(String url, String payload, CancellationToken cancellationToken) { HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Get, url); requestMessage.Headers.Add("estateId", this.TestId.ToString()); @@ -81,7 +84,8 @@ public virtual async Task DisposeAsync() result.IsSuccessStatusCode.ShouldBeTrue(result.StatusCode.ToString()); String content = await result.Content.ReadAsStringAsync(cancellationToken); content.ShouldNotBeNull(); - return JsonConvert.DeserializeObject(content); + + return null; } public static IContainerService DatabaseServerContainer; @@ -138,6 +142,8 @@ internal async Task ExecuteAsyncFunction(Func> asyncFunction) } } + + public class TestDockerHelper : DockerHelper{ public override async Task CreateSubscriptions(){ // Nothing here diff --git a/EstateReportingAPI.IntegrationTests/DimensionControllerTests.cs b/EstateReportingAPI.IntegrationTests/DimensionControllerTests.cs index afbd15c..6f196ee 100644 --- a/EstateReportingAPI.IntegrationTests/DimensionControllerTests.cs +++ b/EstateReportingAPI.IntegrationTests/DimensionControllerTests.cs @@ -1,4 +1,6 @@ -namespace EstateReportingAPI.IntegrationTests; +using SimpleResults; + +namespace EstateReportingAPI.IntegrationTests; using EstateManagement.Database.Contexts; using EstateReportingAPI.DataTrasferObjects; @@ -10,30 +12,15 @@ public class DimensionsControllerTests : ControllerTestsBase { - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetCalendarYears_NoDataInDatabase(ClientType clientType) + [Fact] + public async Task DimensionsController_GetCalendarYears_NoDataInDatabase() { - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetCalendarYears(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/calendar/years", CancellationToken.None) - }; - return result; - }; - List years = await ExecuteAsyncFunction(asyncFunction); - - years.ShouldNotBeNull(); - years.Count.ShouldBe(0); + var yearsResult = await ApiClient.GetCalendarYears(string.Empty, Guid.NewGuid(), CancellationToken.None); + yearsResult.IsFailed.ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetCalendarYears_YearsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetCalendarYears_YearsReturned() { List yearList = new(){ @@ -48,40 +35,19 @@ public async Task DimensionsController_GetCalendarYears_YearsReturned(ClientType await helper.AddCalendarYear(year); } - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetCalendarYears(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/calendar/years", CancellationToken.None) - }; - return result; - }; - List years = await ExecuteAsyncFunction(asyncFunction); + List years = await ApiClient.GetCalendarYears(string.Empty, Guid.NewGuid(), CancellationToken.None); years.ShouldNotBeNull(); years.Count.ShouldBe(yearList.Count); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetCalendarComparisonDates_DatesReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetCalendarComparisonDates_DatesReturned() { List datesInYear = helper.GetDatesForYear(DateTime.Now.Year); await helper.AddCalendarDates(datesInYear); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetComparisonDates(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/calendar/comparisondates", CancellationToken.None) - }; - return result; - }; - List dates = await ExecuteAsyncFunction(asyncFunction); - + List dates = await ApiClient.GetComparisonDates(string.Empty, Guid.NewGuid(), CancellationToken.None); List expectedDates = datesInYear.Where(d => d <= DateTime.Now.Date.AddDays(-1)).ToList(); int expectedCount = expectedDates.Count + 2; @@ -97,25 +63,16 @@ public async Task DimensionsController_GetCalendarComparisonDates_DatesReturned( dates.Select(d => d.Description).Contains("Last Month"); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetCalendarDates_DatesReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetCalendarDates_DatesReturned() { List datesInYear = helper.GetDatesForYear(2023); await helper.AddCalendarDates(datesInYear); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetCalendarDates(string.Empty, Guid.NewGuid(), 2023, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/calendar/2023/dates", CancellationToken.None) - }; - return result; - }; - List dates = await ExecuteAsyncFunction(asyncFunction); - + var datesResult = await ApiClient.GetCalendarDates(string.Empty, Guid.NewGuid(), 2023, CancellationToken.None); + + datesResult.IsSuccess.ShouldBeTrue(); + var dates = datesResult.Data; dates.ShouldNotBeNull(); dates.Count.ShouldBe(datesInYear.Where(d => d <= DateTime.Now.Date).ToList().Count); @@ -126,69 +83,32 @@ public async Task DimensionsController_GetCalendarDates_DatesReturned(ClientType } } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetCalendarDates_NoDataInDatabase(ClientType clientType) + [Fact] + public async Task DimensionsController_GetCalendarDates_NoDataInDatabase() { - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetCalendarDates(string.Empty, Guid.NewGuid(), 2023, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/calendar/2023/dates", CancellationToken.None) - }; - return result; - }; - List dates = await ExecuteAsyncFunction(asyncFunction); - - dates.ShouldNotBeNull(); - dates.Count.ShouldBe(0); + var datesResult = await ApiClient.GetCalendarDates(string.Empty, Guid.NewGuid(), 2023, CancellationToken.None); + datesResult.IsFailed.ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetMerchants_NoData_NoMerchantsReturned(ClientType clientType) - { - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/merchants", CancellationToken.None) - }; - return result; - }; - List merchants = await ExecuteAsyncFunction(asyncFunction); - - - merchants.ShouldNotBeNull(); - merchants.Count.ShouldBe(0); + [Fact] + public async Task DimensionsController_GetMerchants_NoData_NoMerchantsReturned() { + var result = await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsFailed.ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetMerchants_NoAddresses_MerchantsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetMerchants_NoAddresses_MerchantsReturned() { - int estateReportingId = await helper.AddEstate("Test Estate", "Ref1"); + await helper.AddEstate("Test Estate", "Ref1"); for (int i = 0; i < 10; i++) { await helper.AddMerchant("Test Estate", $"Test Merchant {i}", DateTime.Now); } - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/merchants", CancellationToken.None) - }; - return result; - }; - List merchants = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var merchants = result.Data; merchants.ShouldNotBeNull(); merchants.Count.ShouldBe(10); @@ -202,31 +122,23 @@ public async Task DimensionsController_GetMerchants_NoAddresses_MerchantsReturne } } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetMerchants_EachMerchantHasOneAddress_MerchantsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetMerchants_EachMerchantHasOneAddress_MerchantsReturned() { - int estateReportingId = await helper.AddEstate("Test Estate", "Ref1"); + await helper.AddEstate("Test Estate", "Ref1"); for (int i = 0; i < 10; i++) { - List<(string addressLine1, string town, string postCode, string region)> addressList = new List<(string addressLine1, string town, string postCode, string region)>(); + List<(string addressLine1, string town, string postCode, string region)> addressList = [ + ("Address Line 1", $"Test Town {i}", $"TE57 {i}NG", $"Region {i}") + ]; - addressList.Add(("Address Line 1", $"Test Town {i}", $"TE57 {i}NG", $"Region {i}")); await helper.AddMerchant("Test Estate", $"Test Merchant {i}", DateTime.Now, addressList); } - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/merchants", CancellationToken.None) - }; - return result; - }; - List merchants = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var merchants = result.Data; merchants.ShouldNotBeNull(); merchants.Count.ShouldBe(10); @@ -240,16 +152,14 @@ public async Task DimensionsController_GetMerchants_EachMerchantHasOneAddress_Me } } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetMerchants_EachMerchantHasTwoAddress_MerchantsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetMerchants_EachMerchantHasTwoAddress_MerchantsReturned() { - int estateReportingId = await helper.AddEstate("Test Estate", "Ref1"); + await helper.AddEstate("Test Estate", "Ref1"); for (int i = 0; i < 10; i++) { - List<(string addressLine1, string town, string postCode, string region)> addressList = new List<(string addressLine1, string town, string postCode, string region)>(); + List<(string addressLine1, string town, string postCode, string region)> addressList = []; for (int j = 0; j < 2; j++) { addressList.Add(("Address Line 1", $"Test Town {i}{j}", $"TE5{j} {i}NG", $"Region {i}{j}")); @@ -257,16 +167,9 @@ public async Task DimensionsController_GetMerchants_EachMerchantHasTwoAddress_Me await helper.AddMerchant("Test Estate", $"Test Merchant {i}", DateTime.Now, addressList); } - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/merchants", CancellationToken.None) - }; - return result; - }; - List merchants = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetMerchants(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var merchants = result.Data; merchants.ShouldNotBeNull(); merchants.Count.ShouldBe(10); @@ -280,30 +183,15 @@ public async Task DimensionsController_GetMerchants_EachMerchantHasTwoAddress_Me } } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetOperators_NoData_NoOperatorsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetOperators_NoData_NoOperatorsReturned() { - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetOperators(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/operators", CancellationToken.None) - }; - return result; - }; - List operators = await ExecuteAsyncFunction(asyncFunction); - - operators.ShouldNotBeNull(); - operators.Count.ShouldBe(0); + Result> result = await ApiClient.GetOperators(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsFailed.ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetOperators_OperatorsReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetOperators_OperatorsReturned() { int estateReportingId = await helper.AddEstate("Test Estate", "Ref1"); @@ -311,17 +199,10 @@ public async Task DimensionsController_GetOperators_OperatorsReturned(ClientType Int32 operator2ReportingId = await this.helper.AddOperator("Test Estate", "Operator2"); Int32 operator3ReportingId = await this.helper.AddOperator("Test Estate", "Operator3"); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetOperators(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/operators", CancellationToken.None) - }; - return result; - }; - List operators = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetOperators(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + var operators = result.Data; operators.ShouldNotBeNull(); operators.Count.ShouldBe(3); var operator1 = operators.SingleOrDefault(o => o.Name == "Operator1"); @@ -340,10 +221,8 @@ public async Task DimensionsController_GetOperators_OperatorsReturned(ClientType } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetResponseCodes_ResponseCodesReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetResponseCodes_ResponseCodesReturned() { await helper.AddResponseCode(0, "Success"); await helper.AddResponseCode(1000, "Unknown Device"); @@ -351,16 +230,10 @@ public async Task DimensionsController_GetResponseCodes_ResponseCodesReturned(Cl await helper.AddResponseCode(1002, "Unknown Merchant"); await helper.AddResponseCode(1003, "No Devices Configured"); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetResponseCodes(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/responsecodes", CancellationToken.None) - }; - return result; - }; - List responseCodes = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetResponseCodes(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + + var responseCodes = result.Data; responseCodes.ShouldNotBeNull(); responseCodes.Count.ShouldBe(5); @@ -371,23 +244,11 @@ public async Task DimensionsController_GetResponseCodes_ResponseCodesReturned(Cl responseCodes.Any(o => o.Code == 1003).ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task DimensionsController_GetResponseCodes_NoData_NoResponseCodesReturned(ClientType clientType) + [Fact] + public async Task DimensionsController_GetResponseCodes_NoData_NoResponseCodesReturned() { - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetResponseCodes(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/dimensions/responsecodes", CancellationToken.None) - }; - return result; - }; - List responseCodes = await ExecuteAsyncFunction(asyncFunction); - - responseCodes.ShouldBeEmpty(); + var result = await ApiClient.GetResponseCodes(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsFailed.ShouldBeTrue(); } protected override async Task ClearStandingData() diff --git a/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs b/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs index 52cdf77..7d775e2 100644 --- a/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs +++ b/EstateReportingAPI.IntegrationTests/FactSettlementsControllerTests.cs @@ -114,10 +114,8 @@ protected override async Task SetupStandingData() ); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_TodaysSettlement_SettlementReturned(ClientType clientType) + [Fact] + public async Task FactSettlementsController_TodaysSettlement_SettlementReturned() { int overallTodaysSettlementTransactionCount = 0; int overallTodaysPendingSettlementTransactionCount = 0; @@ -153,17 +151,9 @@ public async Task FactSettlementsController_TodaysSettlement_SettlementReturned( await helper.RunTodaysTransactionsSummaryProcessing(todaysDate.Date.AddDays(-1)); await helper.RunSettlementSummaryProcessing(comparisonDate.Date); - Func> asyncFunction = async () => - { - TodaysSettlement result = clientType switch - { - ClientType.Api => await ApiClient.GetTodaysSettlement(string.Empty, Guid.NewGuid(), 0,0, DateTime.Now.AddDays(-1), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/settlements/todayssettlement?comparisonDate={DateTime.Now.AddDays(-1).ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - TodaysSettlement todaysSettlement = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTodaysSettlement(string.Empty, Guid.NewGuid(), 0, 0, DateTime.Now.AddDays(-1), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var todaysSettlement = result.Data; todaysSettlement.ShouldNotBeNull(); todaysSettlement.ComparisonSettlementCount.ShouldBe(overallComparisonSettlementTransactionCount); todaysSettlement.ComparisonSettlementValue.ShouldBe(comparisonOverallTotals.Sum(c => c.settlementFees)); @@ -176,10 +166,8 @@ public async Task FactSettlementsController_TodaysSettlement_SettlementReturned( todaysSettlement.TodaysPendingSettlementValue.ShouldBe(todayOverallTotals.Sum(c => c.pendingSettlementFees)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_LastSettlement_SettlementReturned(ClientType clientType) + [Fact] + public async Task FactSettlementsController_LastSettlement_SettlementReturned() { EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); @@ -215,17 +203,10 @@ public async Task FactSettlementsController_LastSettlement_SettlementReturned(Cl } await helper.RunSettlementSummaryProcessing(DateTime.Now.AddDays(-1)); - - Func> asyncFunction = async () => - { - LastSettlement result = clientType switch - { - ClientType.Api => await ApiClient.GetLastSettlement(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/settlements/lastsettlement", CancellationToken.None) - }; - return result; - }; - LastSettlement lastSettlement = await ExecuteAsyncFunction(asyncFunction); + + var result = await ApiClient.GetLastSettlement(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var lastSettlement = result.Data; lastSettlement.ShouldNotBeNull(); lastSettlement.FeesValue.ShouldBe(completeTotalsList.Sum(t => t.settlementFees)); @@ -233,10 +214,8 @@ public async Task FactSettlementsController_LastSettlement_SettlementReturned(Cl lastSettlement.SalesValue.ShouldBe(completeTotalsList.Sum(c => c.settledTransactions)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_LastSettlement_NoSettlementRecords_SettlementReturned(ClientType clientType) + [Fact] + public async Task FactSettlementsController_LastSettlement_NoSettlementRecords_SettlementReturned() { EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); @@ -244,29 +223,13 @@ public async Task FactSettlementsController_LastSettlement_NoSettlementRecords_S await helper.RunSettlementSummaryProcessing(DateTime.Now.AddDays(-1)); - Func> asyncFunction = async () => - { - LastSettlement result = clientType switch - { - ClientType.Api => await ApiClient.GetLastSettlement(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/settlements/lastsettlement", CancellationToken.None) - }; - return result; - }; - - LastSettlement lastSettlement = await ExecuteAsyncFunction(asyncFunction); - - lastSettlement.ShouldNotBeNull(); - lastSettlement.FeesValue.ShouldBe(0); - lastSettlement.SalesCount.ShouldBe(0); - lastSettlement.SalesValue.ShouldBe(0); + var result = await ApiClient.GetLastSettlement(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsFailed.ShouldBeTrue(); } - [Theory(Skip = "To be fixed")] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_UnsettledFees_ByOperator_SettlementReturned(ClientType clientType){ + [Fact(Skip = "To be fixed")] + public async Task FactSettlementsController_UnsettledFees_ByOperator_SettlementReturned(){ // Add some fees over a date range for multiple operators EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); @@ -296,16 +259,9 @@ public async Task FactSettlementsController_UnsettledFees_ByOperator_SettlementR DateTime startDate = dates.Min(); DateTime endDate = dates.Max(); - Func>> asyncFunction = async () => - { - List result = clientType switch - { - ClientType.Api => await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate, endDate, null, null, null, GroupByOption.Operator, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/settlements/unsettledfees?startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}&groupByOption={(Int32)GroupByOption.Operator}", CancellationToken.None) - }; - return result; - }; - var unsettledFees = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate, endDate, null, null, null, GroupByOption.Merchant, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var unsettledFees = result.Data; unsettledFees.ShouldNotBeNull(); unsettledFees.ShouldNotBeEmpty(); @@ -325,10 +281,8 @@ public async Task FactSettlementsController_UnsettledFees_ByOperator_SettlementR } } - [Theory(Skip = "To be fixed")] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_UnsettledFees_ByMerchant_SettlementReturned(ClientType clientType) + [Fact(Skip = "To be fixed")] + public async Task FactSettlementsController_UnsettledFees_ByMerchant_SettlementReturned() { // Add some fees over a date range for multiple operators EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); @@ -361,17 +315,9 @@ public async Task FactSettlementsController_UnsettledFees_ByMerchant_SettlementR DateTime startDate = dates.Min(); DateTime endDate = dates.Max(); - Func>> asyncFunction = async () => - { - List result = clientType switch - { - ClientType.Api => await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate, endDate, null, null, null, GroupByOption.Merchant, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/settlements/unsettledfees?startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}&groupByOption={(Int32)GroupByOption.Merchant}", CancellationToken.None) - }; - return result; - }; - var unsettledFees = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate, endDate, null, null, null, GroupByOption.Merchant, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var unsettledFees = result.Data; unsettledFees.ShouldNotBeNull(); unsettledFees.ShouldNotBeEmpty(); unsettledFees.Count.ShouldBe(this.merchantsList.Count); @@ -388,10 +334,8 @@ public async Task FactSettlementsController_UnsettledFees_ByMerchant_SettlementR } } - [Theory(Skip = "To be fixed")] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactSettlementsController_UnsettledFees_ByProduct_SettlementReturned(ClientType clientType) + [Fact(Skip = "To be fixed")] + public async Task FactSettlementsController_UnsettledFees_ByProduct_SettlementReturned() { // Add some fees over a date range for multiple operators EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); @@ -424,16 +368,9 @@ public async Task FactSettlementsController_UnsettledFees_ByProduct_SettlementRe DateTime startDate = dates.Min(); DateTime endDate = dates.Max(); - Func>> asyncFunction = async () => - { - List result = clientType switch - { - ClientType.Api => await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate,endDate,null, null, null, GroupByOption.Product, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/settlements/unsettledfees?startDate={startDate:yyyy-MM-dd}&endDate={endDate:yyyy-MM-dd}&groupByOption={(Int32)GroupByOption.Product}", CancellationToken.None) - }; - return result; - }; - var unsettledFees = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetUnsettledFees(string.Empty, Guid.NewGuid(), startDate, endDate, null, null, null, GroupByOption.Merchant, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var unsettledFees = result.Data; unsettledFees.ShouldNotBeNull(); unsettledFees.ShouldNotBeEmpty(); diff --git a/EstateReportingAPI.IntegrationTests/FactTransactionsControllerTests.cs b/EstateReportingAPI.IntegrationTests/FactTransactionsControllerTests.cs index b57b5fd..c12be64 100644 --- a/EstateReportingAPI.IntegrationTests/FactTransactionsControllerTests.cs +++ b/EstateReportingAPI.IntegrationTests/FactTransactionsControllerTests.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using Ductus.FluentDocker.Common; +using Microsoft.EntityFrameworkCore; namespace EstateReportingAPI.IntegrationTests; @@ -107,10 +108,8 @@ protected override async Task SetupStandingData() #region Todays Sales Tests - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_TodaysSales_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_TodaysSales_SalesReturned() { List? todaysTransactions = new List(); List comparisonDateTransactions = new List(); @@ -165,17 +164,9 @@ public async Task FactTransactionsControllerController_TodaysSales_SalesReturned await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales result = clientType switch - { - ClientType.Api => await ApiClient.GetTodaysSales(string.Empty, Guid.NewGuid(), 0, 0, comparisonDate, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/todayssales?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTodaysSales(string.Empty, Guid.NewGuid(), 0, 0, comparisonDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count); @@ -185,10 +176,8 @@ public async Task FactTransactionsControllerController_TodaysSales_SalesReturned todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_TodaysSalesCountByHour_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_TodaysSalesCountByHour_SalesReturned() { List todaysTransactions = new List(); List comparisonDateTransactions = new List(); @@ -256,16 +245,10 @@ public async Task FactTransactionsControllerController_TodaysSalesCountByHour_Sa await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTodaysSalesCountByHour(string.Empty, Guid.NewGuid(), 0,0, comparisonDate, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/todayssales/countbyhour?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - List? todaysSalesCountByHour = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetTodaysSalesCountByHour(string.Empty, Guid.NewGuid(), 0, 0, comparisonDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var todaysSalesCountByHour= result.Data; + todaysSalesCountByHour.ShouldNotBeNull(); foreach (TodaysSalesCountByHour salesCountByHour in todaysSalesCountByHour) { @@ -276,10 +259,8 @@ public async Task FactTransactionsControllerController_TodaysSalesCountByHour_Sa } } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_TodaysSalesValueByHour_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_TodaysSalesValueByHour_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -346,17 +327,9 @@ public async Task FactTransactionsControllerController_TodaysSalesValueByHour_Sa await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTodaysSalesValueByHour(string.Empty, Guid.NewGuid(), 0,0, comparisonDate, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/todayssales/valuebyhour?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - List? todaysSalesValueByHour = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTodaysSalesValueByHour(string.Empty, Guid.NewGuid(), 0, 0, comparisonDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? todaysSalesValueByHour = result.Data; foreach (TodaysSalesValueByHour salesValueByHour in todaysSalesValueByHour) { IEnumerable todayHour = todaysTransactions.Where(t => t.TransactionDateTime.Hour == salesValueByHour.Hour); @@ -370,10 +343,8 @@ public async Task FactTransactionsControllerController_TodaysSalesValueByHour_Sa #region Todays Failed Sales Tests - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_TodaysFailedSales_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_TodaysFailedSales_SalesReturned() { EstateManagementGenericContext context = new EstateManagementSqlServerContext(GetLocalConnectionString($"EstateReportingReadModel{TestId.ToString()}")); var todaysTransactions = new List(); @@ -429,16 +400,9 @@ public async Task FactTransactionsControllerController_TodaysFailedSales_SalesRe await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetTodaysFailedSales(string.Empty, Guid.NewGuid(), 1, 1, "1009", comparisonDate, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/todaysfailedsales?responseCode=1009&comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetTodaysFailedSales(string.Empty, Guid.NewGuid(), 1, 1, "1009", comparisonDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count); @@ -450,10 +414,8 @@ public async Task FactTransactionsControllerController_TodaysFailedSales_SalesRe #endregion - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomProductsByValue_BottomProducts_ProductsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomProductsByValue_BottomProducts_ProductsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -485,16 +447,9 @@ public async Task FactTransactionsController_GetTopBottomProductsByValue_BottomP await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomProductData(string.Empty, Guid.NewGuid(), TopBottom.Bottom,3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/products/topbottombyvalue?count=3&topOrBottom=bottom", CancellationToken.None) - }; - return result; - }; - List? topBottomProductData = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.GetTopBottomProductData(string.Empty, Guid.NewGuid(), TopBottom.Bottom, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomProductData = result.Data; topBottomProductData[0].ProductName.ShouldBe("Custom"); topBottomProductData[0].SalesValue.ShouldBe(transactionsDictionary["Custom"].Sum(p => p.TransactionAmount)); @@ -504,10 +459,8 @@ public async Task FactTransactionsController_GetTopBottomProductsByValue_BottomP topBottomProductData[2].SalesValue.ShouldBe(transactionsDictionary["50 KES Topup"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomProductsByValue_TopProducts_ProductsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomProductsByValue_TopProducts_ProductsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -539,17 +492,9 @@ public async Task FactTransactionsController_GetTopBottomProductsByValue_TopProd await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomProductData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/products/topbottombyvalue?count=3&topOrBottom=top", CancellationToken.None) - }; - return result; - }; - List? topBottomProductData = await ExecuteAsyncFunction(asyncFunction); - + var result= await ApiClient.GetTopBottomProductData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomProductData = result.Data; topBottomProductData[0].ProductName.ShouldBe("200 KES Topup"); topBottomProductData[0].SalesValue.ShouldBe(transactionsDictionary["200 KES Topup"].Sum(p => p.TransactionAmount)); topBottomProductData[1].ProductName.ShouldBe("50 KES Topup"); @@ -558,10 +503,8 @@ public async Task FactTransactionsController_GetTopBottomProductsByValue_TopProd topBottomProductData[2].SalesValue.ShouldBe(transactionsDictionary["100 KES Topup"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomOperatorsByValue_BottomOperators_OperatorsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomOperatorsByValue_BottomOperators_OperatorsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -594,17 +537,9 @@ public async Task FactTransactionsController_GetTopBottomOperatorsByValue_Bottom await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomOperatorData(string.Empty, Guid.NewGuid(), TopBottom.Bottom, 3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/operators/topbottombyvalue?count=3&topOrBottom=bottom", CancellationToken.None) - }; - return result; - }; - List? topBottomOperatorData = await ExecuteAsyncFunction(asyncFunction); - + var result= await ApiClient.GetTopBottomOperatorData(string.Empty, Guid.NewGuid(), TopBottom.Bottom, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomOperatorData = result.Data; topBottomOperatorData.ShouldNotBeNull(); topBottomOperatorData[0].OperatorName.ShouldBe("Voucher"); topBottomOperatorData[0].SalesValue.ShouldBe(transactionsDictionary["Voucher"].Sum(p => p.TransactionAmount)); @@ -614,10 +549,8 @@ public async Task FactTransactionsController_GetTopBottomOperatorsByValue_Bottom topBottomOperatorData[2].SalesValue.ShouldBe(transactionsDictionary["PataPawa PostPay"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomOperatorsByValue_TopOperators_OperatorsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomOperatorsByValue_TopOperators_OperatorsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -630,7 +563,6 @@ public async Task FactTransactionsController_GetTopBottomOperatorsByValue_TopOpe Dictionary> transactionsDictionary = new(); string merchantName = merchantsList.First(); - //List productList = contractProducts.Single(cp => cp.Key == contractName).Value; foreach (KeyValuePair transactionCount in transactionCounts) { var contract = contractList.Single(s => s.operatorname == transactionCount.Key); @@ -650,17 +582,9 @@ public async Task FactTransactionsController_GetTopBottomOperatorsByValue_TopOpe await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomOperatorData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/operators/topbottombyvalue?count=3&topOrBottom=top", CancellationToken.None) - }; - return result; - }; - List? topBottomOperatorData = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTopBottomOperatorData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomOperatorData = result.Data; topBottomOperatorData[0].OperatorName.ShouldBe("Safaricom"); topBottomOperatorData[0].SalesValue.ShouldBe(transactionsDictionary["Safaricom"].Sum(p => p.TransactionAmount)); topBottomOperatorData[1].OperatorName.ShouldBe("PataPawa PostPay"); @@ -669,10 +593,8 @@ public async Task FactTransactionsController_GetTopBottomOperatorsByValue_TopOpe topBottomOperatorData[2].SalesValue.ShouldBe(transactionsDictionary["PataPawa PrePay"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomMerchantsByValue_BottomMerchants_MerchantsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomMerchantsByValue_BottomMerchants_MerchantsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -703,17 +625,9 @@ public async Task FactTransactionsController_GetTopBottomMerchantsByValue_Bottom await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomMerchantData(string.Empty, Guid.NewGuid(), TopBottom.Bottom, 3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/merchants/topbottombyvalue?count=3&topOrBottom=bottom", CancellationToken.None) - }; - return result; - }; - List? topBottomMerchantData = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTopBottomMerchantData(string.Empty, Guid.NewGuid(), TopBottom.Bottom, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomMerchantData = result.Data; topBottomMerchantData.ShouldNotBeNull(); topBottomMerchantData[0].MerchantName.ShouldBe("Test Merchant 4"); topBottomMerchantData[0].SalesValue.ShouldBe(transactionsDictionary["Test Merchant 4"].Sum(p => p.TransactionAmount)); @@ -723,10 +637,8 @@ public async Task FactTransactionsController_GetTopBottomMerchantsByValue_Bottom topBottomMerchantData[2].SalesValue.ShouldBe(transactionsDictionary["Test Merchant 1"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_GetTopBottomMerchantsByValue_TopMerchants_MerchantsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_GetTopBottomMerchantsByValue_TopMerchants_MerchantsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -756,18 +668,9 @@ public async Task FactTransactionsController_GetTopBottomMerchantsByValue_TopMer } await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.GetTopBottomMerchantData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/merchants/topbottombyvalue?count=3&topOrBottom=top", CancellationToken.None) - }; - return result; - }; - List? topBottomMerchantData = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetTopBottomMerchantData(string.Empty, Guid.NewGuid(), TopBottom.Top, 3, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List? topBottomMerchantData = result.Data; topBottomMerchantData.ShouldNotBeNull(); topBottomMerchantData[0].MerchantName.ShouldBe("Test Merchant 3"); topBottomMerchantData[0].SalesValue.ShouldBe(transactionsDictionary["Test Merchant 3"].Sum(p => p.TransactionAmount)); @@ -777,10 +680,8 @@ public async Task FactTransactionsController_GetTopBottomMerchantsByValue_TopMer topBottomMerchantData[2].SalesValue.ShouldBe(transactionsDictionary["Test Merchant 2"].Sum(p => p.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_MerchantPerformance_AllMerchants_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_MerchantPerformance_AllMerchants_SalesReturned() { var todaysTransactions = new List(); @@ -836,17 +737,9 @@ public async Task FactTransactionsControllerController_MerchantPerformance_AllMe await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchantPerformance(string.Empty, Guid.NewGuid(), comparisonDate, new List(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/merchants/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result= await ApiClient.GetMerchantPerformance(string.Empty, Guid.NewGuid(), comparisonDate, new List(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Sum(c => c.TransactionAmount)); @@ -855,10 +748,8 @@ public async Task FactTransactionsControllerController_MerchantPerformance_AllMe todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_MerchantPerformance_SingleMerchant_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_MerchantPerformance_SingleMerchant_SalesReturned() { var todaysTransactions = new List(); @@ -923,17 +814,9 @@ public async Task FactTransactionsControllerController_MerchantPerformance_Singl await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchantPerformance(string.Empty, Guid.NewGuid(), comparisonDate, merchantFilterList, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/merchants/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}&merchantReportingIds={serializedArray}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetMerchantPerformance(string.Empty, Guid.NewGuid(), comparisonDate, merchantFilterList, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count(c => merchantIdsForVerify.Contains(c.MerchantId))); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => merchantIdsForVerify.Contains(c.MerchantId)).Sum(c => c.TransactionAmount)); @@ -942,10 +825,8 @@ public async Task FactTransactionsControllerController_MerchantPerformance_Singl todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => merchantIdsForVerify.Contains(c.MerchantId)).Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_ProductPerformance_AllProducts_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_ProductPerformance_AllProducts_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -987,17 +868,9 @@ public async Task FactTransactionsControllerController_ProductPerformance_AllPro await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, new List(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/products/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, new List(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Sum(c => c.TransactionAmount)); @@ -1006,10 +879,8 @@ public async Task FactTransactionsControllerController_ProductPerformance_AllPro todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_ProductPerformance_SingleProduct_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_ProductPerformance_SingleProduct_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -1061,17 +932,9 @@ public async Task FactTransactionsControllerController_ProductPerformance_Single string serializedArray = string.Join(",", productFilterList); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, productFilterList, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/products/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}&productReportingIds={serializedArray}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, productFilterList, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count(c => productIdsForVerify.Contains(c.ContractProductId))); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => productIdsForVerify.Contains(c.ContractProductId)).Sum(c => c.TransactionAmount)); @@ -1080,10 +943,8 @@ public async Task FactTransactionsControllerController_ProductPerformance_Single todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => productIdsForVerify.Contains(c.ContractProductId)).Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_ProductPerformance_MultipleProducts_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_ProductPerformance_MultipleProducts_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -1134,17 +995,9 @@ public async Task FactTransactionsControllerController_ProductPerformance_Multip await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, productFilterList, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/products/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}&productReportingIds={serializedArray}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetProductPerformance(string.Empty, Guid.NewGuid(), comparisonDate, productFilterList, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count(c => productIdsForVerify.Contains(c.ContractProductId))); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => productIdsForVerify.Contains(c.ContractProductId)).Sum(c => c.TransactionAmount)); @@ -1153,10 +1006,8 @@ public async Task FactTransactionsControllerController_ProductPerformance_Multip todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => productIdsForVerify.Contains(c.ContractProductId)).Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_OperatorPerformance_SingleOperator_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_OperatorPerformance_SingleOperator_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -1209,17 +1060,9 @@ public async Task FactTransactionsControllerController_OperatorPerformance_Singl await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetOperatorPerformance(string.Empty, Guid.NewGuid(), comparisonDate, operatorFilterList, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/operators/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}&operatorReportingIds={serializedArray}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetOperatorPerformance(string.Empty, Guid.NewGuid(), comparisonDate, operatorFilterList, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count(c => operatorIdsForVerify.Contains(c.OperatorId))); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => operatorIdsForVerify.Contains(c.OperatorId)).Sum(c => c.TransactionAmount)); @@ -1228,10 +1071,8 @@ public async Task FactTransactionsControllerController_OperatorPerformance_Singl todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => operatorIdsForVerify.Contains(c.OperatorId)).Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_OperatorPerformance_MultipleOperators_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_OperatorPerformance_MultipleOperators_SalesReturned() { var todaysTransactions = new List(); var comparisonDateTransactions = new List(); @@ -1284,17 +1125,9 @@ public async Task FactTransactionsControllerController_OperatorPerformance_Multi await helper.RunHistoricTransactionsSummaryProcessing(comparisonDate.Date); await helper.RunTodaysTransactionsSummaryProcessing(todaysDateTime.Date); - Func> asyncFunction = async () => - { - TodaysSales? result = clientType switch - { - ClientType.Api => await ApiClient.GetOperatorPerformance(string.Empty, Guid.NewGuid(), comparisonDate, operatorFilterList, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/operators/performance?comparisonDate={comparisonDate.ToString("yyyy-MM-dd")}&operatorReportingIds={serializedArray}", CancellationToken.None) - }; - return result; - }; - TodaysSales? todaysSales = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetOperatorPerformance(string.Empty, Guid.NewGuid(), comparisonDate, operatorFilterList, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + TodaysSales? todaysSales = result.Data; todaysSales.ShouldNotBeNull(); todaysSales.ComparisonSalesCount.ShouldBe(comparisonDateTransactions.Count(c => operatorIdsForVerify.Contains(c.OperatorId))); todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => operatorIdsForVerify.Contains(c.OperatorId)).Sum(c => c.TransactionAmount)); @@ -1303,10 +1136,8 @@ public async Task FactTransactionsControllerController_OperatorPerformance_Multi todaysSales.ComparisonSalesValue.ShouldBe(comparisonDateTransactions.Where(c => operatorIdsForVerify.Contains(c.OperatorId)).Sum(c => c.TransactionAmount)); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_GetMerchantsTransactionKpis_SalesReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_GetMerchantsTransactionKpis_SalesReturned() { DateTime todaysDateTime = DateTime.Now; @@ -1336,27 +1167,17 @@ public async Task FactTransactionsControllerController_GetMerchantsTransactionKp await helper.AddMerchant("Test Estate", "Merchant 17", todaysDateTime.AddDays(-10)); await helper.AddMerchant("Test Estate", "Merchant 18", todaysDateTime.AddDays(-10)); - Func> asyncFunction = async () => - { - MerchantKpi? result = clientType switch - { - ClientType.Api => await ApiClient.GetMerchantKpi(string.Empty, Guid.NewGuid(), CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage($"api/facts/transactions/merchantkpis", CancellationToken.None) - }; - return result; - }; - MerchantKpi? merchantKpi = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.GetMerchantKpi(string.Empty, Guid.NewGuid(), CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + MerchantKpi? merchantKpi = result.Data; merchantKpi.ShouldNotBeNull(); merchantKpi.MerchantsWithSaleInLastHour.ShouldBe(4); merchantKpi.MerchantsWithNoSaleToday.ShouldBe(6); merchantKpi.MerchantsWithNoSaleInLast7Days.ShouldBe(8); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_NoAdditionalFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_NoAdditionalFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1379,17 +1200,9 @@ public async Task FactTransactionsController_TransactionSearch_NoAdditionalFilte }; // No Paging or Sorting - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var searchResult = result.Data; searchResult.Count.ShouldBe(10); searchResult.Any(s => s.TransactionReportingId == 1).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); @@ -1402,17 +1215,10 @@ public async Task FactTransactionsController_TransactionSearch_NoAdditionalFilte searchResult.Any(s => s.TransactionReportingId == 9).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 5, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=1&pageSize=5", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 5, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(5); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 4).ShouldBeTrue(); @@ -1420,17 +1226,9 @@ public async Task FactTransactionsController_TransactionSearch_NoAdditionalFilte searchResult.Any(s => s.TransactionReportingId == 8).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 5, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=2&pageSize=5", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 5, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(5); searchResult.Any(s => s.TransactionReportingId == 1).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 3).ShouldBeTrue(); @@ -1439,10 +1237,8 @@ public async Task FactTransactionsController_TransactionSearch_NoAdditionalFilte searchResult.Any(s => s.TransactionReportingId == 9).ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_ValueRangeFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_ValueRangeFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1470,17 +1266,9 @@ public async Task FactTransactionsController_TransactionSearch_ValueRangeFilteri }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(7); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 3).ShouldBeTrue(); @@ -1490,33 +1278,17 @@ public async Task FactTransactionsController_TransactionSearch_ValueRangeFilteri searchResult.Any(s => s.TransactionReportingId == 7).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 3, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=1&pageSize=3", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 3, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 3).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 4).ShouldBeTrue(); - - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 3, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=2&pageSize=3", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 3, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 6).ShouldBeTrue(); @@ -1524,10 +1296,8 @@ public async Task FactTransactionsController_TransactionSearch_ValueRangeFilteri } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_AuthCodeFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_AuthCodeFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1550,25 +1320,15 @@ public async Task FactTransactionsController_TransactionSearch_AuthCodeFiltering }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(1); searchResult.Any(s => s.TransactionReportingId == 5).ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_TransactionNumberFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_TransactionNumberFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1591,25 +1351,16 @@ public async Task FactTransactionsController_TransactionSearch_TransactionNumber }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(1); searchResult.Any(s => s.TransactionReportingId == 4).ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_ResponseCodeFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_ResponseCodeFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1632,59 +1383,34 @@ public async Task FactTransactionsController_TransactionSearch_ResponseCodeFilte }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); - + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(5); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 4).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 6).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 8).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); - - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 3, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=1&pageSize=3", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + + result= await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 3, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 4).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 6).ShouldBeTrue(); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 3, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=2&pageSize=3", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result= await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 3, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(2); searchResult.Any(s => s.TransactionReportingId == 8).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_MerchantFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_MerchantFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1729,16 +1455,9 @@ public async Task FactTransactionsController_TransactionSearch_MerchantFiltering }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(10); searchResult.Any(s => s.TransactionReportingId == 11).ShouldBeTrue(); @@ -1754,16 +1473,9 @@ public async Task FactTransactionsController_TransactionSearch_MerchantFiltering searchResult.Count(s => s.MerchantName == "Test Merchant 2").ShouldBe(6); searchResult.Count(s => s.MerchantName == "Test Merchant 3").ShouldBe(4); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 5, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=1&pageSize=5", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 5, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(5); searchResult.Any(s => s.TransactionReportingId == 11).ShouldBeTrue(); @@ -1774,16 +1486,9 @@ public async Task FactTransactionsController_TransactionSearch_MerchantFiltering searchResult.Count(s => s.MerchantName == "Test Merchant 2").ShouldBe(5); searchResult.Count(s => s.MerchantName == "Test Merchant 3").ShouldBe(0); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 5, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=2&pageSize=5", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 5, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(5); searchResult.Any(s => s.TransactionReportingId == 16).ShouldBeTrue(); @@ -1795,10 +1500,8 @@ public async Task FactTransactionsController_TransactionSearch_MerchantFiltering searchResult.Count(s => s.MerchantName == "Test Merchant 3").ShouldBe(4); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_OperatorFiltering_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_OperatorFiltering_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1823,16 +1526,9 @@ public async Task FactTransactionsController_TransactionSearch_OperatorFiltering }; // No Paging - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + List searchResult = result.Data; searchResult.Count.ShouldBe(4); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 6).ShouldBeTrue(); @@ -1841,33 +1537,18 @@ public async Task FactTransactionsController_TransactionSearch_OperatorFiltering searchResult.Count(s => s.OperatorName == "Voucher").ShouldBe(2); searchResult.Count(s => s.OperatorName == "PataPawa PrePay").ShouldBe(2); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 2, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=1&pageSize=2", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 1, 2, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(2); searchResult.Any(s => s.TransactionReportingId == 2).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 6).ShouldBeTrue(); searchResult.Count(s => s.OperatorName == "Voucher").ShouldBe(2); searchResult.Count(s => s.OperatorName == "PataPawa PrePay").ShouldBe(0); - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 2, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?page=2&pageSize=2", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result= await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, 2, 2, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(2); searchResult.Any(s => s.TransactionReportingId == 9).ShouldBeTrue(); searchResult.Any(s => s.TransactionReportingId == 10).ShouldBeTrue(); @@ -1875,10 +1556,8 @@ public async Task FactTransactionsController_TransactionSearch_OperatorFiltering searchResult.Count(s => s.OperatorName == "PataPawa PrePay").ShouldBe(2); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsController_TransactionSearch_SortingTest_TransactionReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsController_TransactionSearch_SortingTest_TransactionReturned() { DateTime transactionDate = new DateTime(2024, 3, 19); @@ -1893,123 +1572,72 @@ public async Task FactTransactionsController_TransactionSearch_SortingTest_Trans QueryDate = transactionDate }; // Default Sort - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - List searchResult = await ExecuteAsyncFunction(asyncFunction); + var result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, null, null, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].TransactionAmount.ShouldBe(100); searchResult[1].TransactionAmount.ShouldBe(200); searchResult[2].TransactionAmount.ShouldBe(300); // Sort By merchant Name ascending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.MerchantName, SortDirection.Ascending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=2&sortDirection=0", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); - + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.MerchantName, SortDirection.Ascending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].MerchantName.ShouldBe("Test Merchant 1"); searchResult[1].MerchantName.ShouldBe("Test Merchant 2"); searchResult[2].MerchantName.ShouldBe("Test Merchant 3"); // Sort By merchant Name descending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.MerchantName, SortDirection.Descending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=2&sortDirection=1", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.MerchantName, SortDirection.Descending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].MerchantName.ShouldBe("Test Merchant 3"); searchResult[1].MerchantName.ShouldBe("Test Merchant 2"); searchResult[2].MerchantName.ShouldBe("Test Merchant 1"); // Sort By operator Name ascending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.OperatorName, SortDirection.Ascending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=3&sortDirection=0", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.OperatorName, SortDirection.Ascending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; + searchResult.Count.ShouldBe(3); searchResult[0].OperatorName.ShouldBe("PataPawa PostPay"); searchResult[1].OperatorName.ShouldBe("Safaricom"); searchResult[2].OperatorName.ShouldBe("Voucher"); // Sort By operator Name descending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.OperatorName, SortDirection.Descending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=3&sortDirection=1", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.OperatorName, SortDirection.Descending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].OperatorName.ShouldBe("Voucher"); searchResult[1].OperatorName.ShouldBe("Safaricom"); searchResult[2].OperatorName.ShouldBe("PataPawa PostPay"); // Sort By transaction amount ascending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.TransactionAmount, SortDirection.Ascending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=1&sortDirection=0", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result= await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.TransactionAmount, SortDirection.Ascending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].TransactionAmount.ShouldBe(100); searchResult[1].TransactionAmount.ShouldBe(200); searchResult[2].TransactionAmount.ShouldBe(300); // Sort By transaction amount descending - asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.TransactionAmount, SortDirection.Descending, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>("api/facts/transactions/search?sortField=1&sortDirection=1", JsonConvert.SerializeObject(searchRequest), CancellationToken.None) - }; - return result; - }; - searchResult = await ExecuteAsyncFunction(asyncFunction); + result= await ApiClient.TransactionSearch(string.Empty, Guid.NewGuid(), searchRequest, null, null, SortField.TransactionAmount, SortDirection.Descending, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.Count.ShouldBe(3); searchResult[0].TransactionAmount.ShouldBe(300); searchResult[1].TransactionAmount.ShouldBe(200); searchResult[2].TransactionAmount.ShouldBe(100); } - [Theory] - [InlineData(ClientType.Api)] - [InlineData(ClientType.Direct)] - public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDate_MerchantsReturned(ClientType clientType) + [Fact] + public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDate_MerchantsReturned() { DateTime todaysDateTime = DateTime.Now; @@ -2044,19 +1672,12 @@ public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDat DateTime startDate = DateTime.Now; DateTime endDate = DateTime.Now; - Func?>> asyncFunction = async () => - { - List? result = clientType switch - { - ClientType.Api => await this.ApiClient.GetMerchantsByLastSaleDate(String.Empty, Guid.NewGuid(), startDate,endDate, CancellationToken.None), - _ => await CreateAndSendHttpRequestMessage>($"api/facts/transactions/merchants/lastsale?startDate={startDate:yyyy-MM-dd HH:mm:ss}&enddate={endDate:yyyy-MM-dd HH:mm:ss}", CancellationToken.None) - }; - return result; - }; // Test 1 - sale in last hour startDate = DateTime.Now.AddHours(-1); endDate = DateTime.Now; - List? searchResult = await ExecuteAsyncFunction(asyncFunction); + var result = await this.ApiClient.GetMerchantsByLastSaleDate(String.Empty, Guid.NewGuid(), startDate, endDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + var searchResult = result.Data; searchResult.ShouldNotBeNull(); searchResult.Count.ShouldBe(4); searchResult.SingleOrDefault(s => s.Name == "Merchant 1").ShouldNotBeNull(); @@ -2067,7 +1688,9 @@ public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDat // Test 2 - sale in last day but over an hour ago startDate = DateTime.Now.Date.AddDays(-1); endDate = DateTime.Now.AddHours(-1); - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await this.ApiClient.GetMerchantsByLastSaleDate(String.Empty, Guid.NewGuid(), startDate, endDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.ShouldNotBeNull(); searchResult.Count.ShouldBe(6); searchResult.SingleOrDefault(s => s.Name == "Merchant 5").ShouldNotBeNull(); @@ -2080,7 +1703,9 @@ public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDat // Test 3 - sale in last 7 days but non yesterday startDate = DateTime.Now.Date.AddDays(-7); endDate = DateTime.Now.Date.AddDays(-1); - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await this.ApiClient.GetMerchantsByLastSaleDate(String.Empty, Guid.NewGuid(), startDate, endDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.ShouldNotBeNull(); searchResult.Count.ShouldBe(3); searchResult.SingleOrDefault(s => s.Name == "Merchant 11").ShouldNotBeNull(); @@ -2090,7 +1715,9 @@ public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDat // Test 4 - sale more than 7 days ago startDate = DateTime.Now.Date.AddYears(-1); endDate = DateTime.Now.Date.AddDays(-7); - searchResult = await ExecuteAsyncFunction(asyncFunction); + result = await this.ApiClient.GetMerchantsByLastSaleDate(String.Empty, Guid.NewGuid(), startDate, endDate, CancellationToken.None); + result.IsSuccess.ShouldBeTrue(); + searchResult = result.Data; searchResult.ShouldNotBeNull(); searchResult.Count.ShouldBe(5); searchResult.SingleOrDefault(s => s.Name == "Merchant 14").ShouldNotBeNull(); @@ -2098,12 +1725,6 @@ public async Task FactTransactionsControllerController_GetMerchantsByLastDaleDat searchResult.SingleOrDefault(s => s.Name == "Merchant 16").ShouldNotBeNull(); searchResult.SingleOrDefault(s => s.Name == "Merchant 17").ShouldNotBeNull(); searchResult.SingleOrDefault(s => s.Name == "Merchant 18").ShouldNotBeNull(); - - - - - } - } diff --git a/EstateReportingAPI/Bootstrapper/MediatorRegistry.cs b/EstateReportingAPI/Bootstrapper/MediatorRegistry.cs new file mode 100644 index 0000000..42e6759 --- /dev/null +++ b/EstateReportingAPI/Bootstrapper/MediatorRegistry.cs @@ -0,0 +1,46 @@ +using EstateReportingAPI.BusinessLogic.Queries; +using EstateReportingAPI.BusinessLogic.RequestHandlers; +using EstateReportingAPI.Models; +using Lamar; +using MediatR; +using SimpleResults; + +namespace EstateReportingAPI.Bootstrapper; + +public class MediatorRegistry : ServiceRegistry { + public MediatorRegistry() { + this.AddTransient(); + + this.AddSingleton>, TransactionRequestHandler>(); + this.AddSingleton>, TransactionRequestHandler>(); + this.AddSingleton>>, TransactionRequestHandler>(); + this.AddSingleton>>, TransactionRequestHandler>(); + this.AddSingleton>>, TransactionRequestHandler>(); + + this.AddSingleton>>, CalendarRequestHandler>(); + this.AddSingleton>>, CalendarRequestHandler>(); + this.AddSingleton>>, CalendarRequestHandler>(); + + this.AddSingleton>>, MerchantRequestHandler>(); + this.AddSingleton>>, MerchantRequestHandler>(); + this.AddSingleton>>, MerchantRequestHandler>(); + this.AddSingleton>>, MerchantRequestHandler>(); + this.AddSingleton>, MerchantRequestHandler>(); + this.AddSingleton>, MerchantRequestHandler>(); + + this.AddSingleton>>, OperatorRequestHandler>(); + this.AddSingleton>, OperatorRequestHandler>(); + this.AddSingleton>>, OperatorRequestHandler>(); + this.AddSingleton>>, OperatorRequestHandler>(); + + this.AddSingleton>>, ResponseCodeRequestHandler>(); + + this.AddSingleton>, SettlementRequestHandler>(); + this.AddSingleton>, SettlementRequestHandler>(); + this.AddSingleton>>, SettlementRequestHandler>(); + + this.AddSingleton>, ProductRequestHandler>(); + this.AddSingleton>>, ProductRequestHandler>(); + this.AddSingleton>>, ProductRequestHandler>(); + } +} \ No newline at end of file diff --git a/EstateReportingAPI/Controllers/DimensionsController.cs b/EstateReportingAPI/Controllers/DimensionsController.cs index 37a4815..442b87c 100644 --- a/EstateReportingAPI/Controllers/DimensionsController.cs +++ b/EstateReportingAPI/Controllers/DimensionsController.cs @@ -1,4 +1,10 @@ -namespace EstateReportingAPI.Controllers +using EstateReportingAPI.BusinessLogic.Queries; +using EstateReportingAPI.Models; +using MediatR; +using Shared.Results; +using SimpleResults; + +namespace EstateReportingAPI.Controllers { using DataTrasferObjects; using Microsoft.AspNetCore.Authorization; @@ -12,10 +18,10 @@ [ApiController] [Authorize] public class DimensionsController : ControllerBase{ - private readonly IReportingManager ReportingManager; + private readonly IMediator Mediator; - public DimensionsController(IReportingManager reportingManager){ - this.ReportingManager = reportingManager; + public DimensionsController(IMediator mediator) { + this.Mediator = mediator; } #region Others @@ -36,25 +42,32 @@ public DimensionsController(IReportingManager reportingManager){ [Route("calendar/years")] public async Task GetCalendarYears([FromHeader] Guid estateId, CancellationToken cancellationToken){ - List years = await this.ReportingManager.GetCalendarYears(estateId, cancellationToken); + CalendarQueries.GetYearsQuery query = new(estateId); + Result> result = await this.Mediator.Send(query, cancellationToken); + + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - years.ForEach(y => response.Add(new CalendarYear{ + result.Data.ForEach(y => response.Add(new CalendarYear{ Year = y })); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("calendar/{year}/dates")] public async Task GetCalendarDates([FromHeader] Guid estateId, [FromRoute] Int32 year, CancellationToken cancellationToken){ - List dates = await this.ReportingManager.GetCalendarDates(estateId, cancellationToken); + CalendarQueries.GetAllDatesQuery query = new(estateId); + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - dates.ForEach(d => response.Add(new CalendarDate{ + result.Data.ForEach(d => response.Add(new CalendarDate{ Year = d.Year, Date = d.Date, DayOfWeek = d.DayOfWeek, @@ -68,14 +81,17 @@ public async Task GetCalendarDates([FromHeader] Guid estateId, [F YearWeekNumber = d.YearWeekNumber, })); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("calendar/comparisondates")] public async Task GetCalendarComparisonDates([FromHeader] Guid estateId, CancellationToken cancellationToken){ - List dates = await this.ReportingManager.GetCalendarComparisonDates(estateId, cancellationToken); - + CalendarQueries.GetComparisonDatesQuery query = new(estateId); + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + List response = new List(); response.Add(new ComparisonDate{ @@ -95,7 +111,7 @@ public async Task GetCalendarComparisonDates([FromHeader] Guid es OrderValue = 2 }); Int32 orderValue = 3; - dates.ForEach(d => { + result.Data.ForEach(d => { response.Add(new ComparisonDate{ Date = d.Date, Description = d.Date.ToString("yyyy-MM-dd"), @@ -104,17 +120,18 @@ public async Task GetCalendarComparisonDates([FromHeader] Guid es orderValue++; }); - return this.Ok(response.OrderBy(d => d.OrderValue)); + return Result.Success(response.OrderBy(d => d.OrderValue)).ToActionResultX(); } [HttpGet] [Route("merchants")] - public async Task GetMerchants([FromHeader] Guid estateId, CancellationToken cancellationToken){ - List merchants = await this.ReportingManager.GetMerchants(estateId, cancellationToken); - + public async Task GetMerchants([FromHeader] Guid estateId, CancellationToken cancellationToken) { + MerchantQueries.GetMerchantsQuery query = new(estateId); + Result> result = await this.Mediator.Send(query, cancellationToken); + List response = new List(); - merchants.ForEach(m => response.Add(new Merchant{ + result.Data.ForEach(m => response.Add(new Merchant{ MerchantReportingId = m.MerchantReportingId, MerchantId = m.MerchantId, EstateReportingId = m.EstateReportingId, @@ -129,18 +146,19 @@ public async Task GetMerchants([FromHeader] Guid estateId, Cancel Town = m.Town, })); - return this.Ok(response.OrderBy(m => m.Name)); + return Result.Success(response.OrderBy(m=> m.Name)).ToActionResultX(); } [HttpGet] [Route("operators")] public async Task GetOperators([FromHeader] Guid estateId, CancellationToken cancellationToken) { - List operators = await this.ReportingManager.GetOperators(estateId, cancellationToken); + OperatorQueries.GetOperatorsQuery query = new(estateId); + Result> result = await this.Mediator.Send(query, cancellationToken); List response = new List(); - operators.ForEach(o => response.Add(new Operator + result.Data.ForEach(o => response.Add(new Operator { EstateReportingId = o.EstateReportingId, Name = o.Name, @@ -148,23 +166,24 @@ public async Task GetOperators([FromHeader] Guid estateId, Cancel OperatorReportingId = o.OperatorReportingId })); - return this.Ok(response.OrderBy(m => m.Name)); + return Result.Success(response.OrderBy(o => o.Name)).ToActionResultX(); } [HttpGet] [Route("responsecodes")] public async Task GetResponseCodes([FromHeader] Guid estateId, CancellationToken cancellationToken) { - List responseCodes = await this.ReportingManager.GetResponseCodes(estateId, cancellationToken); + ResponseCodeQueries.GetResponseCodesQuery query = new(estateId); + var result = await this.Mediator.Send(query, cancellationToken); List response = new List(); - responseCodes.ForEach(o => response.Add(new ResponseCode{ + result.Data.ForEach(o => response.Add(new ResponseCode{ Code = o.Code, Description = o.Description })); - return this.Ok(response.OrderBy(m => m.Code)); + return Result.Success(response.OrderBy(r => r.Code)).ToActionResultX(); } } diff --git a/EstateReportingAPI/Controllers/FactSettlementController.cs b/EstateReportingAPI/Controllers/FactSettlementController.cs index f0fec30..efcb4af 100644 --- a/EstateReportingAPI/Controllers/FactSettlementController.cs +++ b/EstateReportingAPI/Controllers/FactSettlementController.cs @@ -1,12 +1,17 @@ using Microsoft.AspNetCore.Mvc; using System.Diagnostics.CodeAnalysis; +using EstateReportingAPI.BusinessLogic.Queries; namespace EstateReportingAPI.Controllers { using BusinessLogic; + using MediatR; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.Formatters; using Models; + using Shared.Results; + using SimpleResults; + using static Microsoft.EntityFrameworkCore.DbLoggerCategory; using GroupByOption = DataTransferObjects.GroupByOption; using LastSettlement = Models.LastSettlement; using TodaysSettlement = DataTransferObjects.TodaysSettlement; @@ -32,49 +37,54 @@ public class FactSettlementsController : ControllerBase #endregion private readonly IReportingManager ReportingManager; + private readonly IMediator Mediator; - public FactSettlementsController(IReportingManager reportingManager){ + public FactSettlementsController(IReportingManager reportingManager, IMediator mediator) { this.ReportingManager = reportingManager; + this.Mediator = mediator; } [HttpGet] [Route("todayssettlement")] public async Task TodaysSettlement([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken){ - Models.TodaysSettlement model = await this.ReportingManager.GetTodaysSettlement(estateId, merchantReportingId, operatorReportingId, comparisonDate, cancellationToken); - + SettlementQueries.GetTodaysSettlementQuery query = new(estateId, merchantReportingId, operatorReportingId, comparisonDate); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + TodaysSettlement response = new TodaysSettlement{ - ComparisonSettlementCount = model.ComparisonSettlementCount, - ComparisonSettlementValue = model.ComparisonSettlementValue, - ComparisonPendingSettlementCount = model.ComparisonPendingSettlementCount, - ComparisonPendingSettlementValue = model.ComparisonPendingSettlementValue, + ComparisonSettlementCount = result.Data.ComparisonSettlementCount, + ComparisonSettlementValue = result.Data.ComparisonSettlementValue, + ComparisonPendingSettlementCount = result.Data.ComparisonPendingSettlementCount, + ComparisonPendingSettlementValue = result.Data.ComparisonPendingSettlementValue, - TodaysSettlementCount = model.TodaysSettlementCount, - TodaysSettlementValue = model.TodaysSettlementValue, - TodaysPendingSettlementCount = model.TodaysPendingSettlementCount, - TodaysPendingSettlementValue = model.TodaysPendingSettlementValue + TodaysSettlementCount = result.Data.TodaysSettlementCount, + TodaysSettlementValue = result.Data.TodaysSettlementValue, + TodaysPendingSettlementCount = result.Data.TodaysPendingSettlementCount, + TodaysPendingSettlementValue = result.Data.TodaysPendingSettlementValue }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("lastsettlement")] public async Task LastSettlement([FromHeader] Guid estateId, CancellationToken cancellationToken) { - LastSettlement model = await this.ReportingManager.GetLastSettlement(estateId, cancellationToken); - - if (model == null) { - return this.Ok(new LastSettlement()); - } + SettlementQueries.GetLastSettlementQuery query = new(estateId); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + LastSettlement response = new LastSettlement() { - SalesCount = model.SalesCount, - FeesValue = model.FeesValue, - SalesValue = model.SalesValue, - SettlementDate = model.SettlementDate, + SalesCount = result.Data.SalesCount, + FeesValue = result.Data.FeesValue, + SalesValue = result.Data.SalesValue, + SettlementDate = result.Data.SettlementDate, }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -117,12 +127,15 @@ public async Task GetUnsettledFees([FromHeader] Guid estateId, } Models.GroupByOption groupByOptionConverted = ConvertGroupByOption(groupByOption.GetValueOrDefault()); - List model = await this.ReportingManager.GetUnsettledFees(estateId, startDate, endDate, merchantIdFilter, - operatorIdFilter, productIdFilter, groupByOptionConverted, cancellationToken); - + SettlementQueries.GetUnsettledFeesQuery query = new(estateId, startDate, endDate,merchantIdFilter, operatorIdFilter, productIdFilter, groupByOptionConverted); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + List response = new(); - foreach (UnsettledFee unsettledFee in model){ + foreach (UnsettledFee unsettledFee in result.Data) + { response.Add(new DataTransferObjects.UnsettledFee{ DimensionName = unsettledFee.DimensionName, FeesCount = unsettledFee.FeesCount, @@ -130,7 +143,7 @@ public async Task GetUnsettledFees([FromHeader] Guid estateId, }); }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } private static Models.GroupByOption ConvertGroupByOption(GroupByOption groupByOption){ diff --git a/EstateReportingAPI/Controllers/FactTransactionsController.cs b/EstateReportingAPI/Controllers/FactTransactionsController.cs index d35bfa5..b60dbaf 100644 --- a/EstateReportingAPI/Controllers/FactTransactionsController.cs +++ b/EstateReportingAPI/Controllers/FactTransactionsController.cs @@ -1,5 +1,9 @@ using Microsoft.AspNetCore.Mvc; using System.Diagnostics.CodeAnalysis; +using EstateReportingAPI.BusinessLogic.Queries; +using JasperFx.Core; +using MediatR; +using Shared.Results; namespace EstateReportingAPI.Controllers{ using DataTransferObjects; @@ -15,6 +19,7 @@ namespace EstateReportingAPI.Controllers{ using TodaysSalesValueByHour = DataTransferObjects.TodaysSalesValueByHour; using TransactionResult = DataTransferObjects.TransactionResult; using TransactionSearchRequest = DataTransferObjects.TransactionSearchRequest; + using SimpleResults; [ExcludeFromCodeCoverage] [Route(FactTransactionsController.ControllerRoute)] @@ -37,38 +42,45 @@ public class FactTransactionsController : ControllerBase{ private readonly IReportingManager ReportingManager; + private readonly IMediator Mediator; - public FactTransactionsController(IReportingManager reportingManager){ + public FactTransactionsController(IReportingManager reportingManager, IMediator mediator) { this.ReportingManager = reportingManager; + this.Mediator = mediator; } private const String ConnectionStringIdentifier = "EstateReportingReadModel"; [HttpGet] [Route("todayssales")] - public async Task TodaysSales([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken){ - Models.TodaysSales model = await this.ReportingManager.GetTodaysSales(estateId, merchantReportingId, operatorReportingId, comparisonDate, cancellationToken); - + public async Task TodaysSales([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken) { + TransactionQueries.TodaysSalesQuery query = new(estateId, merchantReportingId, operatorReportingId, comparisonDate); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); TodaysSales response = new TodaysSales{ - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue, - ComparisonAverageSalesValue = model.ComparisonAverageSalesValue, - TodaysAverageSalesValue = model.TodaysAverageSalesValue, + ComparisonSalesCount = result.Data.ComparisonSalesCount, + ComparisonSalesValue = result.Data.ComparisonSalesValue, + TodaysSalesCount = result.Data.TodaysSalesCount, + TodaysSalesValue = result.Data.TodaysSalesValue, + ComparisonAverageSalesValue = result.Data.ComparisonAverageSalesValue, + TodaysAverageSalesValue = result.Data.TodaysAverageSalesValue, }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("todayssales/countbyhour")] - public async Task TodaysSalesCountByHour([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken){ - List models = await this.ReportingManager.GetTodaysSalesCountByHour(estateId, merchantReportingId, operatorReportingId, comparisonDate, cancellationToken); + public async Task TodaysSalesCountByHour([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken) { + TransactionQueries.TodaysSalesCountByHour query = new TransactionQueries.TodaysSalesCountByHour(estateId, merchantReportingId, operatorReportingId, comparisonDate); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - foreach (Models.TodaysSalesCountByHour todaysSalesCountByHour in models){ + foreach (Models.TodaysSalesCountByHour todaysSalesCountByHour in result.Data){ response.Add(new TodaysSalesCountByHour{ ComparisonSalesCount = todaysSalesCountByHour.ComparisonSalesCount, Hour = todaysSalesCountByHour.Hour, @@ -76,19 +88,20 @@ public async Task TodaysSalesCountByHour([FromHeader] Guid estate }); } - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("todayssales/valuebyhour")] public async Task TodaysSalesValueByHour([FromHeader] Guid estateId, [FromQuery] Int32 merchantReportingId, [FromQuery] Int32 operatorReportingId, [FromQuery] DateTime comparisonDate, CancellationToken cancellationToken){ - - List models = await this.ReportingManager.GetTodaysSalesValueByHour(estateId, merchantReportingId, operatorReportingId, comparisonDate, cancellationToken); - + TransactionQueries.TodaysSalesValueByHour query = new TransactionQueries.TodaysSalesValueByHour(estateId, merchantReportingId, operatorReportingId, comparisonDate); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - foreach (Models.TodaysSalesValueByHour todaysSalesValueByHour in models){ + foreach (Models.TodaysSalesValueByHour todaysSalesValueByHour in result.Data){ response.Add(new TodaysSalesValueByHour{ ComparisonSalesValue = todaysSalesValueByHour.ComparisonSalesValue, Hour = todaysSalesValueByHour.Hour, @@ -96,17 +109,19 @@ public async Task TodaysSalesValueByHour([FromHeader] Guid estate }); } - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("merchants/lastsale")] public async Task GetMerchantsByLastSale([FromHeader] Guid estateId, [FromQuery] DateTime startDate, [FromQuery] DateTime endDate, CancellationToken cancellationToken){ - List merchants = await this.ReportingManager.GetMerchantsByLastSale(estateId,startDate, endDate, cancellationToken); - + MerchantQueries.GetByLastSaleQuery query = new(estateId, startDate, endDate); + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - merchants.ForEach(m => response.Add(new Merchant + result.Data.ForEach(m => response.Add(new Merchant { MerchantReportingId = m.MerchantReportingId, MerchantId = m.MerchantId, @@ -122,39 +137,45 @@ public async Task GetMerchantsByLastSale([FromHeader] Guid estate Town = m.Town, })); - return this.Ok(response.OrderBy(m => m.Name)); + return Result.Success(response.OrderBy(m=> m.Name)).ToActionResultX(); } [HttpGet] [Route("merchantkpis")] public async Task GetMerchantsTransactionKpis([FromHeader] Guid estateId, CancellationToken cancellationToken){ - Models.MerchantKpi model = await this.ReportingManager.GetMerchantsTransactionKpis(estateId, cancellationToken); + MerchantQueries.GetTransactionKpisQuery query = new MerchantQueries.GetTransactionKpisQuery(estateId); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); MerchantKpi response = new MerchantKpi{ - MerchantsWithNoSaleInLast7Days = model.MerchantsWithNoSaleInLast7Days, - MerchantsWithNoSaleToday = model.MerchantsWithNoSaleToday, - MerchantsWithSaleInLastHour = model.MerchantsWithSaleInLastHour + MerchantsWithNoSaleInLast7Days = result.Data.MerchantsWithNoSaleInLast7Days, + MerchantsWithNoSaleToday = result.Data.MerchantsWithNoSaleToday, + MerchantsWithSaleInLastHour = result.Data.MerchantsWithSaleInLastHour }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] [Route("todaysfailedsales")] public async Task TodaysFailedSales([FromHeader] Guid estateId, [FromQuery] DateTime comparisonDate, [FromQuery] String responseCode, CancellationToken cancellationToken){ - Models.TodaysSales model = await this.ReportingManager.GetTodaysFailedSales(estateId, comparisonDate, responseCode, cancellationToken); - - TodaysSales response = new TodaysSales{ - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue, - ComparisonAverageSalesValue = model.ComparisonAverageSalesValue, - TodaysAverageSalesValue = model.TodaysAverageSalesValue - }; + TransactionQueries.TodaysFailedSales query = new(estateId, comparisonDate, responseCode); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + TodaysSales response = new TodaysSales + { + ComparisonSalesCount = result.Data.ComparisonSalesCount, + ComparisonSalesValue = result.Data.ComparisonSalesValue, + TodaysSalesCount = result.Data.TodaysSalesCount, + TodaysSalesValue = result.Data.TodaysSalesValue, + ComparisonAverageSalesValue = result.Data.ComparisonAverageSalesValue, + TodaysAverageSalesValue = result.Data.TodaysAverageSalesValue, + }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -163,16 +184,23 @@ public async Task GetTopBottomProductsByValue([FromHeader] Guid e Models.TopBottom modelTopBottom = Enum.Parse(topOrBottom.ToString()); - List topbottomData = await this.ReportingManager.GetTopBottomData(estateId, modelTopBottom, count, Models.Dimension.Product, cancellationToken); + IRequest>> query = modelTopBottom switch + { + Models.TopBottom.Bottom => new ProductQueries.GetBottomProductsBySalesValueQuery(estateId, count), + _ => new ProductQueries.GetTopProductsBySalesValueQuery(estateId, count) + }; + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - topbottomData.ForEach(t => { + result.Data.ForEach(t => { response.Add(new TopBottomProductData{ ProductName = t.DimensionName, SalesValue = t.SalesValue }); }); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -180,17 +208,22 @@ public async Task GetTopBottomProductsByValue([FromHeader] Guid e public async Task GetTopBottomMerchantsByValue([FromHeader] Guid estateId, [FromQuery] TopBottom topOrBottom, [FromQuery] Int32 count, CancellationToken cancellationToken){ Models.TopBottom modelTopBottom = Enum.Parse(topOrBottom.ToString()); - List topbottomData = await this.ReportingManager.GetTopBottomData(estateId, modelTopBottom, count, Models.Dimension.Merchant, cancellationToken); - + IRequest>> query = modelTopBottom switch { + Models.TopBottom.Bottom => new MerchantQueries.GetBottomMerchantsBySalesValueQuery(estateId, count), + _ => new MerchantQueries.GetTopMerchantsBySalesValueQuery(estateId, count) + }; + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - topbottomData.ForEach(t => { + result.Data.ForEach(t => { response.Add(new TopBottomMerchantData{ MerchantName = t.DimensionName, SalesValue = t.SalesValue }); }); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -198,17 +231,23 @@ public async Task GetTopBottomMerchantsByValue([FromHeader] Guid public async Task GetTopBottomOperatorsByValue([FromHeader] Guid estateId, [FromQuery] TopBottom topOrBottom, [FromQuery] Int32 count, CancellationToken cancellationToken){ Models.TopBottom modelTopBottom = Enum.Parse(topOrBottom.ToString()); - List topbottomData = await this.ReportingManager.GetTopBottomData(estateId, modelTopBottom, count, Models.Dimension.Operator, cancellationToken); - + IRequest>> query = modelTopBottom switch + { + Models.TopBottom.Bottom => new OperatorQueries.GetBottomOperatorsBySalesValueQuery(estateId, count), + _ => new OperatorQueries.GetTopOperatorsBySalesValueQuery(estateId, count) + }; + Result> result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - topbottomData.ForEach(t => { + result.Data.ForEach(t => { response.Add(new TopBottomOperatorData{ OperatorName = t.DimensionName, SalesValue = t.SalesValue }); }); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -223,19 +262,22 @@ public async Task GetMerchantPerformance([FromHeader] Guid estate } } - Models.TodaysSales model = await this.ReportingManager.GetMerchantPerformance(estateId, comparisonDate, merchantIdFilter, cancellationToken); - + MerchantQueries.GetMerchantPerformanceQuery query = new(estateId, comparisonDate, merchantIdFilter); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); + TodaysSales response = new TodaysSales { - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue, - ComparisonAverageSalesValue = model.ComparisonAverageSalesValue, - TodaysAverageSalesValue = model.TodaysAverageSalesValue, + ComparisonSalesCount = result.Data.ComparisonSalesCount, + ComparisonSalesValue = result.Data.ComparisonSalesValue, + TodaysSalesCount = result.Data.TodaysSalesCount, + TodaysSalesValue = result.Data.TodaysSalesValue, + ComparisonAverageSalesValue = result.Data.ComparisonAverageSalesValue, + TodaysAverageSalesValue = result.Data.TodaysAverageSalesValue, }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -253,19 +295,21 @@ public async Task GetProductPerformance([FromHeader] Guid estateI } } - Models.TodaysSales model = await this.ReportingManager.GetProductPerformance(estateId, comparisonDate, productIdFilter, cancellationToken); - + ProductQueries.GetProductPerformanceQuery query = new(estateId, comparisonDate, productIdFilter); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); TodaysSales response = new TodaysSales { - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue, - ComparisonAverageSalesValue = model.ComparisonAverageSalesValue, - TodaysAverageSalesValue = model.TodaysAverageSalesValue, + ComparisonSalesCount = result.Data.ComparisonSalesCount, + ComparisonSalesValue = result.Data.ComparisonSalesValue, + TodaysSalesCount = result.Data.TodaysSalesCount, + TodaysSalesValue = result.Data.TodaysSalesValue, + ComparisonAverageSalesValue = result.Data.ComparisonAverageSalesValue, + TodaysAverageSalesValue = result.Data.TodaysAverageSalesValue, }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -282,20 +326,23 @@ public async Task GetOperatorPerformance([FromHeader] Guid estate operatorIdFilter.Add(Int32.Parse(productListString)); } } - - Models.TodaysSales model = await this.ReportingManager.GetOperatorPerformance(estateId, comparisonDate, operatorIdFilter, cancellationToken); + + OperatorQueries.GetOperatorPerformanceQuery query = new(estateId, comparisonDate, operatorIdFilter); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); TodaysSales response = new TodaysSales { - ComparisonSalesCount = model.ComparisonSalesCount, - ComparisonSalesValue = model.ComparisonSalesValue, - TodaysSalesCount = model.TodaysSalesCount, - TodaysSalesValue = model.TodaysSalesValue, - ComparisonAverageSalesValue = model.ComparisonAverageSalesValue, - TodaysAverageSalesValue = model.TodaysAverageSalesValue, + ComparisonSalesCount = result.Data.ComparisonSalesCount, + ComparisonSalesValue = result.Data.ComparisonSalesValue, + TodaysSalesCount = result.Data.TodaysSalesCount, + TodaysSalesValue = result.Data.TodaysSalesValue, + ComparisonAverageSalesValue = result.Data.ComparisonAverageSalesValue, + TodaysAverageSalesValue = result.Data.TodaysAverageSalesValue, }; - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } [HttpGet] @@ -323,12 +370,15 @@ public async Task TransactionSearch([FromHeader] Guid estateId, [ StartValue = request.ValueRange.StartValue, }; } - - List result = await this.ReportingManager.TransactionSearch(estateId, searchModel, pagingRequest, sortingRequest, cancellationToken); + + TransactionQueries.TransactionSearchQuery query = new(estateId, searchModel, pagingRequest, sortingRequest); + var result = await this.Mediator.Send(query, cancellationToken); + if (result.IsFailed) + return result.ToActionResultX(); List response = new List(); - result.ForEach(t => { + result.Data.ForEach(t => { response.Add(new TransactionResult{ MerchantReportingId = t.MerchantReportingId, ResponseCode = t.ResponseCode, @@ -348,15 +398,17 @@ public async Task TransactionSearch([FromHeader] Guid estateId, [ }); - return this.Ok(response); + return Result.Success(response).ToActionResultX(); } private static PagingRequest CreatePagingRequest(int? page, int? pageSize) => new(page, pageSize); - private static SortingRequest CreateSortingRequest(SortField? sortField, SortDirection? sortDirection){ + private static SortingRequest CreateSortingRequest(SortField? sortField, SortDirection? sortDirection) + { Models.SortField modelSortField = Models.SortField.TransactionAmount; Models.SortDirection modelSortDirection = Models.SortDirection.Ascending; - if (sortField != null){ + if (sortField != null) + { modelSortField = Enum.Parse(sortField.ToString(), true); } if (sortDirection != null) diff --git a/EstateReportingAPI/EstateReportingAPI.csproj b/EstateReportingAPI/EstateReportingAPI.csproj index 4573537..f035490 100644 --- a/EstateReportingAPI/EstateReportingAPI.csproj +++ b/EstateReportingAPI/EstateReportingAPI.csproj @@ -12,6 +12,7 @@ + diff --git a/EstateReportingAPI/Startup.cs b/EstateReportingAPI/Startup.cs index 3798ac1..6e6d7a3 100644 --- a/EstateReportingAPI/Startup.cs +++ b/EstateReportingAPI/Startup.cs @@ -37,6 +37,7 @@ public void ConfigureContainer(ServiceRegistry services) services.IncludeRegistry(); services.IncludeRegistry(); + services.IncludeRegistry(); Container = new Container(services); }