Skip to content

Commit 942352c

Browse files
Merge branch 'main' into task/#473_update_shared_nugets
2 parents 5d08ccc + 57b3b84 commit 942352c

8 files changed

Lines changed: 162 additions & 236 deletions

File tree

FileProcessor.BusinessLogic.Tests/FileProcessingManagerTests.cs

Lines changed: 107 additions & 191 deletions
Large diffs are not rendered by default.

FileProcessor.BusinessLogic.Tests/FileProcessor.BusinessLogic.Tests.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<PropertyGroup>
44
<TargetFramework>net9.0</TargetFramework>
5-
<DebugType>None</DebugType>
5+
<DebugType>Full</DebugType>
66
<IsPackable>false</IsPackable>
77
</PropertyGroup>
88

FileProcessor.BusinessLogic/Common/ModelFactory.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ public List<FileImportLog> ConvertFrom(Guid estateId,
6767
/// <returns></returns>
6868
public FileImportLog ConvertFrom(Guid estateId,
6969
TransactionProcessor.Database.Entities.FileImportLog importLog,
70-
List<(TransactionProcessor.Database.Entities.FileImportLogFile, TransactionProcessor.Database.Entities.File, Merchant)> importLogFilesList)
71-
{
70+
List<(TransactionProcessor.Database.Entities.FileImportLogFile, TransactionProcessor.Database.Entities.File, Merchant)> importLogFilesList) {
7271
FileImportLog model = new FileImportLog();
7372

7473
model.FileImportLogId = importLog.FileImportLogId;

FileProcessor.BusinessLogic/Managers/FileProcessorManager.cs

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,20 @@
66

77
namespace FileProcessor.BusinessLogic.Managers
88
{
9-
using System;
10-
using System.Collections.Generic;
11-
using System.Linq;
12-
using System.Security.Cryptography.X509Certificates;
13-
using System.Threading;
14-
using System.Threading.Tasks;
159
using Common;
1610
using FileAggregate;
1711
using FileProcessor.Models;
1812
using Microsoft.EntityFrameworkCore;
1913
using Shared.DomainDrivenDesign.EventSourcing;
14+
using Shared.EntityFramework;
2015
using Shared.EventStore.Aggregate;
2116
using Shared.Exceptions;
17+
using System;
18+
using System.Collections.Generic;
19+
using System.Linq;
20+
using System.Security.Cryptography.X509Certificates;
21+
using System.Threading;
22+
using System.Threading.Tasks;
2223
using FileImportLog = FileProcessor.Models.FileImportLog;
2324

2425
/// <summary>
@@ -28,19 +29,15 @@ namespace FileProcessor.BusinessLogic.Managers
2829
public class FileProcessorManager : IFileProcessorManager
2930
{
3031
#region Fields
31-
32-
/// <summary>
33-
/// The file profiles
34-
/// </summary>
3532
private readonly List<FileProfile> FileProfiles;
3633

37-
private readonly Shared.EntityFramework.IDbContextFactory<EstateManagementContext> DbContextFactory;
34+
private readonly IDbContextResolver<EstateManagementContext> Resolver;
35+
private static readonly String EstateManagementDatabaseName = "TransactionProcessorReadModel";
3836

3937
private readonly IModelFactory ModelFactory;
4038

4139
private readonly IAggregateRepository<FileAggregate, DomainEvent> FileAggregateRepository;
4240

43-
private const String ConnectionStringIdentifier = "EstateReportingReadModel";
4441

4542
#endregion
4643

@@ -53,12 +50,12 @@ public class FileProcessorManager : IFileProcessorManager
5350
/// <param name="dbContextFactory">The database context factory.</param>
5451
/// <param name="modelFactory">The model factory.</param>
5552
public FileProcessorManager(List<FileProfile> fileProfiles,
56-
Shared.EntityFramework.IDbContextFactory<EstateManagementContext> dbContextFactory,
53+
IDbContextResolver<EstateManagementContext> resolver,
5754
IModelFactory modelFactory,
5855
IAggregateRepository<FileAggregate, DomainEvent> fileAggregateRepository)
5956
{
6057
this.FileProfiles = fileProfiles;
61-
this.DbContextFactory = dbContextFactory;
58+
this.Resolver = resolver;
6259
this.ModelFactory = modelFactory;
6360
this.FileAggregateRepository = fileAggregateRepository;
6461
}
@@ -83,13 +80,20 @@ public async Task<Result<FileProfile>> GetFileProfile(Guid fileProfileId,
8380

8481
}
8582

83+
private async Task<EstateManagementContext> GetContext(Guid estateId)
84+
{
85+
ResolvedDbContext<EstateManagementContext>? resolvedContext = this.Resolver.Resolve(EstateManagementDatabaseName, estateId.ToString());
86+
return resolvedContext.Context;
87+
}
88+
89+
8690
public async Task<Result<List<FileImportLog>>> GetFileImportLogs(Guid estateId,
8791
DateTime startDateTime,
8892
DateTime endDateTime,
8993
Guid? merchantId,
9094
CancellationToken cancellationToken)
9195
{
92-
EstateManagementContext context = await this.DbContextFactory.GetContext(estateId, ConnectionStringIdentifier, cancellationToken);
96+
EstateManagementContext context = await this.GetContext(estateId);
9397

9498
List<TransactionProcessor.Database.Entities.FileImportLog> importLogQuery =
9599
await context.FileImportLogs.Where(f => f.ImportLogDateTime >= startDateTime).ToListAsync(cancellationToken);
@@ -130,8 +134,8 @@ public async Task<Result<FileImportLog>> GetFileImportLog(Guid fileImportLogId,
130134
Guid? merchantId,
131135
CancellationToken cancellationToken)
132136
{
133-
EstateManagementContext context = await this.DbContextFactory.GetContext(estateId, ConnectionStringIdentifier, cancellationToken);
134-
137+
EstateManagementContext context = await this.GetContext(estateId);
138+
135139
// Fetch the import log entry
136140
TransactionProcessor.Database.Entities.FileImportLog importLogQuery = await context.FileImportLogs
137141
.SingleOrDefaultAsync(f => f.FileImportLogId == fileImportLogId, cancellationToken);
@@ -158,7 +162,8 @@ join merchant in context.Merchants on file.MerchantId equals merchant.MerchantId
158162
entityData.Add((file.fileImportLogFile, file.file, file.merchant));
159163
}
160164

161-
return this.ModelFactory.ConvertFrom(estateId, importLogQuery, entityData);
165+
var x = this.ModelFactory.ConvertFrom(estateId, importLogQuery, entityData);
166+
return Result.Success(x);
162167
}
163168

164169
public async Task<Result<FileDetails>> GetFile(Guid fileId,
@@ -179,7 +184,7 @@ public async Task<Result<FileDetails>> GetFile(Guid fileId,
179184

180185
FileDetails fileDetails = fileAggregate.GetFile();
181186

182-
EstateManagementContext context = await this.DbContextFactory.GetContext(estateId, ConnectionStringIdentifier, cancellationToken);
187+
EstateManagementContext context = await this.GetContext(estateId);
183188

184189
Merchant merchant = await context.Merchants
185190
.SingleOrDefaultAsync(m => m.MerchantId == fileDetails.MerchantId, cancellationToken);

FileProcessor.BusinessLogic/Services/FileProcessorDomainService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ private async Task<Result> ProcessFile(Guid fileId,
519519
inProgressFile.MoveTo($"{fileProfile.ProcessedDirectory}/{inProgressFile.Name}", true);
520520
}
521521
else {
522+
Logger.LogWarning($"About to move file {inProgressFile.Name} to [{fileProfile.FailedDirectory}]. Reason(s) [{String.Join(",", result.Errors)}]");
522523
inProgressFile.MoveTo($"{fileProfile.FailedDirectory}/{inProgressFile.Name}", true);
523524
}
524525

FileProcessor.IntegrationTests/Common/DockerHelper.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,17 @@ public override async Task CreateSubscriptions(){
6363
}
6464
}
6565

66+
protected override EventStoreClientSettings ConfigureEventStoreSettings()
67+
{
68+
string str = $"esdb://127.0.0.1:{this.EventStoreHttpPort}?tls=false&tlsVerifyCert=false&defaultDeadline=30000";
69+
if (this.IsSecureEventStore) {
70+
str = $"esdb://admin:changeit@127.0.0.1:{this.EventStoreHttpPort}?tls=true&tlsVerifyCert=false&defaultDeadline=30000";
71+
}
72+
return EventStoreClientSettings.Create(str);
73+
}
74+
6675
public override async Task StartContainersForScenarioRun(String scenarioName, DockerServices dockerServices){
76+
6777
await base.StartContainersForScenarioRun(scenarioName, dockerServices);
6878

6979
// Setup the base address resolvers

FileProcessor.Testing/TestData.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,8 @@ public static FileProfile GetFileProfile(String operatorName)
147147

148148
public static List<FileProfile> FileProfiles => new List<FileProfile>
149149
{
150-
FileProfileSafaricom
150+
FileProfileSafaricom,
151+
TestData.FileProfile
151152
};
152153
public static Guid SafaricomFileProfileId = Guid.Parse("079F1FF5-F51E-4BE0-AF4F-2D4862E6D34F");
153154
public static String SafaricomProfileName = "Safaricom Profile";
@@ -321,7 +322,7 @@ public static FileAggregate GetFileAggregateWithLinesAlreadyProcessed()
321322
["AppSettings:TemporaryFileLocation"] = "C:\\Temp",
322323
["AppSettings:FileProfilePollingWindowInSeconds"] = "30",
323324
["ConnectionStrings:HealthCheck"] = "HeathCheckConnString",
324-
["ConnectionStrings:EstateReportingReadModel"] = "EstateReportingReadModel",
325+
["ConnectionStrings:TransactionProcessorReadModel"] = "EstateReportingReadModel",
325326
["SecurityConfiguration:Authority"] = "https://127.0.0.1",
326327
["EventStoreSettings:ConnectionString"] = "esdb://127.0.0.1:2113",
327328
["EventStoreSettings:ConnectionName"] = "UnitTestConnection",

FileProcessor/Bootstrapper/RepositoryRegistry.cs

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22

33
namespace FileProcessor.Bootstrapper;
44

5-
using System;
6-
using System.Diagnostics.CodeAnalysis;
75
using BusinessLogic.Common;
86
using BusinessLogic.Managers;
97
using FileAggregate;
108
using FileImportLogAggregate;
119
using Lamar;
10+
using Microsoft.EntityFrameworkCore;
1211
using Microsoft.Extensions.Configuration;
1312
using Microsoft.Extensions.DependencyInjection;
13+
using Microsoft.Extensions.Hosting;
1414
using Shared.DomainDrivenDesign.EventSourcing;
1515
using Shared.EntityFramework;
1616
using Shared.EntityFramework.ConnectionStringConfiguration;
@@ -19,6 +19,8 @@ namespace FileProcessor.Bootstrapper;
1919
using Shared.EventStore.SubscriptionWorker;
2020
using Shared.General;
2121
using Shared.Repositories;
22+
using System;
23+
using System.Diagnostics.CodeAnalysis;
2224

2325
[ExcludeFromCodeCoverage]
2426
public class RepositoryRegistry : ServiceRegistry
@@ -30,38 +32,30 @@ public class RepositoryRegistry : ServiceRegistry
3032
/// </summary>
3133
public RepositoryRegistry()
3234
{
33-
Boolean useConnectionStringConfig = bool.Parse(ConfigurationReader.GetValue("AppSettings", "UseConnectionStringConfig"));
34-
35-
if (useConnectionStringConfig)
35+
this.AddSingleton(typeof(IDbContextResolver<>), typeof(DbContextResolver<>));
36+
if (Startup.WebHostEnvironment.IsEnvironment("IntegrationTest") || Startup.Configuration.GetValue<Boolean>("ServiceOptions:UseInMemoryDatabase") == true)
3637
{
37-
String connectionStringConfigurationConnString = ConfigurationReader.GetConnectionString("ConnectionStringConfiguration");
38-
this.AddSingleton<IConnectionStringConfigurationRepository, ConnectionStringConfigurationRepository>();
39-
this.AddTransient(c => { return new ConnectionStringConfigurationContext(connectionStringConfigurationConnString); });
40-
41-
// TODO: Read this from a the database and set
38+
this.AddDbContext<EstateManagementContext>(builder => builder.UseInMemoryDatabase("TransactionProcessorReadModel"));
4239
}
4340
else
4441
{
45-
String connectionString = Startup.Configuration.GetValue<String>("EventStoreSettings:ConnectionString");
42+
this.AddDbContext<EstateManagementContext>(options =>
43+
options.UseSqlServer(ConfigurationReader.GetConnectionString("TransactionProcessorReadModel")));
44+
}
4645

47-
this.AddEventStoreProjectionManagementClient(connectionString);
48-
this.AddEventStorePersistentSubscriptionsClient(connectionString);
46+
String connectionString = Startup.Configuration.GetValue<String>("EventStoreSettings:ConnectionString");
4947

50-
this.AddEventStoreClient(connectionString);
51-
this.AddSingleton<IConnectionStringConfigurationRepository, ConfigurationReaderConnectionStringRepository>();
52-
}
48+
this.AddEventStoreProjectionManagementClient(connectionString);
49+
this.AddEventStorePersistentSubscriptionsClient(connectionString);
50+
51+
this.AddEventStoreClient(connectionString);
5352

5453
this.AddSingleton<IEventStoreContext, EventStoreContext>();
5554

5655
this.AddSingleton<IAggregateRepository<FileAggregate, DomainEvent>, AggregateRepository<FileAggregate, DomainEvent>>();
5756
this.AddSingleton<IAggregateRepository<FileImportLogAggregate, DomainEvent>,
5857
AggregateRepository<FileImportLogAggregate, DomainEvent>>();
5958

60-
this.AddSingleton<IDbContextFactory<EstateManagementContext>, DbContextFactory<EstateManagementContext>>();
61-
this.AddSingleton<Func<String, EstateManagementContext>>(cont => connectionString =>
62-
{
63-
return new EstateManagementContext(connectionString);
64-
});
6559
this.AddSingleton<IFileProcessorManager, FileProcessorManager>();
6660

6761
this.AddSingleton<Func<String, Int32, ISubscriptionRepository>>(cont => (esConnString, cacheDuration) => {

0 commit comments

Comments
 (0)