From 5f976b9acaa52811d7dff4740c2f434db29e3134 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Wed, 26 Aug 2026 13:07:39 +0100 Subject: [PATCH] Resolve Codacy warning backlog --- SqlServerAgentJobDeploymentTool/MainForm.cs | 2 +- StreamManagement/Form1.cs | 5 +- StreamManagementTool/Program.cs | 6 +-- .../Clients/SharedAccessTokenProvider.cs | 4 +- .../Models/Entities.cs | 2 +- .../Persistence/EfRepository.cs | 2 +- .../Runtime/ApiClient.cs | 32 +++++++------ .../Runtime/MerchantConfig.cs | 16 +++---- .../Runtime/MerchantRuntime.cs | 47 ++++++++++++++----- .../Runtime/Product.cs | 8 ++-- .../TransactionProcessing.MerchantPos.csproj | 1 - .../DataGenerator/Program.cs | 22 ++++----- .../Extensions.cs | 4 +- .../IdGenerationService.cs | 12 +++-- .../TraceEventArgs.cs | 4 +- .../TransactionDataGeneratorService.cs | 26 +++++----- .../Startup.cs | 11 +---- ...TransactionProcessor.HealthChecksUI.csproj | 1 + .../EstateSetupFunctions.cs | 2 +- .../EventStoreFunctions.cs | 2 +- .../Program.cs | 14 +----- 21 files changed, 112 insertions(+), 111 deletions(-) diff --git a/SqlServerAgentJobDeploymentTool/MainForm.cs b/SqlServerAgentJobDeploymentTool/MainForm.cs index 99e2efa..a07328d 100644 --- a/SqlServerAgentJobDeploymentTool/MainForm.cs +++ b/SqlServerAgentJobDeploymentTool/MainForm.cs @@ -791,7 +791,7 @@ private string BuildConnectionString() DataSource = server, InitialCatalog = database, Encrypt = _useSslCheckBox.Checked, - TrustServerCertificate = _useSslCheckBox.Checked + TrustServerCertificate = false }; if (IsSqlAuthenticationSelected()) diff --git a/StreamManagement/Form1.cs b/StreamManagement/Form1.cs index 76c60a6..515770d 100644 --- a/StreamManagement/Form1.cs +++ b/StreamManagement/Form1.cs @@ -23,13 +23,14 @@ private async void Form1_Load(object sender, EventArgs e) private static async Task> LoadStreamConfig(CancellationToken cancellationToken) { // Read the identity server config json string - String streamConfigurationJsonData = null; + String streamConfigurationJsonData; using (StreamReader sr = new StreamReader("streamconfiguration.json")) { streamConfigurationJsonData = await sr.ReadToEndAsync(cancellationToken); } - StreamConfigurationList streamConfiguration = JsonSerializer.Deserialize(streamConfigurationJsonData); + StreamConfigurationList streamConfiguration = JsonSerializer.Deserialize(streamConfigurationJsonData) + ?? throw new InvalidOperationException("Stream configuration file did not contain valid JSON."); return streamConfiguration.StreamConfiguration; } diff --git a/StreamManagementTool/Program.cs b/StreamManagementTool/Program.cs index 1bada17..345dff1 100644 --- a/StreamManagementTool/Program.cs +++ b/StreamManagementTool/Program.cs @@ -48,14 +48,14 @@ await client.SetStreamMetadataAsync( private static async Task> LoadStreamConfig(CancellationToken cancellationToken) { // Read the identity server config json string - String streamConfigurationJsonData = null; + String streamConfigurationJsonData; using (StreamReader sr = new StreamReader("streammanagementconfiguration.json")) { streamConfigurationJsonData = await sr.ReadToEndAsync(cancellationToken); } - StreamConfigurationList streamConfiguration = JsonSerializer.Deserialize(streamConfigurationJsonData); - + StreamConfigurationList streamConfiguration = JsonSerializer.Deserialize(streamConfigurationJsonData) + ?? throw new InvalidOperationException("Stream configuration file did not contain valid JSON."); return streamConfiguration.StreamConfiguration; } } diff --git a/TransactionProcessing.MerchantFileProcessor/Clients/SharedAccessTokenProvider.cs b/TransactionProcessing.MerchantFileProcessor/Clients/SharedAccessTokenProvider.cs index 8112e68..e4e257b 100644 --- a/TransactionProcessing.MerchantFileProcessor/Clients/SharedAccessTokenProvider.cs +++ b/TransactionProcessing.MerchantFileProcessor/Clients/SharedAccessTokenProvider.cs @@ -21,7 +21,7 @@ public async Task> GetAccessToken(CancellationToken cancella { if (IsTokenValid(this.currentToken)) { - return Result.Success(this.currentToken); + return Result.Success(this.currentToken!); } await this.refreshLock.WaitAsync(cancellationToken); @@ -30,7 +30,7 @@ public async Task> GetAccessToken(CancellationToken cancella { if (IsTokenValid(this.currentToken)) { - return Result.Success(this.currentToken); + return Result.Success(this.currentToken!); } var tokenResult = await this.RequestToken(cancellationToken); diff --git a/TransactionProcessing.MerchantPos/Models/Entities.cs b/TransactionProcessing.MerchantPos/Models/Entities.cs index 64a5938..d500873 100644 --- a/TransactionProcessing.MerchantPos/Models/Entities.cs +++ b/TransactionProcessing.MerchantPos/Models/Entities.cs @@ -7,7 +7,7 @@ public class Merchant { [Key] public Guid MerchantId { get; set; } - public String MerchantName { get; set; } + public String MerchantName { get; set; } = String.Empty; public Decimal Balance { get; set; } public DateTime LastEndOfDayDateTime { get; set; } public DateTime LastLogonDateTime { get; set; } diff --git a/TransactionProcessing.MerchantPos/Persistence/EfRepository.cs b/TransactionProcessing.MerchantPos/Persistence/EfRepository.cs index a010e36..917cfa4 100644 --- a/TransactionProcessing.MerchantPos/Persistence/EfRepository.cs +++ b/TransactionProcessing.MerchantPos/Persistence/EfRepository.cs @@ -14,7 +14,7 @@ public interface IEfRepository Task UpdateTotals(Guid merchantId, Guid operatorId, Guid contractId, Decimal amount); Task> GetTotals(Guid merchantId); Task ClearTotals(Guid merchantId); - Task GetMerchant(Guid merchantId); + Task GetMerchant(Guid merchantId); Task IncrementTransactionNumber(Guid merchantId, String merchantName); } diff --git a/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs b/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs index 716a697..472adbb 100644 --- a/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs +++ b/TransactionProcessing.MerchantPos/Runtime/ApiClient.cs @@ -119,9 +119,10 @@ public async Task>> GetProductList(MerchantConfig cfg, return ResultHelpers.CreateFailure(result); } - Logger.LogInformation($"{result.Data.Count} for merchant requested successfully"); + List contracts = result.Data ?? []; + Logger.LogInformation($"{contracts.Count} for merchant requested successfully"); - foreach (ContractResponseX contractResponse in result.Data) { + foreach (ContractResponseX contractResponse in contracts) { foreach (ContractProductX contractResponseProduct in contractResponse.Products) { products.Add(new Product { ContractId = contractResponse.ContractId, @@ -268,6 +269,7 @@ private async Task>> BuildBillPayment Result<(String accountNumber, String accountName, String mobileNumber)> extraDetails = product.ProductSubType switch { ProductSubType.BillPaymentPostPay => await this.CreateBillPaymentBill(value, CancellationToken.None), ProductSubType.BillPaymentPrePay => await this.CreateBillPaymentMeter(CancellationToken.None), + _ => throw new InvalidOperationException($"Unsupported product subtype {product.ProductSubType}"), }; if (extraDetails.IsFailed) { @@ -397,7 +399,7 @@ private String BuildRequestUrl(String route) { return requestUri; } - private async Task> CreateBillPaymentBill(Decimal billAmount, CancellationToken cancellationToken) + private async Task> CreateBillPaymentBill(Decimal billAmount, CancellationToken cancellationToken) { Int32 accountNumber = RandomNumberGenerator.GetInt32(1, 100000); String baseAddress = this.SettingsStore.Current.ApiConfiguration.TestHost; @@ -439,7 +441,7 @@ private String BuildRequestUrl(String route) { return ResultHelpers.CreateFailure(result); } - return Result.Success<(String, String, String?)>((body.meter_number.ToString(), body.customer_name, null)); + return Result.Success((body.meter_number.ToString(), body.customer_name, "07777777705")); } } @@ -453,7 +455,7 @@ public class ContractResponseX public int ContractReportingId { get; set; } [JsonProperty("description")] - public string Description { get; set; } + public string Description { get; set; } = string.Empty; [JsonProperty("estate_id")] public Guid EstateId { get; set; } @@ -465,19 +467,19 @@ public class ContractResponseX public Guid OperatorId { get; set; } [JsonProperty("operator_name")] - public string OperatorName { get; set; } + public string OperatorName { get; set; } = string.Empty; [JsonProperty("products")] - public List Products { get; set; } + public List Products { get; set; } = []; } public class ContractProductX { [JsonProperty("display_text")] - public string DisplayText { get; set; } + public string DisplayText { get; set; } = string.Empty; [JsonProperty("name")] - public string Name { get; set; } + public string Name { get; set; } = string.Empty; [JsonProperty("product_id")] public Guid ProductId { get; set; } @@ -486,7 +488,7 @@ public class ContractProductX public int ProductReportingId { get; set; } [JsonProperty("transaction_fees")] - public List TransactionFees { get; set; } + public List TransactionFees { get; set; } = []; [JsonProperty("value")] public Decimal? Value { get; set; } @@ -504,7 +506,7 @@ public class ContractProductTransactionFeeX public FeeType FeeType { get; set; } [JsonProperty("description")] - public string Description { get; set; } + public string Description { get; set; } = string.Empty; [JsonProperty("transaction_fee_id")] public Guid TransactionFeeId { get; set; } @@ -536,17 +538,17 @@ public class MerchantResponse public Guid MerchantId { get; set; } [JsonProperty("merchant_name")] - public string MerchantName { get; set; } + public string MerchantName { get; set; } = string.Empty; [JsonProperty("opening_hours")] - public Dictionary OpeningHours { get; set; } + public Dictionary OpeningHours { get; set; } = []; } public class OpeningHoursResponse { [JsonProperty("opening")] - public string Opening { get; set; } + public string Opening { get; set; } = string.Empty; [JsonProperty("closing")] - public string Closing { get; set; } + public string Closing { get; set; } = string.Empty; } diff --git a/TransactionProcessing.MerchantPos/Runtime/MerchantConfig.cs b/TransactionProcessing.MerchantPos/Runtime/MerchantConfig.cs index 677bb73..2196f13 100644 --- a/TransactionProcessing.MerchantPos/Runtime/MerchantConfig.cs +++ b/TransactionProcessing.MerchantPos/Runtime/MerchantConfig.cs @@ -5,11 +5,11 @@ public class MerchantConfig public bool Enabled { get; set; } = false; // new flag public Guid EstateId { get; set; } public Guid MerchantId { get; set; } - public string MerchantName { get; set; } - public string Username { get; set; } - public string Password { get; set; } - public string DeviceIdentifier { get; set; } - public string ApplicationVersion { get; set; } + public string MerchantName { get; set; } = string.Empty; + public string Username { get; set; } = string.Empty; + public string Password { get; set; } = string.Empty; + public string DeviceIdentifier { get; set; } = string.Empty; + public string ApplicationVersion { get; set; } = string.Empty; public int SaleIntervalSeconds { get; set; } = 30; public double FailureInjectionProbability { get; set; } = 0.02; @@ -19,7 +19,7 @@ public class MerchantConfig public TimeOnly ClosingTime { get; set; } = new(23, 50); public TimeOnly OpeningTime { get; set; } = new(8, 0); - public List Products { get; set; } + public List Products { get; set; } = []; public Boolean RequiresEndOfDay { get; set; } = true; - public MerchantResponse Merchant { get; set; } -} \ No newline at end of file + public MerchantResponse Merchant { get; set; } = null!; +} diff --git a/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs b/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs index afa6fbc..7cd3ed0 100644 --- a/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs +++ b/TransactionProcessing.MerchantPos/Runtime/MerchantRuntime.cs @@ -25,10 +25,10 @@ public MerchantRuntime(IApiClient apiClient, this.Metrics = metrics; } - private TokenResponse CurrentServiceToken; - private TokenResponse CurrentUserToken; - private (String clientId, String clientSecret) ServiceClientCredentials; - private (String clientId, String clientSecret) PosClientCredentials; + private TokenResponse? CurrentServiceToken; + private TokenResponse? CurrentUserToken; + private (String clientId, String clientSecret) ServiceClientCredentials = default!; + private (String clientId, String clientSecret) PosClientCredentials = default!; public async Task RunAsync((String clientId, String clientSecret) serviceClient, (String clientId, String clientSecret) posClient , MerchantConfig config, CancellationToken cancellationToken) { Logger.LogInformation($"MerchantRuntime started for {config.MerchantName}"); @@ -131,8 +131,13 @@ private async Task StartupSequence(MerchantConfig cfg, return; } + TokenResponse userToken = this.CurrentUserToken + ?? throw new InvalidOperationException($"User token was not initialized for merchant {cfg.MerchantName}."); + TokenResponse serviceToken = this.CurrentServiceToken + ?? throw new InvalidOperationException($"Service token was not initialized for merchant {cfg.MerchantName}."); + // 2. Load products - Result> productsResult = await ApiClient.GetProductList(cfg, this.CurrentUserToken, cancellationToken); + Result> productsResult = await ApiClient.GetProductList(cfg, userToken, cancellationToken); if (productsResult.IsFailed) { Logger.LogWarning($"Failed to get product list for merchant {cfg.MerchantName} during startup sequence."); return; @@ -140,14 +145,14 @@ private async Task StartupSequence(MerchantConfig cfg, cfg.Products = productsResult.Data; // 3. Balance - Result balanceResult = await ApiClient.GetBalance(cfg, this.CurrentServiceToken, cancellationToken); + Result balanceResult = await ApiClient.GetBalance(cfg, serviceToken, cancellationToken); if (balanceResult.IsFailed) { Logger.LogWarning($"Failed to get balance for merchant {cfg.MerchantName} during startup sequence."); return; } await Repository.UpdateBalance(cfg.MerchantId,cfg.MerchantName, balanceResult.Data); // 4. get the merchant record - var merchant = await ApiClient.GetMerchant(cfg, this.CurrentUserToken, cancellationToken); + var merchant = await ApiClient.GetMerchant(cfg, userToken, cancellationToken); cfg.Merchant = merchant.Data; } @@ -156,14 +161,18 @@ private async Task RunMainLoop(MerchantConfig cfg, TimeSpan saleInterval = TimeSpan.FromSeconds(cfg.SaleIntervalSeconds); while (!token.IsCancellationRequested) { - Merchant merchant = await this.Repository.GetMerchant(cfg.MerchantId); + Merchant merchant = await this.Repository.GetMerchant(cfg.MerchantId) + ?? throw new InvalidOperationException($"Merchant {cfg.MerchantId} was not found."); // Wait until the merchant's configured opening time DateTime currentTime = DateTime.Now; // Get the current days opening and closing time TimeSpan openingTime; TimeSpan closingTime; - Boolean found = cfg.Merchant.OpeningHours.TryGetValue(DateTime.Now.DayOfWeek, out var openingHours); + MerchantResponse merchantConfig = cfg.Merchant + ?? throw new InvalidOperationException($"Merchant details were not loaded for {cfg.MerchantName}."); + + Boolean found = merchantConfig.OpeningHours.TryGetValue(DateTime.Now.DayOfWeek, out var openingHours); if (found == false) { // fallback to the configured default opening and closing time if no specific hours for the day of week openingTime = cfg.OpeningTime.ToTimeSpan(); @@ -171,6 +180,10 @@ private async Task RunMainLoop(MerchantConfig cfg, } else { // We have opening and closing times for the current day of week, so use those + if (openingHours is null) + { + throw new InvalidOperationException($"Opening hours were not configured for {cfg.MerchantName} on {DateTime.Now.DayOfWeek}."); + } openingTime = TimeSpan.ParseExact(openingHours.Opening, "hhmm", null); closingTime = TimeSpan.ParseExact(openingHours.Closing, "hhmm", null); } @@ -214,7 +227,9 @@ private async Task RunMainLoop(MerchantConfig cfg, } else { - await ApiClient.SendLogon(cfg, this.CurrentUserToken, merchant.TransactionNumber, token); + TokenResponse userToken = this.CurrentUserToken + ?? throw new InvalidOperationException($"User token was not initialized for merchant {cfg.MerchantName}."); + await ApiClient.SendLogon(cfg, userToken, merchant.TransactionNumber, token); //_lastDailyLogonDate = now.Date; await this.Repository.UpdateLastLogon(cfg.MerchantId, cfg.MerchantName, now); Logger.LogInformation($"Performed daily logon for merchant {cfg.MerchantName} on {now:yyyy-MM-dd}"); @@ -235,9 +250,13 @@ private async Task DoSaleCycle(MerchantConfig cfg,Int32 transactionNumber, Cance Result tokenResult = await this.GetServiceToken(cancellationToken); if (tokenResult.IsFailed) return; + TokenResponse serviceToken = this.CurrentServiceToken + ?? throw new InvalidOperationException($"Service token was not initialized for merchant {cfg.MerchantName}."); tokenResult = await this.GetUserToken(cfg, cancellationToken); if (tokenResult.IsFailed) return; + TokenResponse userToken = this.CurrentUserToken + ?? throw new InvalidOperationException($"User token was not initialized for merchant {cfg.MerchantName}."); decimal balance = await Repository.GetBalance(cfg.MerchantId); @@ -254,7 +273,7 @@ private async Task DoSaleCycle(MerchantConfig cfg,Int32 transactionNumber, Cance bool induceFail = NextDouble() < cfg.FailureInjectionProbability; decimal saleValue = induceFail ? balance + 10 : value; - Result result = await ApiClient.SendSale(cfg, this.CurrentUserToken, product, saleValue, transactionNumber, cancellationToken); + Result result = await ApiClient.SendSale(cfg, userToken, product, saleValue, transactionNumber, cancellationToken); if (result.IsFailed) { @@ -278,7 +297,7 @@ private async Task DoSaleCycle(MerchantConfig cfg,Int32 transactionNumber, Cance this.Metrics.SetBalance(cfg.MerchantId, newBalance); if (newBalance < cfg.DepositThreshold) { - await ApiClient.SendDeposit(cfg, this.CurrentServiceToken, cfg.DepositAmount,cancellationToken); + await ApiClient.SendDeposit(cfg, serviceToken, cfg.DepositAmount,cancellationToken); await Repository.UpdateBalance(cfg.MerchantId, cfg.MerchantName, newBalance + cfg.DepositAmount); newBalance = await Repository.GetBalance(cfg.MerchantId); this.Metrics.SetBalance(cfg.MerchantId, newBalance); @@ -296,9 +315,11 @@ private async Task DoReconciliation(MerchantConfig cfg, CancellationToken cancel Result tokenResult = await this.GetUserToken(cfg, cancellationToken); if (tokenResult.IsFailed) return; + TokenResponse userToken = this.CurrentUserToken + ?? throw new InvalidOperationException($"User token was not initialized for merchant {cfg.MerchantName}."); List totals = await Repository.GetTotals(cfg.MerchantId); - await ApiClient.SendReconciliation(cfg, this.CurrentUserToken, totals, cancellationToken); + await ApiClient.SendReconciliation(cfg, userToken, totals, cancellationToken); // Clear totals await this.Repository.UpdateLastEndOfDay(cfg.MerchantId, cfg.MerchantName, DateTime.Now); diff --git a/TransactionProcessing.MerchantPos/Runtime/Product.cs b/TransactionProcessing.MerchantPos/Runtime/Product.cs index c7387ed..e226d14 100644 --- a/TransactionProcessing.MerchantPos/Runtime/Product.cs +++ b/TransactionProcessing.MerchantPos/Runtime/Product.cs @@ -2,13 +2,13 @@ namespace TransactionProcessing.MerchantPos.Runtime; -public class Product -{ - public string Name { get; set; } + public class Product + { + public string Name { get; set; } = string.Empty; public Guid OperatorId { get; set; } public Guid ProductId { get; set; } public Guid ContractId { get; set; } public decimal Value { get; set; } public ProductType ProductType { get; set; } public ProductSubType ProductSubType { get; set; } -} \ No newline at end of file +} diff --git a/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj b/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj index f9252cb..2dd4195 100644 --- a/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj +++ b/TransactionProcessing.MerchantPos/TransactionProcessing.MerchantPos.csproj @@ -8,7 +8,6 @@ - diff --git a/TransactionProcessing.SchedulerService/DataGenerator/Program.cs b/TransactionProcessing.SchedulerService/DataGenerator/Program.cs index 7042475..77d386d 100644 --- a/TransactionProcessing.SchedulerService/DataGenerator/Program.cs +++ b/TransactionProcessing.SchedulerService/DataGenerator/Program.cs @@ -4,6 +4,7 @@ using TransactionProcessing.SchedulerService.DataGenerator; using TransactionProcessor.DataTransferObjects.Responses.Contract; using TransactionProcessor.DataTransferObjects.Responses.Merchant; +#nullable enable namespace TransactionDataGenerator{ using System.Collections.Generic; @@ -19,23 +20,16 @@ namespace TransactionDataGenerator{ /// class Program{ - private static SecurityServiceClient SecurityServiceClient; + private static SecurityServiceClient SecurityServiceClient = null!; - private static TransactionProcessorClient TransactionProcessorClient; + private static TransactionProcessorClient TransactionProcessorClient = null!; - private static Func baseAddressFunc; + private static Func baseAddressFunc = null!; static async Task Main(string[] args){ - HttpClientHandler handler = new HttpClientHandler{ - ServerCertificateCustomValidationCallback = (message, - cert, - chain, - errors) => { - return true; - } - }; + HttpClientHandler handler = new HttpClientHandler(); HttpClient httpClient = new HttpClient(handler); baseAddressFunc = (apiName) => { @@ -59,8 +53,8 @@ static async Task Main(string[] args){ return $"http://{ipaddress}:9000"; } - return null; - }; + throw new InvalidOperationException($"Unknown API name: {apiName}"); + }; Shared.Logger.Logger.Initialise(new ConsoleLogger()); Program.SecurityServiceClient = new SecurityServiceClient(baseAddressFunc, httpClient); @@ -107,7 +101,7 @@ private static async Task GenerateStatements(ITransactionDataGeneratorService g, Result> getMerchantsResult = await g.GetMerchants(estateId, cancellationToken); if (getMerchantsResult.IsFailed) return; - List? merchants = getMerchantsResult.Data; + List merchants = getMerchantsResult.Data ?? []; foreach (MerchantResponse merchant in merchants){ await g.GenerateMerchantStatement(merchant.EstateId, merchant.MerchantId, DateTime.Now.AddMonths(-2), cancellationToken); } diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/Extensions.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/Extensions.cs index fc48b8d..e1671a3 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/Extensions.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/Extensions.cs @@ -47,8 +47,8 @@ public static SerialisedMessage CreateSerialisedMessage(this SaleTransactionRequ public static T GetSerialisedMessageResponseDTO(this SerialisedMessage serialisedMessage) { - return JsonConvert.DeserializeObject(serialisedMessage.SerialisedData); + return JsonConvert.DeserializeObject(serialisedMessage.SerialisedData)!; } #endregion -} \ No newline at end of file +} diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/IdGenerationService.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/IdGenerationService.cs index 2f8ac6a..7ecc624 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/IdGenerationService.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/IdGenerationService.cs @@ -18,9 +18,6 @@ public class IdGenerationService Formatting = Formatting.None }); - private static readonly GenerateUniqueIdFromObject GenerateUniqueId = - data => IdGenerationService.GenerateGuidFromString(IdGenerationService.JsonSerialiser.Serialise(data)); - private static readonly GenerateUniqueIdFromString GenerateGuidFromString = uniqueKey => { using SHA256 sha256Hash = SHA256.Create(); //Generate hash from the key @@ -32,6 +29,13 @@ public class IdGenerationService return new Guid(j); }; + private static readonly GenerateUniqueIdFromObject GenerateUniqueId = + data => + { + string serialised = IdGenerationService.JsonSerialiser.Serialise(data); + return IdGenerationService.GenerateGuidFromString(serialised); + }; + public static Guid GenerateFloatAggregateId(Guid estateId, Guid contractId, Guid productId) => IdGenerationService.GenerateUniqueId(new { @@ -39,4 +43,4 @@ public static Guid GenerateFloatAggregateId(Guid estateId, Guid contractId, Guid contractId, productId }); -} \ No newline at end of file +} diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TraceEventArgs.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TraceEventArgs.cs index ce03a69..0da0214 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TraceEventArgs.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TraceEventArgs.cs @@ -11,9 +11,9 @@ public enum Level #region Properties - public String Message { get; set; } + public String Message { get; set; } = String.Empty; public Level TraceLevel { get; set; } #endregion -} \ No newline at end of file +} diff --git a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TransactionDataGeneratorService.cs b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TransactionDataGeneratorService.cs index faf0a7b..15d8913 100644 --- a/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TransactionDataGeneratorService.cs +++ b/TransactionProcessing.SchedulerService/TransactionProcessing.SchedulerService.DataGenerator/TransactionDataGeneratorService.cs @@ -212,7 +212,7 @@ public async Task SendSales(DateTime dateTime, // Step 2: Decide how many total transactions to generate in this run numberOfSales = RandomNumberGenerator.GetInt32(1, 6); // e.g. 1–5 transactions per run - List<(SaleTransactionRequest request, Decimal amount)> saleRequests = null; + List<(SaleTransactionRequest request, Decimal amount)> saleRequests = []; for (int i = 0; i < numberOfSales; i++) { ContractProduct? contractProduct = contract.Products[RandomNumberGenerator.GetInt32(contract.Products.Count)]; @@ -349,15 +349,13 @@ private async Task UploadFile(UploadFile uploadFile, Guid userId, DateTi }; request.Headers.Authorization = new AuthenticationHeaderValue("bearer", tokenResult.Data); - HttpResponseMessage response = null; - try { this.WriteTrace($"About to upload file for Merchant [{uploadFile.MerchantId}]"); using (HttpClient client = new HttpClient()) { - response = await client.SendAsync(request, cancellationToken); + await client.SendAsync(request, cancellationToken); } this.WriteTrace($"File uploaded for Merchant [{uploadFile.MerchantId}]"); return Result.Success(); @@ -472,7 +470,7 @@ private static async Task GetFileProfileIdFromOperator(String operatorName private String TestHostApi; - public static Decimal GetAmount(ContractProduct product = null) + public static Decimal GetAmount(ContractProduct? product = null) { return product switch { @@ -751,8 +749,6 @@ private async Task> SendSaleTransaction(MerchantRespon return ResultHelpers.CreateFailure(tokenResult); SerialisedMessage requestSerialisedMessage = request.CreateSerialisedMessage(); - SerialisedMessage responseSerialisedMessage = null; - this.WriteTrace($"About to Send sale for Merchant [{merchant.MerchantName}]"); Result result = new Result(); for (int i = 0; i < 3; i++) { @@ -774,36 +770,38 @@ private async Task> SendSaleTransaction(MerchantRespon } public event TraceHandler? TraceGenerated; - private TokenResponse TokenResponse; + private TokenResponse? TokenResponse; private readonly RunningMode RunningMode; private readonly String ClientId; private readonly String ClientSecret; - private readonly String ClientToken; private async Task> GetAuthToken(CancellationToken cancellationToken) { this.WriteTrace("About to get auth token"); - if (this.TokenResponse == null) { + TokenResponse? tokenResponse = this.TokenResponse; + if (tokenResponse == null) { this.WriteTrace("TokenResponse was null"); Result tokenResult = await this.SecurityServiceClient.GetToken(this.ClientId, this.ClientSecret, cancellationToken); if (tokenResult.IsFailed) return ResultHelpers.CreateFailure(tokenResult); - this.TokenResponse = tokenResult.Data; + tokenResponse = tokenResult.Data; + this.TokenResponse = tokenResponse; } - if (this.TokenResponse.Expires.UtcDateTime.Subtract(DateTime.UtcNow) < TimeSpan.FromMinutes(2)) { + if (tokenResponse.Expires.UtcDateTime.Subtract(DateTime.UtcNow) < TimeSpan.FromMinutes(2)) { this.WriteTrace("TokenResponse was expired"); Result tokenResult = await this.SecurityServiceClient.GetToken(this.ClientId, this.ClientSecret, cancellationToken); if (tokenResult.IsFailed) return ResultHelpers.CreateFailure(tokenResult); - this.TokenResponse = tokenResult.Data; + tokenResponse = tokenResult.Data; + this.TokenResponse = tokenResponse; } this.WriteTrace("Auth token retrieved"); - return Result.Success(this.TokenResponse.AccessToken); + return Result.Success(tokenResponse.AccessToken); } private void WriteMessage(String message, diff --git a/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/Startup.cs b/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/Startup.cs index 1051d95..7281a9b 100644 --- a/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/Startup.cs +++ b/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/Startup.cs @@ -38,16 +38,7 @@ public void ConfigureServices(IServiceCollection services){ private HttpClientHandler ApiEndpointHttpHandler(IServiceProvider arg) { - return new HttpClientHandler - { - ServerCertificateCustomValidationCallback = (message, - cert, - chain, - errors) => - { - return true; - } - }; + return new HttpClientHandler(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. diff --git a/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI.csproj b/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI.csproj index 069ea5f..8110112 100644 --- a/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI.csproj +++ b/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI/TransactionProcessor.HealthChecksUI.csproj @@ -7,6 +7,7 @@ + diff --git a/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs b/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs index 1b37d1a..6ec477f 100644 --- a/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs +++ b/TransactionProcessor.SystemSetupTool/EstateSetupFunctions.cs @@ -79,7 +79,7 @@ public async Task SetupEstate(CancellationToken cancellationToken) { private static string ResolveServiceClientSecret() { - string? secret = Environment.GetEnvironmentVariable("TRANSACTIONPROCESSOR_SERVICECLIENT_SECRET"); + string secret = Environment.GetEnvironmentVariable("TRANSACTIONPROCESSOR_SERVICECLIENT_SECRET"); if (!string.IsNullOrWhiteSpace(secret)) { return secret; diff --git a/TransactionProcessor.SystemSetupTool/EventStoreFunctions.cs b/TransactionProcessor.SystemSetupTool/EventStoreFunctions.cs index b811657..feeaa8f 100644 --- a/TransactionProcessor.SystemSetupTool/EventStoreFunctions.cs +++ b/TransactionProcessor.SystemSetupTool/EventStoreFunctions.cs @@ -72,7 +72,7 @@ private async Task SetupSubscriptions(CancellationToken cancellationToke PersistentSubscriptionInfo subscriptionInfo = await this.PersistentSubscriptionsClient.GetInfoToStreamAsync(subscription.streamName, subscription.groupName, cancellationToken: cancellationToken, deadline:TimeSpan.FromSeconds(30)); exists = true; } - catch(PersistentSubscriptionNotFoundException pex){ + catch(PersistentSubscriptionNotFoundException){ exists = false; } diff --git a/TransactionProcessor.SystemSetupTool/Program.cs b/TransactionProcessor.SystemSetupTool/Program.cs index e0acc06..4b23259 100644 --- a/TransactionProcessor.SystemSetupTool/Program.cs +++ b/TransactionProcessor.SystemSetupTool/Program.cs @@ -33,8 +33,6 @@ class Program private static KurrentDBPersistentSubscriptionsClient PersistentSubscriptionsClient; - private static TokenResponse TokenResponse; - static async Task Main(string[] args) { CancellationToken cancellationToken = CancellationToken.None; @@ -49,15 +47,7 @@ static async Task Main(string[] args) { Func securityResolver = s => { return ConfigurationReader.GetValue("SecurityServiceUri"); }; Func transactionProcessorResolver = s => { return ConfigurationReader.GetValue("TransactionProcessorApi"); }; Func fileProcessorResolver = s => { return ConfigurationReader.GetValue("FileProcessorApi"); }; - HttpClientHandler handler = new() { - ServerCertificateCustomValidationCallback = (message, - cert, - chain, - errors) => - { - return true; - } - }; + HttpClientHandler handler = new(); HttpClient client = new(handler); Program.SecurityServiceClient = new SecurityServiceClient(securityResolver, client, Serialise, Deserialise); @@ -178,7 +168,7 @@ private static string ResolveServiceClientSecret() private static string ResolveRequiredSecret(string environmentVariableName, string description) { - string? secret = Environment.GetEnvironmentVariable(environmentVariableName); + string secret = Environment.GetEnvironmentVariable(environmentVariableName); if (!string.IsNullOrWhiteSpace(secret)) { return secret;