Skip to content

Commit aec9c90

Browse files
Refactor database context resolution in ReportingManager
Updated ReportingManager to use IDbContextResolver for context resolution. Adjusted connection string in ControllerTestsBase to use TransactionProcessorReadModel. Modified CustomWebApplicationFactory to align with new context resolution. Replaced Guid.NewGuid() with this.TestId in multiple test files for consistency and reliability. Ensured all tests utilize the new context resolution and connection string updates.
1 parent 9c23a89 commit aec9c90

6 files changed

Lines changed: 173 additions & 129 deletions

File tree

EstateReportingAPI.BusinessLogic/ReportingManager.cs

Lines changed: 47 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -5,25 +5,23 @@
55
namespace EstateReportingAPI.BusinessLogic{
66
using Microsoft.EntityFrameworkCore;
77
using Models;
8+
using Shared.EntityFramework;
89
using System.Linq;
910
using System.Threading;
1011
using Calendar = Models.Calendar;
1112
using Merchant = Models.Merchant;
1213
using Operator = Models.Operator;
1314

1415
public class ReportingManager : IReportingManager{
15-
#region Fields
16-
17-
private readonly Shared.EntityFramework.IDbContextFactory<EstateManagementContext> ContextFactory;
16+
private readonly IDbContextResolver<EstateManagementContext> Resolver;
1817

18+
1919
private Guid Id;
20-
21-
#endregion
22-
20+
private static readonly String EstateManagementDatabaseName = "TransactionProcessorReadModel";
2321
#region Constructors
2422

25-
public ReportingManager(Shared.EntityFramework.IDbContextFactory<EstateManagementContext> contextFactory){
26-
this.ContextFactory = contextFactory;
23+
public ReportingManager(IDbContextResolver<EstateManagementContext> resolver) {
24+
this.Resolver = resolver;
2725
}
2826

2927
#endregion
@@ -32,7 +30,8 @@ public ReportingManager(Shared.EntityFramework.IDbContextFactory<EstateManagemen
3230

3331
public async Task<List<UnsettledFee>> GetUnsettledFees(Guid estateId, DateTime startDate, DateTime endDate, List<Int32> merchantIds, List<Int32> operatorIds, List<Int32> productIds, GroupByOption? groupByOption, CancellationToken cancellationToken){
3432

35-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
33+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
34+
await using EstateManagementContext context = resolvedContext.Context;
3635

3736
var fees = (from merchantSettlementFee in context.MerchantSettlementFees
3837
join transaction in context.Transactions
@@ -132,7 +131,8 @@ into grouped
132131
}
133132

134133
public async Task<List<Calendar>> GetCalendarComparisonDates(Guid estateId, CancellationToken cancellationToken){
135-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
134+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
135+
await using EstateManagementContext context = resolvedContext.Context;
136136

137137
DateTime startOfYear = new DateTime(DateTime.Now.Year, 1, 1);
138138

@@ -159,7 +159,8 @@ public async Task<List<Calendar>> GetCalendarComparisonDates(Guid estateId, Canc
159159
}
160160

161161
public async Task<List<Calendar>> GetCalendarDates(Guid estateId, CancellationToken cancellationToken){
162-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
162+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
163+
await using EstateManagementContext context = resolvedContext.Context;
163164

164165
List<TransactionProcessor.Database.Entities.Calendar> entities = context.Calendar.Where(c => c.Date <= DateTime.Now.Date).ToList();
165166

@@ -184,15 +185,17 @@ public async Task<List<Calendar>> GetCalendarDates(Guid estateId, CancellationTo
184185
}
185186

186187
public async Task<List<Int32>> GetCalendarYears(Guid estateId, CancellationToken cancellationToken){
187-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
188-
188+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
189+
await using EstateManagementContext context = resolvedContext.Context;
190+
189191
List<Int32> years = context.Calendar.Where(c => c.Date <= DateTime.Now.Date).GroupBy(c => c.Year).Select(y => y.Key).ToList();
190192

191193
return years;
192194
}
193195

194196
public async Task<LastSettlement> GetLastSettlement(Guid estateId, CancellationToken cancellationToken){
195-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
197+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
198+
await using EstateManagementContext context = resolvedContext.Context;
196199

197200
DateTime settlementDate = await context.SettlementSummary.Where(s => s.IsCompleted).OrderByDescending(s => s.SettlementDate).Select(s => s.SettlementDate).FirstOrDefaultAsync(cancellationToken);
198201

@@ -217,7 +220,8 @@ public async Task<LastSettlement> GetLastSettlement(Guid estateId, CancellationT
217220
}
218221

219222
public async Task<MerchantKpi> GetMerchantsTransactionKpis(Guid estateId, CancellationToken cancellationToken){
220-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
223+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
224+
await using EstateManagementContext context = resolvedContext.Context;
221225

222226
Int32 merchantsWithSaleInLastHour = (from m in context.Merchants
223227
where m.LastSaleDate == DateTime.Now.Date
@@ -242,7 +246,8 @@ public async Task<MerchantKpi> GetMerchantsTransactionKpis(Guid estateId, Cancel
242246
}
243247

244248
public async Task<List<Merchant>> GetMerchantsByLastSale(Guid estateId, DateTime startDateTime, DateTime endDateTime, CancellationToken cancellationToken){
245-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
249+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
250+
await using EstateManagementContext context = resolvedContext.Context;
246251

247252
List<Merchant> response = new();
248253

@@ -292,7 +297,8 @@ public async Task<List<Merchant>> GetMerchantsByLastSale(Guid estateId, DateTime
292297
}
293298

294299
public async Task<List<ResponseCode>> GetResponseCodes(Guid estateId, CancellationToken cancellationToken){
295-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
300+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
301+
await using EstateManagementContext context = resolvedContext.Context;
296302
List<ResponseCode> response = new List<ResponseCode>();
297303

298304
List<ResponseCodes> responseCodes = await context.ResponseCodes.ToListAsync(cancellationToken);
@@ -306,7 +312,8 @@ public async Task<List<ResponseCode>> GetResponseCodes(Guid estateId, Cancellati
306312
}
307313

308314
public async Task<TodaysSales> GetTodaysFailedSales(Guid estateId, DateTime comparisonDate, String responseCode, CancellationToken cancellationToken){
309-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
315+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
316+
await using EstateManagementContext context = resolvedContext.Context;
310317

311318
List<decimal> todaysSales = await (from t in context.TodayTransactions
312319
where t.IsAuthorised == false
@@ -377,7 +384,8 @@ private async Task<IQueryable<TransactionHistory>> GetSalesForDate(EstateManagem
377384
}
378385

379386
public async Task<TodaysSales> GetTodaysSales(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){
380-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
387+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
388+
await using EstateManagementContext context = resolvedContext.Context;
381389

382390
IQueryable<TodayTransaction> todaysSales = await GetTodaysSales(context, merchantReportingId, operatorReportingId, cancellationToken);
383391
IQueryable<TransactionHistory> comparisonSales = await GetSalesForDate(context, comparisonDate, merchantReportingId, operatorReportingId, cancellationToken);
@@ -399,7 +407,8 @@ public async Task<TodaysSales> GetTodaysSales(Guid estateId, Int32 merchantRepor
399407
}
400408

401409
public async Task<List<TodaysSalesCountByHour>> GetTodaysSalesCountByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){
402-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
410+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
411+
await using EstateManagementContext context = resolvedContext.Context;
403412

404413
IQueryable<TodayTransaction> todaysSales = await GetTodaysSales(context, merchantReportingId, operatorReportingId, cancellationToken);
405414
IQueryable<TransactionHistory> comparisonSales = await GetSalesForDate(context, comparisonDate, merchantReportingId, operatorReportingId, cancellationToken);
@@ -435,7 +444,8 @@ on today.Hour equals comparison.Hour
435444
}
436445

437446
public async Task<List<TodaysSalesValueByHour>> GetTodaysSalesValueByHour(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){
438-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
447+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
448+
await using EstateManagementContext context = resolvedContext.Context;
439449

440450
IQueryable<TodayTransaction> todaysSales = await GetTodaysSales(context, merchantReportingId, operatorReportingId, cancellationToken);
441451
IQueryable<TransactionHistory> comparisonSales = await GetSalesForDate(context, comparisonDate, merchantReportingId, operatorReportingId, cancellationToken);
@@ -520,7 +530,8 @@ join t in context.TodayTransactions on f.TransactionId equals t.TransactionId
520530
}
521531

522532
public async Task<TodaysSettlement> GetTodaysSettlement(Guid estateId, Int32 merchantReportingId, Int32 operatorReportingId, DateTime comparisonDate, CancellationToken cancellationToken){
523-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
533+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
534+
await using EstateManagementContext context = resolvedContext.Context;
524535

525536
IQueryable<MerchantSettlementFee> todaySettlementData = await GetTodaysSettlement(context, merchantReportingId, operatorReportingId, cancellationToken);
526537
IQueryable<MerchantSettlementFee> comparisonSettlementData = await GetSettlementDataForDate(context, merchantReportingId, operatorReportingId, comparisonDate, cancellationToken);
@@ -560,7 +571,8 @@ group f by f.IsSettled into grouped
560571
}
561572

562573
public async Task<List<TopBottomData>> GetTopBottomData(Guid estateId, TopBottom direction, Int32 resultCount, Dimension dimension, CancellationToken cancellationToken){
563-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
574+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
575+
await using EstateManagementContext context = resolvedContext.Context;
564576

565577
IQueryable<TodayTransaction> mainQuery = context.TodayTransactions
566578
.Where(joined => joined.IsAuthorised == true
@@ -642,7 +654,8 @@ public async Task<List<TopBottomData>> GetTopBottomData(Guid estateId, TopBottom
642654
}
643655

644656
public async Task<TodaysSales> GetMerchantPerformance(Guid estateId, DateTime comparisonDate, List<Int32> merchantReportingIds, CancellationToken cancellationToken){
645-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
657+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
658+
await using EstateManagementContext context = resolvedContext.Context;
646659

647660
// First we need to get a value of todays sales
648661
var todaysSalesQuery = (from t in context.TodayTransactions
@@ -700,7 +713,8 @@ private Decimal SafeDivide(Decimal number, Int32 divisor)
700713

701714
public async Task<TodaysSales> GetProductPerformance(Guid estateId, DateTime comparisonDate, List<Int32> productReportingIds, CancellationToken cancellationToken)
702715
{
703-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
716+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
717+
await using EstateManagementContext context = resolvedContext.Context;
704718

705719
// First we need to get a value of todays sales
706720
var todaysSalesQuery = (from t in context.TodayTransactions
@@ -738,7 +752,8 @@ public async Task<TodaysSales> GetProductPerformance(Guid estateId, DateTime com
738752
}
739753

740754
public async Task<TodaysSales> GetOperatorPerformance(Guid estateId, DateTime comparisonDate, List<Int32> operatorReportingIds, CancellationToken cancellationToken){
741-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
755+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
756+
await using EstateManagementContext context = resolvedContext.Context;
742757

743758
// First we need to get a value of todays sales
744759
var todaysSalesQuery = (from t in context.TodayTransactions
@@ -777,7 +792,8 @@ public async Task<TodaysSales> GetOperatorPerformance(Guid estateId, DateTime co
777792

778793
public async Task<List<TransactionResult>> TransactionSearch(Guid estateId, TransactionSearchRequest searchRequest, PagingRequest pagingRequest, SortingRequest sortingRequest, CancellationToken cancellationToken){
779794
// Base query before any filtering is added
780-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
795+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
796+
await using EstateManagementContext context = resolvedContext.Context;
781797

782798
var mainQuery = (from txn in context.Transactions
783799
join merchant in context.Merchants on txn.MerchantId equals merchant.MerchantId
@@ -875,7 +891,8 @@ join product in context.ContractProducts on txn.ContractProductId equals product
875891
}
876892

877893
public async Task<List<Merchant>> GetMerchants(Guid estateId, CancellationToken cancellationToken){
878-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
894+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
895+
await using EstateManagementContext context = resolvedContext.Context;
879896

880897
var merchants = context.Merchants
881898
.Select(m => new
@@ -931,7 +948,8 @@ public async Task<List<Merchant>> GetMerchants(Guid estateId, CancellationToken
931948
}
932949

933950
public async Task<List<Operator>> GetOperators(Guid estateId, CancellationToken cancellationToken){
934-
EstateManagementContext? context = await this.ContextFactory.GetContext(estateId, ReportingManager.ConnectionStringIdentifier, cancellationToken);
951+
using ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
952+
await using EstateManagementContext context = resolvedContext.Context;
935953

936954
List<Operator> operators = await (from o in context.Operators
937955
select new Operator

EstateReportingAPI.IntegrationTests/ControllerTestsBase.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,13 @@ public virtual async Task InitializeAsync()
3636

3737
await this.StartSqlContainer();
3838

39-
String dbConnString = GetLocalConnectionString($"EstateReportingReadModel{this.TestId}");
39+
String dbConnString = GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId}");
4040

4141
this.factory = new CustomWebApplicationFactory<Startup>(dbConnString);
4242
this.Client = this.factory.CreateClient();
4343
this.ApiClient = new EstateReportingApiClient((s) => "http://localhost", this.Client);
4444

45-
this.context = new EstateManagementContext(GetLocalConnectionString($"EstateReportingReadModel{this.TestId.ToString()}"));
45+
this.context = new EstateManagementContext(GetLocalConnectionString($"TransactionProcessorReadModel-{this.TestId.ToString()}"));
4646

4747
this.helper = new DatabaseHelper(context);
4848
await this.helper.CreateStoredProcedures(CancellationToken.None);

0 commit comments

Comments
 (0)