diff --git a/EstateReportingAPI.BusinessLogic/DatabaseModels.cs b/EstateReportingAPI.BusinessLogic/DatabaseModels.cs new file mode 100644 index 0000000..11ff3f3 --- /dev/null +++ b/EstateReportingAPI.BusinessLogic/DatabaseModels.cs @@ -0,0 +1,31 @@ +namespace EstateReportingAPI.BusinessLogic; + +using System; + +internal sealed class MerchantData { + public Guid MerchantId { get; init; } + public int MerchantReportingId { get; init; } + public string? Name { get; init; } + public DateTime CreatedDateTime { get; init; } + public string? Reference { get; init; } + public int SettlementSchedule { get; init; } + public MerchantAddressData? AddressInfo { get; init; } + public MerchantContactData? ContactInfo { get; init; } +} + +internal sealed class MerchantAddressData { + public Guid AddressId { get; init; } + public string? AddressLine1 { get; init; } + public string? AddressLine2 { get; init; } + public string? Country { get; init; } + public string? PostalCode { get; init; } + public string? Region { get; init; } + public string? Town { get; init; } +} + +internal sealed class MerchantContactData { + public Guid ContactId { get; init; } + public string? Name { get; init; } + public string? EmailAddress { get; init; } + public string? PhoneNumber { get; init; } +} diff --git a/EstateReportingAPI.BusinessLogic/ModelFactory.cs b/EstateReportingAPI.BusinessLogic/ModelFactory.cs new file mode 100644 index 0000000..888007f --- /dev/null +++ b/EstateReportingAPI.BusinessLogic/ModelFactory.cs @@ -0,0 +1,29 @@ +namespace EstateReportingAPI.BusinessLogic; + +using Merchant = EstateReportingAPI.Models.Merchant; + +internal static class ModelFactory { + internal static Merchant ConvertFrom(MerchantData merchant, + decimal balance) { + return new Merchant { + Balance = balance, + CreatedDateTime = merchant.CreatedDateTime, + Name = merchant.Name, + Reference = merchant.Reference, + MerchantId = merchant.MerchantId, + MerchantReportingId = merchant.MerchantReportingId, + SettlementSchedule = merchant.SettlementSchedule, + AddressId = merchant.AddressInfo.AddressId, + AddressLine1 = merchant.AddressInfo.AddressLine1, + AddressLine2 = merchant.AddressInfo.AddressLine2, + Town = merchant.AddressInfo.Town, + Region = merchant.AddressInfo.Region, + PostCode = merchant.AddressInfo.PostalCode, + Country = merchant.AddressInfo.Country, + ContactId = merchant.ContactInfo.ContactId, + ContactName = merchant.ContactInfo.Name, + ContactEmail = merchant.ContactInfo.EmailAddress, + ContactPhone = merchant.ContactInfo.PhoneNumber + }; + } +} diff --git a/EstateReportingAPI.BusinessLogic/ReportingManager.cs b/EstateReportingAPI.BusinessLogic/ReportingManager.cs index c758ef9..a5896a2 100644 --- a/EstateReportingAPI.BusinessLogic/ReportingManager.cs +++ b/EstateReportingAPI.BusinessLogic/ReportingManager.cs @@ -1001,70 +1001,59 @@ public async Task>> GetMerchants(MerchantQueries.GetMercha return Result.Success(response); } - public async Task> GetMerchant(MerchantQueries.GetMerchantQuery request, - CancellationToken cancellationToken) { + public async Task> GetMerchant(MerchantQueries.GetMerchantQuery request, CancellationToken cancellationToken) { using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context; - - var merchantQuery = context.Merchants.Select(m => new { - MerchantReportingId = m.MerchantReportingId, - Name = m.Name, - CreatedDateTime = m.CreatedDateTime, - MerchantId = m.MerchantId, - Reference = m.Reference, - m.SettlementSchedule, - AddressInfo = context.MerchantAddresses.Where(ma => ma.MerchantId == m.MerchantId).OrderByDescending(ma => ma.CreatedDateTime).Select(ma => new { - ma.AddressId, - ma.AddressLine1, - ma.AddressLine2, - ma.Country, - ma.PostalCode, - ma.Region, - ma.Town - }).FirstOrDefault(), - ContactInfo = context.MerchantContacts.Where(mc => mc.MerchantId == m.MerchantId).OrderByDescending(mc => mc.CreatedDateTime).Select(mc => new { mc.ContactId, mc.Name, mc.EmailAddress, mc.PhoneNumber }).FirstOrDefault() - }).Where(m => m.MerchantId == request.MerchantId); - + var merchantQuery = BuildMerchantQuery(context, request.MerchantId); var merchantQueryResult = await ExecuteQuerySafeSingleOrDefault(merchantQuery, cancellationToken, "Error getting merchant"); - - if (merchantQueryResult.IsFailed) + if (merchantQueryResult.IsFailed) { return ResultHelpers.CreateFailure(merchantQueryResult); + } - var merchant = merchantQueryResult.Data; - - // Get the merchant state to get the balance var merchantStateQueryResult = await ExecuteQuerySafeSingleOrDefault(context.MerchantBalanceProjectionState.Where(ms => ms.MerchantId == request.MerchantId), cancellationToken, "Error getting merchant state"); if (merchantStateQueryResult.IsFailed) return ResultHelpers.CreateFailure(merchantStateQueryResult); - var merchantState = merchantStateQueryResult.Data; - - // Ok now enumerate the results - Merchant result = new() { - Balance = merchantState.Balance, - CreatedDateTime = merchant.CreatedDateTime, - Name = merchant.Name, - Reference = merchant.Reference, - MerchantId = merchant.MerchantId, - MerchantReportingId = merchant.MerchantReportingId, - SettlementSchedule = merchant.SettlementSchedule, - AddressId = merchant.AddressInfo.AddressId, - AddressLine1 = merchant.AddressInfo.AddressLine1, - AddressLine2 = merchant.AddressInfo.AddressLine2, - Town = merchant.AddressInfo.Town, - Region = merchant.AddressInfo.Region, - PostCode = merchant.AddressInfo.PostalCode, - Country = merchant.AddressInfo.Country, - ContactId = merchant.ContactInfo.ContactId, - ContactName = merchant.ContactInfo.Name, - ContactEmail = merchant.ContactInfo.EmailAddress, - ContactPhone = merchant.ContactInfo.PhoneNumber - }; - return Result.Success(result); + return Result.Success(ModelFactory.ConvertFrom(merchantQueryResult.Data, merchantStateQueryResult.Data.Balance)); + } + + private static IQueryable BuildMerchantQuery(EstateManagementContext context, + Guid merchantId) { + return context.Merchants + .Select(m => new MerchantData { + MerchantReportingId = m.MerchantReportingId, + Name = m.Name, + CreatedDateTime = m.CreatedDateTime, + MerchantId = m.MerchantId, + Reference = m.Reference, + SettlementSchedule = m.SettlementSchedule, + AddressInfo = context.MerchantAddresses.Where(ma => ma.MerchantId == m.MerchantId) + .OrderByDescending(ma => ma.CreatedDateTime) + .Select(ma => new MerchantAddressData { + AddressId = ma.AddressId, + AddressLine1 = ma.AddressLine1, + AddressLine2 = ma.AddressLine2, + Country = ma.Country, + PostalCode = ma.PostalCode, + Region = ma.Region, + Town = ma.Town + }) + .FirstOrDefault(), + ContactInfo = context.MerchantContacts.Where(mc => mc.MerchantId == m.MerchantId) + .OrderByDescending(mc => mc.CreatedDateTime) + .Select(mc => new MerchantContactData { + ContactId = mc.ContactId, + Name = mc.Name, + EmailAddress = mc.EmailAddress, + PhoneNumber = mc.PhoneNumber + }) + .FirstOrDefault() + }) + .Where(m => m.MerchantId == merchantId); } public async Task>> GetMerchantOperators(MerchantQueries.GetMerchantOperatorsQuery request, - CancellationToken cancellationToken) { + CancellationToken cancellationToken) { using ResolvedDbContext? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, request.EstateId.ToString()); await using EstateManagementContext context = resolvedContext.Context;