From a2dea73c6426c88c99d2d6f29028b782df158cdd Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Fri, 31 Jul 2026 10:46:27 +0100 Subject: [PATCH 1/2] Refactor usings, DI, and add StringSerialiser services Updated using statements for better organization and added Microsoft.AspNetCore.Http.Json. Registered singleton StringSerialiser services for object serialization/deserialization. Reordered or deduplicated NLog.Extensions.Logging and SecurityService.Database.Entities registrations in the DI container. --- SecurityService/Program.cs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/SecurityService/Program.cs b/SecurityService/Program.cs index 5b149e8..c387ebf 100644 --- a/SecurityService/Program.cs +++ b/SecurityService/Program.cs @@ -11,12 +11,14 @@ using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using NLog; +using NLog.Extensions.Logging; using OpenIddict.Abstractions; using SecurityService.BusinessLogic; using SecurityService.BusinessLogic.Requests; using SecurityService.Common; using SecurityService.Configuration; using SecurityService.Database.DbContexts; +using SecurityService.Database.Entities; using SecurityService.Endpoints; using SecurityService.HealthChecks; using SecurityService.HostedServices; @@ -26,15 +28,15 @@ using Shared.Logger; using Shared.Logger.TennantContext; using Shared.Middleware; +using Shared.Serialisation; using System.Reflection; using System.Security.Cryptography; using static OpenIddict.Abstractions.OpenIddictConstants; using static OpenIddict.Abstractions.OpenIddictConstants.Permissions; using ILogger = Microsoft.Extensions.Logging.ILogger; +using JsonSerializerConfiguration = Shared.Serialisation.JsonSerializerConfiguration; using Logger = Shared.Logger.Logger; -using NLog.Extensions.Logging; using LogLevel = Microsoft.Extensions.Logging.LogLevel; -using SecurityService.Database.Entities; var builder = WebApplication.CreateBuilder(new WebApplicationOptions { @@ -161,7 +163,8 @@ { builder.Services.RegisterHttpClient(); } - +builder.Services.AddSingleton>(_ => obj => StringSerialiser.Serialise(obj)); +builder.Services.AddSingleton>(_ => (str, type) => StringSerialiser.DeserializeObject(str, type)); builder.Services.AddSingleton>(container => serviceName => { return ConfigurationReader.GetBaseServerUri(serviceName).OriginalString; }); bool logRequests = ConfigurationReader.GetValueOrDefault("MiddlewareLogging", "LogRequests", true); From a5b57e1f7945b700388ede58a181e71d48b53de7 Mon Sep 17 00:00:00 2001 From: StuartFerguson Date: Fri, 31 Jul 2026 16:48:55 +0100 Subject: [PATCH 2/2] fix registration date json issue --- .../RequestHandlers/UserRequestHandler.cs | 2 +- .../ReqnrollExtensions.cs | 2 +- SecurityService/Handlers/UserHandler.cs | 14 +++++++++++--- SecurityService/Program.cs | 6 ++++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs b/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs index 5dd2332..943c935 100644 --- a/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs +++ b/SecurityService.BusinessLogic/RequestHandlers/UserRequestHandler.cs @@ -175,7 +175,7 @@ public async Task Handle(SecurityServiceCommands.CreateUserCommand comma MiddleName = command.MiddleName, FamilyName = command.FamilyName, EmailConfirmed = string.IsNullOrWhiteSpace(command.EmailAddress), - RegistrationDateTime = DateTime.Now, + RegistrationDateTime = DateTime.UtcNow, }; Result passwordValueResult = String.IsNullOrEmpty(command.Password) ? PasswordGenerator.GenerateRandomPassword(this.Options.Value.PasswordOptions) : command.Password; diff --git a/SecurityService.IntegrationTesting.Helpers/ReqnrollExtensions.cs b/SecurityService.IntegrationTesting.Helpers/ReqnrollExtensions.cs index b303a4f..5e30f06 100644 --- a/SecurityService.IntegrationTesting.Helpers/ReqnrollExtensions.cs +++ b/SecurityService.IntegrationTesting.Helpers/ReqnrollExtensions.cs @@ -306,7 +306,7 @@ public static List ToUserResponses(this DataTableRows tableRows){ } DateTime dateTime = ReqnrollTableHelper.GetDateForDateString(ReqnrollTableHelper.GetStringRowValue(tableRow, "RegistrationDate"), DateTime.Now); - //userDetails.RegistrationDateTime = dateTime; + userDetails.RegistrationDateTime = dateTime; userDetailsList.Add(userDetails); } return userDetailsList; diff --git a/SecurityService/Handlers/UserHandler.cs b/SecurityService/Handlers/UserHandler.cs index 2bda5fa..357ee2b 100644 --- a/SecurityService/Handlers/UserHandler.cs +++ b/SecurityService/Handlers/UserHandler.cs @@ -25,7 +25,11 @@ public static async Task GetUser(IMediator mediator, Result result = await mediator.Send(query, cancellationToken); - return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + if (result.IsFailed) { + return OidcResponseFactory.TranslateResultStatus(result); + } + + return Results.Ok(ModelFactory.ConvertFrom(result.Data)); } public static async Task GetUsers(IMediator mediator, string? userName, CancellationToken cancellationToken) { @@ -33,6 +37,10 @@ public static async Task GetUsers(IMediator mediator, string? userName, Result> result = await mediator.Send(query, cancellationToken); - return ResponseFactory.FromResult(result, ModelFactory.ConvertFrom); + if (result.IsFailed) { + return OidcResponseFactory.TranslateResultStatus(result); + } + + return Results.Ok(ModelFactory.ConvertFrom(result.Data)); } -} \ No newline at end of file +} diff --git a/SecurityService/Program.cs b/SecurityService/Program.cs index c387ebf..34207f3 100644 --- a/SecurityService/Program.cs +++ b/SecurityService/Program.cs @@ -34,7 +34,6 @@ using static OpenIddict.Abstractions.OpenIddictConstants; using static OpenIddict.Abstractions.OpenIddictConstants.Permissions; using ILogger = Microsoft.Extensions.Logging.ILogger; -using JsonSerializerConfiguration = Shared.Serialisation.JsonSerializerConfiguration; using Logger = Shared.Logger.Logger; using LogLevel = Microsoft.Extensions.Logging.LogLevel; @@ -163,6 +162,9 @@ { builder.Services.RegisterHttpClient(); } + +StringSerialiser.Initialise(new SystemTextJsonSerializer(SystemTextJsonSerializer.GetDefaultJsonSerializerOptions())); + builder.Services.AddSingleton>(_ => obj => StringSerialiser.Serialise(obj)); builder.Services.AddSingleton>(_ => (str, type) => StringSerialiser.DeserializeObject(str, type)); builder.Services.AddSingleton>(container => serviceName => { return ConfigurationReader.GetBaseServerUri(serviceName).OriginalString; }); @@ -182,7 +184,7 @@ { configuration.RegisterServicesFromAssembly(typeof(SecurityServiceCommands).Assembly); }); -builder.Services.ConfigureHttpJsonOptions(jsonOptions => JsonSerializerConfiguration.ConfigureMinimalApi(jsonOptions.SerializerOptions)); +builder.Services.ConfigureHttpJsonOptions(jsonOptions => SecurityService.Configuration.JsonSerializerConfiguration.ConfigureMinimalApi(jsonOptions.SerializerOptions)); builder.Services.AddRazorPages(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();