From a45d4a93efbf53d580b3c49e3cfdc9954180b0ac Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Sat, 7 Nov 2026 08:39:19 +0000 Subject: [PATCH 1/2] update all the shared nugets --- .../HealthMonitoring.Client.csproj | 10 +-- .../HealthMonitoring.Tests.csproj | 4 +- .../HealthMonitoring/HealthMonitoring.csproj | 10 +-- ManageServices.bat | 32 +++++++ .../NLog.config | 20 +++-- .../Program.cs | 5 +- ...ionProcessing.MerchantFileProcessor.csproj | 22 ++--- TransactionProcessing.MerchantPos/Program.cs | 5 +- .../Runtime/ApiClient.cs | 21 ++--- .../Runtime/MerchantRuntime.cs | 6 +- .../TransactionProcessing.MerchantPos.csproj | 20 ++--- TransactionProcessing.MerchantPos/nlog.config | 20 +++-- .../EstateSetupFunctions.cs | 83 +++++++++---------- .../IdentityServerFunctions.cs | 46 ++++++---- .../Program.cs | 6 +- ...ransactionProcessor.SystemSetupTool.csproj | 16 ++-- .../estateconfig/Estate.cs | 6 -- .../estateconfig/Merchant.cs | 2 - .../identityserverconfig.json | 48 +++++------ .../identityserverconfig/ApiScope.cs | 2 +- .../identityserverconfig/IdentityResource.cs | 2 +- .../IdentityServerConfiguration.cs | 2 + .../setupconfig.json | 12 ++- 23 files changed, 223 insertions(+), 177 deletions(-) create mode 100644 ManageServices.bat diff --git a/HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj index 720c30f..da969c9 100644 --- a/HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj +++ b/HealthMonitoring/HealthMonitoring.Client/HealthMonitoring.Client.csproj @@ -1,4 +1,4 @@ - + net10.0 enable @@ -8,10 +8,10 @@ README.md - - - - + + + + diff --git a/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj b/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj index aeae810..99a14f5 100644 --- a/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj +++ b/HealthMonitoring/HealthMonitoring.Tests/HealthMonitoring.Tests.csproj @@ -1,4 +1,4 @@ - + net10.0 enable @@ -7,7 +7,7 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj b/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj index 4cbac19..9c5198d 100644 --- a/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj +++ b/HealthMonitoring/HealthMonitoring/HealthMonitoring.csproj @@ -12,14 +12,14 @@ PreserveNewest - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + - - + + diff --git a/ManageServices.bat b/ManageServices.bat new file mode 100644 index 0000000..439f616 --- /dev/null +++ b/ManageServices.bat @@ -0,0 +1,32 @@ + +@echo off +setlocal + +if /I "%~1"=="start" goto run +if /I "%~1"=="stop" goto run +if /I "%~1"=="restart" goto run + +echo Usage: %~nx0 start^|stop^|restart +exit /b 1 + +:run +echo Managing Transaction Processing services... +echo Action: %~1 +echo. + +powershell.exe -NoProfile -ExecutionPolicy Bypass -Command ^ + "$services = @(Get-Service -DisplayName 'Transaction Processing -*' | Sort-Object DisplayName);" ^ + "if ($services.Count -eq 0) { Write-Error 'No matching services found'; exit 1 };" ^ + "foreach ($svc in $services) {" ^ + " try {" ^ + " Write-Host ('%~1 : ' + $svc.DisplayName);" ^ + " switch ('%~1') {" ^ + " 'start' { if ($svc.Status -ne 'Running') { Start-Service -Name $svc.Name -ErrorAction Stop } }" ^ + " 'stop' { if ($svc.Status -ne 'Stopped') { Stop-Service -Name $svc.Name -ErrorAction Stop } }" ^ + " 'restart' { Restart-Service -Name $svc.Name -ErrorAction Stop }" ^ + " }" ^ + " } catch { Write-Warning $_.Exception.Message; $failed = $true }" ^ + "};" ^ + "if ($failed) { exit 1 }" + +exit /b %errorlevel% diff --git a/TransactionProcessing.MerchantFileProcessor/NLog.config b/TransactionProcessing.MerchantFileProcessor/NLog.config index b035b34..1aab2da 100644 --- a/TransactionProcessing.MerchantFileProcessor/NLog.config +++ b/TransactionProcessing.MerchantFileProcessor/NLog.config @@ -10,16 +10,22 @@ - + maxArchiveFiles="2"> + + + + + + + diff --git a/TransactionProcessing.MerchantFileProcessor/Program.cs b/TransactionProcessing.MerchantFileProcessor/Program.cs index 11e78e1..48f5d2d 100644 --- a/TransactionProcessing.MerchantFileProcessor/Program.cs +++ b/TransactionProcessing.MerchantFileProcessor/Program.cs @@ -140,8 +140,9 @@ using (var scope = app.Services.CreateScope()) { - var startupLogger = scope.ServiceProvider.GetRequiredService>(); - SharedLogger.Initialise(startupLogger); + LogManager.Setup().LoadConfigurationFromFile("NLog.config"); + NLog.Logger logger = LogManager.GetLogger("merchantfileprocessor"); + SharedLogger.Initialise(logger, "merchantfileprocessor"); var serialiser = scope.ServiceProvider.GetRequiredService(); StringSerialiser.Initialise(serialiser); diff --git a/TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj b/TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj index 309c779..b9e4b2e 100644 --- a/TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj +++ b/TransactionProcessing.MerchantFileProcessor/TransactionProcessing.MerchantFileProcessor.csproj @@ -8,18 +8,18 @@ - - - - - + + + + + - - - - - - + + + + + + diff --git a/TransactionProcessing.MerchantPos/Program.cs b/TransactionProcessing.MerchantPos/Program.cs index 5685741..871323f 100644 --- a/TransactionProcessing.MerchantPos/Program.cs +++ b/TransactionProcessing.MerchantPos/Program.cs @@ -111,8 +111,9 @@ var db = scope.ServiceProvider.GetRequiredService(); await db.Database.EnsureCreatedAsync(); - var diLogger = scope.ServiceProvider.GetRequiredService>(); - Shared.Logger.Logger.Initialise(diLogger); + LogManager.Setup().LoadConfigurationFromFile("NLog.config"); + NLog.Logger dilogger = LogManager.GetLogger("MerchantPOS"); + Shared.Logger.Logger.Initialise(dilogger, "MerchantPOS"); var serialiser = scope.ServiceProvider.GetRequiredService(); StringSerialiser.Initialise(serialiser); diff --git a/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs b/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs index ffc12b5..62adef8 100644 --- a/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs +++ b/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs @@ -16,6 +16,7 @@ using TransactionProcessorACL.DataTransferObjects.Responses; using OperatorTotalRequest = TransactionProcessorACL.DataTransferObjects.OperatorTotalRequest; using TransactionProcessing.MerchantPos.Persistence; +using TransactionProcessor.DataTransferObjects.Responses.Merchant; namespace TransactionProcessing.MerchantPos.Runtime; @@ -88,7 +89,7 @@ public async Task SendLogon(MerchantConfig cfg, Int32 transactionNumber, CancellationToken cancellationToken) { - LogonTransactionRequestMessage logonTransactionRequest = new() { ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, TransactionDateTime = DateTime.Now, TransactionNumber = transactionNumber.ToString("D4") }; + LogonTransactionRequestMessage logonTransactionRequest = new() { ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, TransactionDateTime = DateTime.UtcNow, TransactionNumber = transactionNumber.ToString("D4") }; Result result = await this.SendTransactionRequest(logonTransactionRequest, "api/logontransactions", token, cancellationToken); @@ -218,8 +219,8 @@ public async Task SendDeposit(MerchantConfig cfg, CancellationToken cancellationToken) { var result = await this.TransactionProcessorClient.MakeMerchantDeposit(token.AccessToken, cfg.EstateId, cfg.MerchantId, new MakeMerchantDepositRequest { Amount = amount, - DepositDateTime = DateTime.Now, - Reference = $"AutoDeposit{DateTime.Now:yyyy-MM-dd}" + DepositDateTime = DateTime.UtcNow, + Reference = $"AutoDeposit{DateTime.UtcNow:yyyy-MM-dd}" }, cancellationToken); if (result.IsFailed) { @@ -237,7 +238,7 @@ public async Task SendReconciliation(MerchantConfig cfg, ReconciliationRequestMessage reconciliationRequest = new ReconciliationRequestMessage { ApplicationVersion = cfg.ApplicationVersion, - TransactionDateTime = DateTime.Now, + TransactionDateTime = DateTime.UtcNow, DeviceIdentifier = cfg.DeviceIdentifier, TransactionCount = totals.Sum(t=> t.TotalCount), TransactionValue = totals.Sum(t => t.Total), @@ -285,7 +286,7 @@ private async Task>> BuildBillPayment ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, ContractId = product.ContractId, - TransactionDateTime = DateTime.Now, + TransactionDateTime = DateTime.UtcNow, TransactionNumber = transactionNumber.ToString("D4") }; @@ -305,7 +306,7 @@ private async Task>> BuildBillPayment ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, ContractId = product.ContractId, - TransactionDateTime = DateTime.Now, + TransactionDateTime = DateTime.UtcNow, TransactionNumber = transactionNumber.ToString("D4") }; @@ -343,7 +344,7 @@ private Result> BuildMobileSaleTransactionRe ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, ContractId = product.ContractId, - TransactionDateTime = DateTime.Now, + TransactionDateTime = DateTime.UtcNow, TransactionNumber = transactionNumber.ToString("D4") }; @@ -365,7 +366,7 @@ private Result> BuildVoucherTransactionReque ApplicationVersion = cfg.ApplicationVersion, DeviceIdentifier = cfg.DeviceIdentifier, ContractId = product.ContractId, - TransactionDateTime = DateTime.Now, + TransactionDateTime = DateTime.UtcNow, TransactionNumber = transactionNumber.ToString("D4") }; @@ -408,7 +409,7 @@ private String BuildRequestUrl(String route) { var body = new { - due_date = DateTime.Now.AddDays(1), + due_date = DateTime.UtcNow.AddDays(1), amount = billAmount, account_number = accountNumber, account_name = $"Test Account {accountNumber}" @@ -431,7 +432,7 @@ private String BuildRequestUrl(String route) { String baseAddress = this.SettingsStore.Current.ApiConfiguration.TestHost; var body = new { - due_date = DateTime.Now.AddDays(1), + due_date = DateTime.UtcNow.AddDays(1), meter_number = meterNumber, customer_name = $"Customer {meterNumber}" }; diff --git a/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs b/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs index deab62d..32ecf91 100644 --- a/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs +++ b/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs @@ -159,7 +159,7 @@ private async Task RunMainLoop(MerchantConfig cfg, while (!token.IsCancellationRequested) { Merchant merchant = await this.Repository.GetMerchant(cfg.MerchantId) ?? throw new InvalidOperationException($"Merchant {cfg.MerchantId} was not found."); - DateTime currentTime = DateTime.Now; + DateTime currentTime = DateTime.UtcNow; MerchantResponse merchantConfig = cfg.Merchant ?? throw new InvalidOperationException($"Merchant details were not loaded for {cfg.MerchantName}."); (TimeSpan openingTime, TimeSpan closingTime) = GetTradingHours(cfg, merchantConfig, currentTime); @@ -178,7 +178,7 @@ private async Task RunMainLoop(MerchantConfig cfg, continue; } - DateTime now = DateTime.Now; + DateTime now = DateTime.UtcNow; if (merchant.LastLogonDateTime.Date != now.Date) { Result tokenResult = await this.GetUserToken(cfg, token); @@ -323,7 +323,7 @@ private async Task DoReconciliation(MerchantConfig cfg, CancellationToken cancel await ApiClient.SendReconciliation(cfg, userToken, totals, cancellationToken); // Clear totals - await this.Repository.UpdateLastEndOfDay(cfg.MerchantId, cfg.MerchantName, DateTime.Now); + await this.Repository.UpdateLastEndOfDay(cfg.MerchantId, cfg.MerchantName, DateTime.UtcNow); await Repository.ClearTotals(cfg.MerchantId); this.Metrics.SetLastEndOfDay(cfg.MerchantId); diff --git a/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj b/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj index 157de5c..ba75b25 100644 --- a/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj +++ b/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj @@ -8,17 +8,17 @@ - - - - + + + + - - - - - - + + + + + + diff --git a/TransactionProcessing.MerchantPos/nlog.config b/TransactionProcessing.MerchantPos/nlog.config index d513ca5..660a71c 100644 --- a/TransactionProcessing.MerchantPos/nlog.config +++ b/TransactionProcessing.MerchantPos/nlog.config @@ -8,16 +8,22 @@ - + maxArchiveFiles="2"> + + + + + + + diff --git a/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs b/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs index cb07ab7..937184b 100644 --- a/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs +++ b/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs @@ -13,12 +13,15 @@ using TransactionProcessor.DataTransferObjects; using TransactionProcessor.DataTransferObjects.Requests.Contract; using TransactionProcessor.DataTransferObjects.Requests.Estate; +using TransactionProcessor.DataTransferObjects.Requests.Float; using TransactionProcessor.DataTransferObjects.Requests.Merchant; using TransactionProcessor.DataTransferObjects.Requests.Operator; using TransactionProcessor.DataTransferObjects.Responses.Contract; using TransactionProcessor.DataTransferObjects.Responses.Estate; using TransactionProcessor.DataTransferObjects.Responses.Merchant; +using TransactionProcessor.DataTransferObjects.Responses.Operator; using TransactionProcessor.SystemSetupTool.estateconfig; +using TransactionProcessor.SystemSetupTool.identityserverconfig; using Address = TransactionProcessor.DataTransferObjects.Requests.Merchant.Address; using AssignOperatorRequest = TransactionProcessor.DataTransferObjects.Requests.Estate.AssignOperatorRequest; using Contact = TransactionProcessor.DataTransferObjects.Requests.Merchant.Contact; @@ -32,6 +35,7 @@ public class EstateSetupFunctions { private readonly ITransactionProcessorClient TransactionProcessorClient; private readonly Estate EstateConfig; + private readonly IdentityServerConfiguration IdentityServerConfiguration; private TokenResponse TokenResponse; @@ -39,10 +43,12 @@ public class EstateSetupFunctions { public EstateSetupFunctions(ISecurityServiceClient securityServiceClient, ITransactionProcessorClient transactionProcessorClient, - Estate estateConfig) { + Estate estateConfig, + IdentityServerConfiguration identityServerConfiguration) { this.SecurityServiceClient = securityServiceClient; this.TransactionProcessorClient = transactionProcessorClient; this.EstateConfig = estateConfig; + this.IdentityServerConfiguration = identityServerConfiguration; } public async Task SetupEstate(CancellationToken cancellationToken) { @@ -54,7 +60,6 @@ public async Task SetupEstate(CancellationToken cancellationToken) { return ResultHelpers.CreateFailure(createEstateResult); this.EstateId = createEstateResult.Data; - Result getEstateResult = await this.GetEstate(this.EstateId, cancellationToken); if (getEstateResult.IsFailed) return ResultHelpers.CreateFailure(createEstateResult); @@ -112,24 +117,13 @@ private async Task> GetEstate(Guid estateId, } private async Task> CreateEstate(CancellationToken cancellationToken) { - var estateResponse = await this.GetEstate(Guid.Parse(this.EstateConfig.Id), cancellationToken); - if (estateResponse.IsFailed && estateResponse.Status != ResultStatus.NotFound) - return ResultHelpers.CreateFailure(estateResponse); + CreateEstateRequest createEstateRequest = new CreateEstateRequest { EstateName = this.EstateConfig.Name }; - if (estateResponse.Status == ResultStatus.NotFound) { - // need to create the actual estate - // Create the estate - CreateEstateRequest createEstateRequest = new CreateEstateRequest { EstateId = Guid.Parse(this.EstateConfig.Id), EstateName = this.EstateConfig.Name }; - - var createResult = await this.TransactionProcessorClient.CreateEstate(this.TokenResponse.AccessToken, createEstateRequest, cancellationToken); - if (createResult.IsFailed) - return ResultHelpers.CreateFailure(createResult); - - return Result.Success(createEstateRequest.EstateId); - } + Result createResult = await this.TransactionProcessorClient.CreateEstate(this.TokenResponse.AccessToken, createEstateRequest, cancellationToken); + if (createResult.IsFailed) + return ResultHelpers.CreateFailure(createResult); - // Found the estate so just return the Guid - return Result.Success(estateResponse.Data.EstateId); + return Result.Success(createResult.Data); } private async Task CreateEstateUser(CancellationToken cancellationToken) { @@ -172,14 +166,14 @@ private async Task CreateOperators(CancellationToken cancellationToken) } CreateOperatorRequest createOperatorRequest = new CreateOperatorRequest { - OperatorId = Guid.NewGuid(), Name = @operator.Name, RequireCustomMerchantNumber = @operator.RequireCustomMerchantNumber, RequireCustomTerminalNumber = @operator.RequireCustomMerchantNumber, + Name = @operator.Name, RequireCustomMerchantNumber = @operator.RequireCustomMerchantNumber, RequireCustomTerminalNumber = @operator.RequireCustomMerchantNumber, }; - Result createResult = await this.TransactionProcessorClient.CreateOperator(this.TokenResponse.AccessToken, this.EstateId, createOperatorRequest, cancellationToken); + Result createResult = await this.TransactionProcessorClient.CreateOperator(this.TokenResponse.AccessToken, this.EstateId, createOperatorRequest, cancellationToken); if (createResult.IsFailed) return ResultHelpers.CreateFailure(createResult); // Now assign this to the estate - var assignResult = await this.TransactionProcessorClient.AssignOperatorToEstate(this.TokenResponse.AccessToken, this.EstateId, new AssignOperatorRequest { OperatorId = createOperatorRequest.OperatorId }, cancellationToken); + Result assignResult = await this.TransactionProcessorClient.AssignOperatorToEstate(this.TokenResponse.AccessToken, this.EstateId, new AssignOperatorRequest { OperatorId = createResult.Data }, cancellationToken); if (assignResult.IsFailed) return ResultHelpers.CreateFailure(assignResult); } @@ -290,31 +284,31 @@ private async Task CreateNewContract(EstateResponse estate, var @operator = estate.Operators.SingleOrDefault(o => o.Name == contract.OperatorName); CreateContractRequest createContractRequest = new CreateContractRequest { Description = contract.Description, OperatorId = @operator.OperatorId }; - Result createResult = await this.TransactionProcessorClient.CreateContract(this.TokenResponse.AccessToken, this.EstateId, createContractRequest, cancellationToken); + Result createResult = await this.TransactionProcessorClient.CreateContract(this.TokenResponse.AccessToken, this.EstateId, createContractRequest, cancellationToken); if (createResult.IsFailed) return ResultHelpers.CreateFailure(createResult); // Contract has been created, we now need to get it from the RM to get the contract Id - Result getContractIdResult = await GetContractId(contract.Description, cancellationToken); - if (getContractIdResult.IsFailed) - return ResultHelpers.CreateFailure(getContractIdResult); + //Result getContractIdResult = await GetContractId(contract.Description, cancellationToken); + //if (getContractIdResult.IsFailed) + // return ResultHelpers.CreateFailure(getContractIdResult); foreach (Product contractProduct in contract.Products) { AddProductToContractRequest addProductToContractRequest = new AddProductToContractRequest { DisplayText = contractProduct.DisplayText, ProductName = contractProduct.ProductName, Value = contractProduct.Value }; - Result addProductToContractResult = await this.TransactionProcessorClient.AddProductToContract(this.TokenResponse.AccessToken, this.EstateId, getContractIdResult.Data, addProductToContractRequest, cancellationToken); + Result addProductToContractResult = await this.TransactionProcessorClient.AddProductToContract(this.TokenResponse.AccessToken, this.EstateId, createResult.Data, addProductToContractRequest, cancellationToken); if (addProductToContractResult.IsFailed) return ResultHelpers.CreateFailure(addProductToContractResult); - Result contractProductIdResult = await GetContractProductId(getContractIdResult.Data, contractProduct.ProductName, cancellationToken); + Result contractProductIdResult = await GetContractProductId(createResult.Data, contractProduct.ProductName, cancellationToken); if (contractProductIdResult.IsFailed) return ResultHelpers.CreateFailure(contractProductIdResult); foreach (TransactionFee contractProductTransactionFee in contractProduct.TransactionFees) { AddTransactionFeeForProductToContractRequest addTransactionFeeForProductToContractRequest = new AddTransactionFeeForProductToContractRequest { Description = contractProductTransactionFee.Description, Value = contractProductTransactionFee.Value, CalculationType = (CalculationType)contractProductTransactionFee.CalculationType, FeeType = (FeeType)contractProductTransactionFee.FeeType }; - Result addTransactionFeeForProductToContractResult = await this.TransactionProcessorClient.AddTransactionFeeForProductToContract(this.TokenResponse.AccessToken, this.EstateId, getContractIdResult.Data, contractProductIdResult.Data, addTransactionFeeForProductToContractRequest, cancellationToken); + Result addTransactionFeeForProductToContractResult = await this.TransactionProcessorClient.AddTransactionFeeForProductToContract(this.TokenResponse.AccessToken, this.EstateId, createResult.Data, contractProductIdResult.Data, addTransactionFeeForProductToContractRequest, cancellationToken); if (addTransactionFeeForProductToContractResult.IsFailed) return ResultHelpers.CreateFailure(addTransactionFeeForProductToContractResult); @@ -328,7 +322,7 @@ private async Task CreateContracts(CancellationToken cancellationToken) var existingContractsResult= await this.TransactionProcessorClient.GetContracts(this.TokenResponse.AccessToken, this.EstateId, cancellationToken); if (existingContractsResult.IsFailed) return ResultHelpers.CreateFailure(existingContractsResult); - var estateResponse = await this.GetEstate(Guid.Parse(this.EstateConfig.Id), cancellationToken); + var estateResponse = await this.GetEstate(this.EstateId, cancellationToken); if (estateResponse.IsFailed) return ResultHelpers.CreateFailure(estateResponse); @@ -370,15 +364,14 @@ public async Task CreateMerchant(Merchant merchant, Contact = new Contact { ContactName = merchant.Contact.ContactName, EmailAddress = merchant.Contact.EmailAddress }, SettlementSchedule = settlementSchedule, CreatedDateTime = merchant.CreateDate, - MerchantId = merchant.MerchantId, }; - Result createMerchantResult = await this.TransactionProcessorClient.CreateMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest, cancellationToken); + Result createMerchantResult = await this.TransactionProcessorClient.CreateMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest, cancellationToken); if (createMerchantResult.IsFailed) return ResultHelpers.CreateFailure(createMerchantResult); // Now add devices AddMerchantDeviceRequest addMerchantDeviceRequest = new AddMerchantDeviceRequest { DeviceIdentifier = merchant.Device.DeviceIdentifier }; - var addDeviceResult = await this.TransactionProcessorClient.AddDeviceToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest.MerchantId.Value, addMerchantDeviceRequest, cancellationToken); + var addDeviceResult = await this.TransactionProcessorClient.AddDeviceToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantResult.Data, addMerchantDeviceRequest, cancellationToken); if (addDeviceResult.IsFailed) return ResultHelpers.CreateFailure(addDeviceResult); @@ -390,7 +383,7 @@ public async Task CreateMerchant(Merchant merchant, MiddleName = merchant.User.MiddleName, Password = ResolveUserPassword(merchant.User.Password) }; - var createMerchantUserResult = await this.TransactionProcessorClient.CreateMerchantUser(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest.MerchantId.Value, createMerchantUserRequest, cancellationToken); + var createMerchantUserResult = await this.TransactionProcessorClient.CreateMerchantUser(this.TokenResponse.AccessToken, this.EstateId, createMerchantResult.Data, createMerchantUserRequest, cancellationToken); if (createMerchantUserResult.IsFailed) return ResultHelpers.CreateFailure(createMerchantUserResult); @@ -401,7 +394,7 @@ public async Task CreateMerchant(Merchant merchant, foreach (var @operator in getEstateResult.Data.Operators) { TransactionProcessor.DataTransferObjects.Requests.Merchant.AssignOperatorRequest assignOperatorRequest = new() { OperatorId = @operator.OperatorId, MerchantNumber = null, TerminalNumber = null }; - Result assignOperatorToMerchantResult = await this.TransactionProcessorClient.AssignOperatorToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest.MerchantId.Value, assignOperatorRequest, cancellationToken); + Result assignOperatorToMerchantResult = await this.TransactionProcessorClient.AssignOperatorToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantResult.Data, assignOperatorRequest, cancellationToken); if (assignOperatorToMerchantResult.IsFailed) return ResultHelpers.CreateFailure(assignOperatorToMerchantResult); } @@ -413,7 +406,7 @@ public async Task CreateMerchant(Merchant merchant, // Now contracts foreach (ContractResponse contractResponse in getContractsResult.Data) { AddMerchantContractRequest addMerchantContractRequest = new() { ContractId = contractResponse.ContractId }; - var addContractToMerchantResult = await this.TransactionProcessorClient.AddContractToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantRequest.MerchantId.Value, addMerchantContractRequest, cancellationToken); + var addContractToMerchantResult = await this.TransactionProcessorClient.AddContractToMerchant(this.TokenResponse.AccessToken, this.EstateId, createMerchantResult.Data, addMerchantContractRequest, cancellationToken); if (addContractToMerchantResult.IsFailed) return ResultHelpers.CreateFailure(addContractToMerchantResult); } @@ -430,7 +423,7 @@ private async Task UpdateMerchant(Merchant merchant, return ResultHelpers.CreateFailure(ensureDeviceResult); } - var ensureUserResult = await EnsureMerchantUserAsync(merchant, cancellationToken); + var ensureUserResult = await EnsureMerchantUserAsync(merchant, existingMerchant, cancellationToken); if (ensureUserResult.IsFailed) { return ResultHelpers.CreateFailure(ensureUserResult); @@ -463,9 +456,13 @@ private async Task EnsureMerchantDeviceAsync(Merchant merchant, Merchant return addDeviceToMerchantResult.IsFailed ? ResultHelpers.CreateFailure(addDeviceToMerchantResult) : Result.Success(); } - private async Task EnsureMerchantUserAsync(Merchant merchant, CancellationToken cancellationToken) - { - var userResult = await this.SecurityServiceClient.GetUsers(merchant.User.EmailAddress, cancellationToken); + private async Task EnsureMerchantUserAsync(Merchant merchant, MerchantResponse existingMerchant, CancellationToken cancellationToken) { + var managementTokenResult = await this.SecurityServiceClient.GetToken(this.IdentityServerConfiguration.managementclientid, this.IdentityServerConfiguration.managementclientsecret, cancellationToken); + + if (managementTokenResult.IsFailed) + return Result.Failure("Error getting management token"); + + var userResult = await this.SecurityServiceClient.GetUsers(managementTokenResult.Data.AccessToken, merchant.User.EmailAddress, cancellationToken); if (userResult.IsFailed) { return ResultHelpers.CreateFailure(userResult); @@ -483,7 +480,7 @@ private async Task EnsureMerchantUserAsync(Merchant merchant, Cancellati MiddleName = merchant.User.MiddleName, Password = merchant.User.Password }; - var createMerchantUserResult = await this.TransactionProcessorClient.CreateMerchantUser(this.TokenResponse.AccessToken, this.EstateId, merchant.MerchantId, createMerchantUserRequest, cancellationToken); + var createMerchantUserResult = await this.TransactionProcessorClient.CreateMerchantUser(this.TokenResponse.AccessToken, this.EstateId, existingMerchant.MerchantId, createMerchantUserRequest, cancellationToken); return createMerchantUserResult.IsFailed ? ResultHelpers.CreateFailure(createMerchantUserResult) : Result.Success(); } @@ -580,12 +577,12 @@ private async Task CreateFloats(CancellationToken cancellationToken) { if (getOperatorsResult.IsFailed) return ResultHelpers.CreateFailure(getOperatorsResult); - foreach (var operatorResponse in getOperatorsResult.Data) + foreach (OperatorResponse operatorResponse in getOperatorsResult.Data) { // Create the required floats - CreateFloatRequest request = new CreateFloatRequest { FloatId = operatorResponse.OperatorId, CreateDateTime = DateTime.Now }; + CreateFloatRequest request = new CreateFloatRequest { OperatorId = operatorResponse.OperatorId, CreateDateTime = DateTime.Now }; - Result createFloatResult = await this.TransactionProcessorClient.CreateFloat(this.TokenResponse.AccessToken, this.EstateId, request, cancellationToken); + Result createFloatResult = await this.TransactionProcessorClient.CreateFloat(this.TokenResponse.AccessToken, this.EstateId, request, cancellationToken); if (createFloatResult.IsFailed) return ResultHelpers.CreateFailure(createFloatResult); } diff --git a/TransactionProcessor.SystemSetupTool/IdentityServerFunctions.cs b/TransactionProcessor.SystemSetupTool/IdentityServerFunctions.cs index 78911e6..6508212 100644 --- a/TransactionProcessor.SystemSetupTool/IdentityServerFunctions.cs +++ b/TransactionProcessor.SystemSetupTool/IdentityServerFunctions.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.EntityFrameworkCore.Storage; +using System; using System.Collections.Generic; using System.Linq; using System.Threading; @@ -16,13 +17,26 @@ public class IdentityServerFunctions{ private readonly IdentityServerConfiguration identityServerConfiguration; + private TokenResponse ManagmementToken; + public IdentityServerFunctions(ISecurityServiceClient securityServiceClient, IdentityServerConfiguration configuration){ this.SecurityServiceClient = securityServiceClient; this.identityServerConfiguration = configuration; } + private async Task GetManagementToken(CancellationToken cancellationToken) { + var result = await this.SecurityServiceClient.GetToken(this.identityServerConfiguration.managementclientid, this.identityServerConfiguration.managementclientsecret, cancellationToken); + + if (result.IsFailed) + return Result.Failure("Error getting management token"); + + this.ManagmementToken = result.Data; + + return Result.Success(); + } + private async Task CreateRoles(CancellationToken cancellationToken) { - Result> rolesResult = await this.SecurityServiceClient.GetRoles(cancellationToken); + Result> rolesResult = await this.SecurityServiceClient.GetRoles(this.ManagmementToken.AccessToken, cancellationToken); if (rolesResult.IsFailed) return ResultHelpers.CreateFailure(rolesResult); @@ -43,7 +57,7 @@ private async Task CreateRoles(CancellationToken cancellationToken) { } private async Task CreateApiResources(CancellationToken cancellationToken) { - var apiResourcesResult = await this.SecurityServiceClient.GetApiResources(cancellationToken); + var apiResourcesResult = await this.SecurityServiceClient.GetApiResources(this.ManagmementToken.AccessToken, cancellationToken); if (apiResourcesResult.IsFailed) return ResultHelpers.CreateFailure(apiResourcesResult); @@ -62,7 +76,7 @@ private async Task CreateApiResources(CancellationToken cancellationToke } private async Task CreateIdentityResources(CancellationToken cancellationToken) { - var identityResourcesResult = await this.SecurityServiceClient.GetIdentityResources(cancellationToken); + var identityResourcesResult = await this.SecurityServiceClient.GetIdentityResources(this.ManagmementToken.AccessToken, cancellationToken); if (identityResourcesResult.IsFailed) return ResultHelpers.CreateFailure(identityResourcesResult); @@ -82,7 +96,7 @@ private async Task CreateIdentityResources(CancellationToken cancellatio } private async Task CreateClients(CancellationToken cancellationToken) { - var clientsResult = await this.SecurityServiceClient.GetClients(cancellationToken); + var clientsResult = await this.SecurityServiceClient.GetClients(this.ManagmementToken.AccessToken, cancellationToken); if (clientsResult.IsFailed) return ResultHelpers.CreateFailure(clientsResult); @@ -102,7 +116,7 @@ private async Task CreateClients(CancellationToken cancellationToken) { } private async Task CreateApiScopes(CancellationToken cancellationToken) { - var apiScopesResult = await this.SecurityServiceClient.GetApiScopes(cancellationToken); + var apiScopesResult = await this.SecurityServiceClient.GetApiScopes(this.ManagmementToken.AccessToken, cancellationToken); if (apiScopesResult.IsFailed) return ResultHelpers.CreateFailure(apiScopesResult); var apiScopes = apiScopesResult.Data; @@ -121,6 +135,10 @@ private async Task CreateApiScopes(CancellationToken cancellationToken) public async Task CreateConfig(CancellationToken cancellationToken) { + var managementTokenResult = await this.GetManagementToken(cancellationToken); + if (managementTokenResult.IsFailed) + return managementTokenResult; + Result createRolesResult = await this.CreateRoles(cancellationToken); if (createRolesResult.IsFailed) return createRolesResult; @@ -140,7 +158,7 @@ public async Task CreateConfig(CancellationToken cancellationToken) { Result createApiScopesResult = await this.CreateApiScopes(cancellationToken); if (createApiScopesResult.IsFailed) return createApiScopesResult; - + return Result.Success(); } @@ -150,7 +168,7 @@ private async Task CreateRole(String role, CancellationToken cancellatio RoleName = role }; - return await this.SecurityServiceClient.CreateRole(createRoleRequest, cancellationToken); + return await this.SecurityServiceClient.CreateRole(this.ManagmementToken.AccessToken, createRoleRequest, cancellationToken); } private async Task CreateApiScope(ApiScope apiscope, @@ -159,11 +177,11 @@ private async Task CreateApiScope(ApiScope apiscope, CreateApiScopeRequest createApiScopeRequest = new CreateApiScopeRequest { Description = apiscope.description, - DisplayName = apiscope.display_name, + DisplayName = apiscope.displayName, Name = apiscope.name }; - return await this.SecurityServiceClient.CreateApiScope(createApiScopeRequest, cancellationToken); + return await this.SecurityServiceClient.CreateApiScope(this.ManagmementToken.AccessToken, createApiScopeRequest, cancellationToken); } private async Task CreateIdentityResource(IdentityResource identityResource, @@ -173,14 +191,14 @@ private async Task CreateIdentityResource(IdentityResource identityResou { Claims = identityResource.claims, Description = identityResource.description, - DisplayName = identityResource.displayName, + DisplayName = identityResource.display_name, Emphasize = identityResource.emphasize, Name = identityResource.name, Required = identityResource.required, ShowInDiscoveryDocument = identityResource.showInDiscoveryDocument }; - return await this.SecurityServiceClient.CreateIdentityResource(createIdentityResourceRequest, cancellationToken); + return await this.SecurityServiceClient.CreateIdentityResource(this.ManagmementToken.AccessToken, createIdentityResourceRequest, cancellationToken); } private async Task CreateClient(identityserverconfig.Client client, CancellationToken cancellationToken) @@ -198,7 +216,7 @@ private async Task CreateClient(identityserverconfig.Client client, Canc RequireConsent = client.require_consent.GetValueOrDefault(false), Secret = client.secret }; - return await this.SecurityServiceClient.CreateClient(createClientRequest, cancellationToken); + return await this.SecurityServiceClient.CreateClient(this.ManagmementToken.AccessToken, createClientRequest, cancellationToken); } private async Task CreateApiResource(ApiResource apiResource, @@ -214,6 +232,6 @@ private async Task CreateApiResource(ApiResource apiResource, UserClaims = apiResource.user_claims }; - return await this.SecurityServiceClient.CreateApiResource(createApiResourceRequest, cancellationToken); + return await this.SecurityServiceClient.CreateApiResource(this.ManagmementToken.AccessToken, createApiResourceRequest, cancellationToken); } } \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/Program.cs b/TransactionProcessor.SystemSetupTool/Program.cs index 80e8204..70381b5 100644 --- a/TransactionProcessor.SystemSetupTool/Program.cs +++ b/TransactionProcessor.SystemSetupTool/Program.cs @@ -83,7 +83,7 @@ static async Task Main(string[] args) { Result result = setupMode switch { Mode.SecuritySetup => await identityServerFunctions.CreateConfig(cancellationToken), Mode.EventStoreSetup => await eventStoreFunctions.SetupEventStore(cancellationToken), - Mode.EstateSetup => await SetupEstates(configFileName,cancellationToken), + Mode.EstateSetup => await SetupEstates(configFileName, identityServerConfiguration, cancellationToken), Mode.FileProcessorSetup => await SetupFileProcessors(fileProcessingOptions, cancellationToken), _ => Result.Invalid($"Invalid mode {setupMode}") }; @@ -129,10 +129,10 @@ static Object Deserialise(String arg, Type type) return StringSerialiser.DeserializeObject(arg, type, new SerialiserOptions(SerialiserPropertyFormat.SnakeCase)); } - private static async Task SetupEstates(String configFileName, CancellationToken cancellationToken) { + private static async Task SetupEstates(String configFileName, IdentityServerConfiguration identityServerConfiguration, CancellationToken cancellationToken) { EstateConfig estateConfiguration = await GetEstatesConfig(configFileName, cancellationToken); foreach (Estate estate in estateConfiguration.Estates) { - EstateSetupFunctions estateSetup = new(Program.SecurityServiceClient, Program.TransactionProcessorClient, estate); + EstateSetupFunctions estateSetup = new(Program.SecurityServiceClient, Program.TransactionProcessorClient, estate, identityServerConfiguration); Result result = await estateSetup.SetupEstate(cancellationToken); if (result.IsFailed) return ResultHelpers.CreateFailure(result); diff --git a/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj b/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj index 68cd0b9..15415c9 100644 --- a/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj +++ b/TransactionProcessor.SystemSetupTool/TransactionProcessor.SystemSetupTool.csproj @@ -21,14 +21,14 @@ - - - - - - - - + + + + + + + + diff --git a/TransactionProcessor.SystemSetupTool/estateconfig/Estate.cs b/TransactionProcessor.SystemSetupTool/estateconfig/Estate.cs index 1167b78..139390a 100644 --- a/TransactionProcessor.SystemSetupTool/estateconfig/Estate.cs +++ b/TransactionProcessor.SystemSetupTool/estateconfig/Estate.cs @@ -4,16 +4,10 @@ public class Estate { - public string Id { get; set; } - public string Name { get; set; } - public User User { get; set; } - public List Merchants { get; set; } - public List Operators { get; set; } - public List Contracts { get; set; } } } \ No newline at end of file diff --git a/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs b/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs index 8131852..8f6430f 100644 --- a/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs +++ b/TransactionProcessor.SystemSetupTool/estateconfig/Merchant.cs @@ -3,8 +3,6 @@ using System; public class Merchant { - public Guid MerchantId { get; set; } - public DateTime CreateDate { get; set; } public String Name { get; set; } diff --git a/TransactionProcessor.SystemSetupTool/identityserverconfig.json b/TransactionProcessor.SystemSetupTool/identityserverconfig.json index eb5e438..f1ef753 100644 --- a/TransactionProcessor.SystemSetupTool/identityserverconfig.json +++ b/TransactionProcessor.SystemSetupTool/identityserverconfig.json @@ -1,4 +1,6 @@ { + "managementclientid": "management-bootstrap", + "managementclientsecret": "a7c92e4f1b6d4380a5e3f9c2d81b6074", "roles": [ "Estate", "Merchant", @@ -53,7 +55,7 @@ "name": "estateReporting", "display_name": "Estate Reporting REST", "description": "API Resource representing Estate Reporting REST", - "scopes": [ "estateReporting" ], + "scopes": [ "estateReporting.all" ], "user_claims": null }, { @@ -61,7 +63,7 @@ "name": "messagingService", "display_name": "Messaging REST", "description": "API Resource representing Messaging Service REST", - "scopes": [ "messagingService" ], + "scopes": [ "messagingService.all" ], "user_claims": null }, { @@ -69,7 +71,7 @@ "name": "transactionProcessor", "display_name": "Transaction Processor REST", "description": "API Resource representing Transaction Processor REST", - "scopes": [ "transactionProcessor" ], + "scopes": [ "transactionProcessor.all" ], "user_claims": [ "merchantId", "estateId", "role" ] }, { @@ -77,7 +79,7 @@ "name": "transactionProcessorACL", "display_name": "Transaction Processor ACL REST", "description": "API Resource representing Transaction Processor ACL REST", - "scopes": [ "transactionProcessorACL" ], + "scopes": [ "transactionProcessorACL.all" ], "user_claims": [ "merchantId", "estateId", "role" ] }, { @@ -85,7 +87,7 @@ "name": "fileProcessor", "display_name": "File Processor REST", "description": "API Resource representing File Processor REST", - "scopes": [ "fileProcessor" ], + "scopes": [ "fileProcessor.all" ], "user_claims": null } ], @@ -95,7 +97,7 @@ "secret": "", "client_name": "Service Client", "client_description": "Client for use in inter service communications", - "allowed_scopes": [ "transactionProcessorACL", "transactionProcessor", "estateReporting", "messagingService", "fileProcessor" ], + "allowed_scopes": [ "transactionProcessorACL.all", "transactionProcessor.all", "estateReporting.all", "messagingService.all", "fileProcessor.all" ], "allowed_grant_types": [ "client_credentials" ] }, { @@ -103,7 +105,7 @@ "secret": "", "client_name": "Management UI App Client", "client_description": "Client for use by management app", - "allowed_scopes": [ "fileProcessor", "transactionProcessor", "openid", "email", "profile" ], + "allowed_scopes": [ "fileProcessor.all", "transactionProcessor.all", "openid", "email", "profile" ], "allowed_grant_types": [ "hybrid", "password" @@ -124,7 +126,7 @@ "secret": "", "client_name": "Mobile App Client", "client_description": "Client for use by mobile app to process transactions", - "allowed_scopes": [ "transactionProcessorACL" ], + "allowed_scopes": [ "transactionProcessorACL.all" ], "allowed_grant_types": [ "password" ] @@ -133,38 +135,28 @@ "apiscopes": [ { "description": "Scope for Estate Reporting REST", - "displayName": "Estate Reporting REST", - "name": "estateReporting" + "display_name": "Estate Reporting REST", + "name": "estateReporting.all" }, { "description": "Scope for Messaging REST", - "displayName": "Messaging REST", - "name": "messagingService" + "display_name": "Messaging REST", + "name": "messagingService.all" }, { "description": "Scope for Transaction Processor REST", - "displayName": "Transaction Processor REST", - "name": "transactionProcessor" + "display_name": "Transaction Processor REST", + "name": "transactionProcessor.all" }, { "description": "Scope for Transaction Processor ACL REST", - "displayName": "Transaction Processor ACL REST", - "name": "transactionProcessorACL" - }, - { - "description": "Scope for Voucher Management REST", - "displayName": "Voucher Management REST", - "name": "voucherManagement" - }, - { - "description": "Scope for Voucher Management ACL REST", - "displayName": "Voucher Management ACL REST", - "name": "voucherManagementACL" + "display_name": "Transaction Processor ACL REST", + "name": "transactionProcessorACL.all" }, { "description": "Scope for File Processor REST", - "displayName": "File Processor REST", - "name": "fileProcessor" + "display_name": "File Processor REST", + "name": "fileProcessor.all" } ] diff --git a/TransactionProcessor.SystemSetupTool/identityserverconfig/ApiScope.cs b/TransactionProcessor.SystemSetupTool/identityserverconfig/ApiScope.cs index 2cb2803..463812e 100644 --- a/TransactionProcessor.SystemSetupTool/identityserverconfig/ApiScope.cs +++ b/TransactionProcessor.SystemSetupTool/identityserverconfig/ApiScope.cs @@ -4,7 +4,7 @@ public class ApiScope { public string description { get; set; } - public string display_name { get; set; } + public string displayName { get; set; } public string name { get; set; } } diff --git a/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityResource.cs b/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityResource.cs index 4079b10..c50a543 100644 --- a/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityResource.cs +++ b/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityResource.cs @@ -6,7 +6,7 @@ public class IdentityResource { public string name { get; set; } public string description { get; set; } - public string displayName { get; set; } + public string display_name { get; set; } public bool emphasize { get; set; } public bool required { get; set; } public bool showInDiscoveryDocument { get; set; } diff --git a/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityServerConfiguration.cs b/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityServerConfiguration.cs index 90424b1..c2614d1 100644 --- a/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityServerConfiguration.cs +++ b/TransactionProcessor.SystemSetupTool/identityserverconfig/IdentityServerConfiguration.cs @@ -5,6 +5,8 @@ public class IdentityServerConfiguration { + public string managementclientsecret { get; set; } + public string managementclientid { get; set; } public List identityresources { get; set; } public List apiresources { get; set; } public List clients { get; set; } diff --git a/TransactionProcessor.SystemSetupTool/setupconfig.json b/TransactionProcessor.SystemSetupTool/setupconfig.json index 2d97f13..b2c4b64 100644 --- a/TransactionProcessor.SystemSetupTool/setupconfig.json +++ b/TransactionProcessor.SystemSetupTool/setupconfig.json @@ -1,7 +1,6 @@ { "estates": [ { - "id": "435613AC-A468-47A3-AC4F-649D89764C22", "name": "Development Estate", "email_address": "estateuser@devestate1.co.uk", "user": { @@ -13,8 +12,7 @@ }, "merchants": [ { - "merchant_id": "AB1C99FB-1C6C-4694-9A32-B71BE5D1DA33", - "name": "Test Merchant 1", + "name": "Development Merchant 1", "settlement_schedule": "Weekly", "address": { "address_line1": "test address line 1", @@ -24,7 +22,7 @@ "postcode": "AB12 3CD" }, "contact": { - "contact_name": "Test Contact", + "contact_name": "Development Contact", "email_address": "stuart_ferguson1@outlook.com" }, "operators": [ @@ -34,14 +32,14 @@ "PataPawa PrePay" ], "user": { - "email_address": "merchantuser@testmerchant1.co.uk", + "email_address": "merchantuser@devmerchant1.co.uk", "password": "", - "given_name": "Test Merchant 1", + "given_name": "Development Merchant 1", "middle_name": "", "family_name": "User" }, "device": { - "device_identifier": "testmerchant1device" + "device_identifier": "devmerchant1device" }, "create_date": "2022-08-31" } From 0124e0abce620f184ff3273da286dd8769f36a93 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Sat, 7 Nov 2026 08:48:22 +0000 Subject: [PATCH 2/2] :| --- TransactionProcessing.MerchantFileProcessor/NLog.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/TransactionProcessing.MerchantFileProcessor/NLog.config b/TransactionProcessing.MerchantFileProcessor/NLog.config index 1aab2da..30eda84 100644 --- a/TransactionProcessing.MerchantFileProcessor/NLog.config +++ b/TransactionProcessing.MerchantFileProcessor/NLog.config @@ -38,7 +38,7 @@ - - + +