From c5561ed93816928cab54bbb11904818e3ca61105 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:19:49 +0000 Subject: [PATCH 1/2] Initial plan From 54e0e2383e35ce223e2a8bdbfdd0bb2c6a37f973 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 18 Mar 2026 18:22:50 +0000 Subject: [PATCH 2/2] Refactor estate user creation flow Co-authored-by: StuartFerguson <16325469+StuartFerguson@users.noreply.github.com> --- .../Services/EstateDomainServiceTests.cs | 37 ++++++++++ .../Services/EstateDomainService.cs | 72 +++++++++++-------- 2 files changed, 80 insertions(+), 29 deletions(-) diff --git a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs index 8a22100e..6dc13a8c 100644 --- a/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs +++ b/TransactionProcessor.BusinessLogic.Tests/Services/EstateDomainServiceTests.cs @@ -89,6 +89,43 @@ public async Task EstateDomainService_CreateEstateUser_EstateUserIsCreated() { result.IsSuccess.ShouldBeTrue(); } + [Fact] + public async Task EstateDomainService_CreateEstateUser_EstateRoleOverrideIsUsedInCreateUserRequest() { + String originalEstateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); + CreateUserRequest capturedRequest = null; + + try { + Environment.SetEnvironmentVariable("EstateRoleName", "CustomEstateRole"); + + this.AggregateService.Setup(m => m.GetLatest(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(TestData.Aggregates.CreatedEstateAggregate())); + this.AggregateService.Setup(m => m.Save(It.IsAny(), It.IsAny())) + .ReturnsAsync(SimpleResults.Result.Success()); + + this.SecurityServiceClient + .Setup(s => s.CreateUser(It.IsAny(), It.IsAny())) + .Callback((request, _) => capturedRequest = request) + .ReturnsAsync(Result.Success); + this.SecurityServiceClient + .Setup(s => s.GetUsers(It.IsAny(), It.IsAny())) + .ReturnsAsync(Result.Success(new List() { + new UserDetails { + UserId = Guid.Parse("FA077CE3-B915-4048-88E3-9B500699317F") + } + })); + + Result result = await this.DomainService.CreateEstateUser(TestData.Commands.CreateEstateUserCommand, CancellationToken.None); + + result.IsSuccess.ShouldBeTrue(); + capturedRequest.ShouldNotBeNull(); + capturedRequest.Roles.ShouldContain("CustomEstateRole"); + capturedRequest.Claims["estateId"].ShouldBe(TestData.EstateId.ToString()); + } + finally { + Environment.SetEnvironmentVariable("EstateRoleName", originalEstateRoleName); + } + } + [Fact] public async Task EstateDomainService_CreateEstateUser_UserCreateFailed_ResultIsFailed() { diff --git a/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs b/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs index dde20ef3..2d4de0ca 100644 --- a/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs +++ b/TransactionProcessor.BusinessLogic/Services/EstateDomainService.cs @@ -111,34 +111,11 @@ public async Task CreateEstateUser(EstateCommands.CreateEstateUserComman { try { - CreateUserRequest createUserRequest = new CreateUserRequest - { - EmailAddress = command.RequestDto.EmailAddress, - FamilyName = command.RequestDto.FamilyName, - GivenName = command.RequestDto.GivenName, - MiddleName = command.RequestDto.MiddleName, - Password = command.RequestDto.Password, - PhoneNumber = "123456", // Is this really needed :| - Roles = new List(), - Claims = new Dictionary() - }; - - // Check if role has been overridden - String estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); - createUserRequest.Roles.Add(String.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName); - createUserRequest.Claims.Add("estateId", command.EstateId.ToString()); - - Result createUserResult = await this.SecurityServiceClient.CreateUser(createUserRequest, cancellationToken); - if (createUserResult.IsFailed) - return ResultHelpers.CreateFailure(createUserResult); - - Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(createUserRequest.EmailAddress, cancellationToken); - if (userDetailsResult.IsFailed) - return ResultHelpers.CreateFailure(userDetailsResult); - - UserDetails user = userDetailsResult.Data.SingleOrDefault(); - if (user == null) - return Result.Failure($"Unable to get user details for username {createUserRequest.EmailAddress}"); + CreateUserRequest createUserRequest = this.BuildEstateUserRequest(command); + + Result getUserResult = await this.CreateEstateSecurityUser(createUserRequest, cancellationToken); + if (getUserResult.IsFailed) + return ResultHelpers.CreateFailure(getUserResult); Result estateResult = await DomainServiceHelper.GetAggregateOrFailure(ct => this.AggregateService.GetLatest(command.EstateId, ct), command.EstateId, cancellationToken); if (estateResult.IsFailed) @@ -146,7 +123,7 @@ public async Task CreateEstateUser(EstateCommands.CreateEstateUserComman EstateAggregate estateAggregate = estateResult.Data; - Result stateResult = estateAggregate.AddSecurityUser(user.UserId, command.RequestDto.EmailAddress); + Result stateResult = estateAggregate.AddSecurityUser(getUserResult.Data.UserId, command.RequestDto.EmailAddress); if (stateResult.IsFailed) return ResultHelpers.CreateFailure(stateResult); @@ -162,6 +139,43 @@ public async Task CreateEstateUser(EstateCommands.CreateEstateUserComman } } + private CreateUserRequest BuildEstateUserRequest(EstateCommands.CreateEstateUserCommand command) { + CreateUserRequest createUserRequest = new CreateUserRequest + { + EmailAddress = command.RequestDto.EmailAddress, + FamilyName = command.RequestDto.FamilyName, + GivenName = command.RequestDto.GivenName, + MiddleName = command.RequestDto.MiddleName, + Password = command.RequestDto.Password, + PhoneNumber = "123456", // Is this really needed :| + Roles = new List(), + Claims = new Dictionary() + }; + + String estateRoleName = Environment.GetEnvironmentVariable("EstateRoleName"); + createUserRequest.Roles.Add(String.IsNullOrEmpty(estateRoleName) ? "Estate" : estateRoleName); + createUserRequest.Claims.Add("estateId", command.EstateId.ToString()); + + return createUserRequest; + } + + private async Task> CreateEstateSecurityUser(CreateUserRequest createUserRequest, + CancellationToken cancellationToken) { + Result createUserResult = await this.SecurityServiceClient.CreateUser(createUserRequest, cancellationToken); + if (createUserResult.IsFailed) + return ResultHelpers.CreateFailure(createUserResult); + + Result> userDetailsResult = await this.SecurityServiceClient.GetUsers(createUserRequest.EmailAddress, cancellationToken); + if (userDetailsResult.IsFailed) + return ResultHelpers.CreateFailure(userDetailsResult); + + UserDetails user = userDetailsResult.Data.SingleOrDefault(); + if (user == null) + return Result.Failure($"Unable to get user details for username {createUserRequest.EmailAddress}"); + + return Result.Success(user); + } + public async Task RemoveOperatorFromEstate(EstateCommands.RemoveOperatorFromEstateCommand command, CancellationToken cancellationToken) { try