From a74d37a90dec7d0348c255df834e2d4158f699b6 Mon Sep 17 00:00:00 2001 From: dpatel017 Date: Fri, 8 Nov 2024 09:48:32 +0000 Subject: [PATCH 1/2] DP-826 - Rejoin Organisation after being rejected --- ...reateOrganisationJoinRequestUseCaseTest.cs | 54 +++++++++++++------ .../CreateOrganisationJoinRequestUseCase.cs | 16 ++++-- 2 files changed, 51 insertions(+), 19 deletions(-) diff --git a/Services/CO.CDP.Organisation.WebApi.Tests/UseCase/CreateOrganisationJoinRequestUseCaseTest.cs b/Services/CO.CDP.Organisation.WebApi.Tests/UseCase/CreateOrganisationJoinRequestUseCaseTest.cs index a24972416..bd703d5b1 100644 --- a/Services/CO.CDP.Organisation.WebApi.Tests/UseCase/CreateOrganisationJoinRequestUseCaseTest.cs +++ b/Services/CO.CDP.Organisation.WebApi.Tests/UseCase/CreateOrganisationJoinRequestUseCaseTest.cs @@ -9,7 +9,7 @@ using CO.CDP.OrganisationInformation; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; -using OrganisationJoinRequest = CO.CDP.Organisation.WebApi.Model.OrganisationJoinRequest; +using OrganisationJoinRequestModel = CO.CDP.Organisation.WebApi.Model.OrganisationJoinRequest; using Person = CO.CDP.OrganisationInformation.Persistence.Person; namespace CO.CDP.Organisation.WebApi.Tests.UseCase; @@ -72,7 +72,7 @@ public CreateOrganisationJoinRequestUseCaseTests() } [Fact] - public async Task Execute_WhenOrganisationIsUnknown_ShouldThrowUnknownOrganisationException() + public async Task Execute_ShouldThrowUnknownOrganisationException_WhenOrganisationIsUnknown() { var organisationId = Guid.NewGuid(); var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = Guid.NewGuid() }; @@ -87,10 +87,21 @@ await action.Should().ThrowAsync() } [Fact] - public async Task Execute_WhenOrganisationIsknownAndPersonAlreadyInvited_ShouldThrowPersonAlreadyInvitedToOrganisationException() + public async Task Execute_ShouldUpdateExistingJoinRequest_WhenPersonAlreadyHasPendingRequest() { var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = _person.Guid }; - + var joinRequestId = Guid.NewGuid(); + var existingJoinRequest = new CO.CDP.OrganisationInformation.Persistence.OrganisationJoinRequest + { + Guid = joinRequestId, + Status = OrganisationJoinRequestStatus.Rejected, + Id = default, + Person = null!, + Organisation = null!, + ReviewedBy = null!, + ReviewedOn = default + }; + _mockOrganisationRepository.Setup(repo => repo.Find(_organisation.Guid)) .ReturnsAsync(_organisation); @@ -98,15 +109,28 @@ public async Task Execute_WhenOrganisationIsknownAndPersonAlreadyInvited_ShouldT .ReturnsAsync(_person); _mockOrganisationJoinRequestRepository.Setup(repo => repo.FindByOrganisationAndPerson(_organisation.Guid, _person.Guid)) - .ReturnsAsync(new OrganisationInformation.Persistence.OrganisationJoinRequest() { Guid = Guid.NewGuid(), Status = OrganisationJoinRequestStatus.Pending}); + .ReturnsAsync(new OrganisationInformation.Persistence.OrganisationJoinRequest() { Guid = joinRequestId, Status = OrganisationJoinRequestStatus.Rejected }); - Func action = async () => await _useCase.Execute((_organisation.Guid, createJoinRequestCommand)); + _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new OrganisationJoinRequestModel + { + Status = OrganisationJoinRequestStatus.Pending, + Id = default, + Person = null!, + Organisation = null!, + ReviewedBy = null!, + ReviewedOn = default + }); - await action.Should().ThrowAsync(); + var result = await _useCase.Execute((_organisation.Guid, createJoinRequestCommand)); + + result.Status.Should().Be(OrganisationJoinRequestStatus.Pending); + _mockOrganisationJoinRequestRepository.Verify(repo => repo.Save(It.IsAny()), Times.Once); + _mockMapper.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); } [Fact] - public async Task Execute_WhenPersonIsUnknown_ShouldThrowUnknownPersonException() + public async Task Execute_ShouldThrowUnknownPersonException_WhenPersonIsUnknown() { var personId = Guid.NewGuid(); var createJoinRequestCommand = new CreateOrganisationJoinRequest { PersonId = personId }; @@ -134,8 +158,8 @@ public async Task Execute_ShouldCreateAndSaveOrganisationJoinRequest() _mockPersonRepository.Setup(repo => repo.Find(_person.Guid)) .ReturnsAsync(_person); - _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) - .Returns(new OrganisationJoinRequest + _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new OrganisationJoinRequestModel { Status = OrganisationJoinRequestStatus.Pending, Id = default, @@ -151,7 +175,7 @@ public async Task Execute_ShouldCreateAndSaveOrganisationJoinRequest() result.Status.Should().Be(OrganisationJoinRequestStatus.Pending); _mockOrganisationJoinRequestRepository.Verify(repo => repo.Save(It.IsAny()), Times.Once); - _mockMapper.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); + _mockMapper.Verify(mapper => mapper.Map(It.IsAny()), Times.Once); } [Fact] @@ -165,8 +189,8 @@ public async Task ItShouldSendUserRequestSentEmail() _mockPersonRepository.Setup(repo => repo.Find(_person.Guid)) .ReturnsAsync(_person); - _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) - .Returns(new OrganisationJoinRequest + _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new OrganisationJoinRequestModel { Status = OrganisationJoinRequestStatus.Pending, Id = default, @@ -222,8 +246,8 @@ public async Task ItShouldSendEmailsToOrgAdmins() Organisation = null! }).ToList()); - _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) - .Returns(new OrganisationJoinRequest + _mockMapper.Setup(mapper => mapper.Map(It.IsAny())) + .Returns(new OrganisationJoinRequestModel { Status = OrganisationJoinRequestStatus.Pending, Id = default, diff --git a/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs b/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs index 95fdf64a4..25727fd2a 100644 --- a/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs +++ b/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs @@ -44,16 +44,24 @@ public async Task Execute((Guid organisationId, CreateO ?? throw new UnknownPersonException($"Unknown person {command.createOrganisationJoinRequestCommand.PersonId}."); await GuardPersonIsNotAlreadyAdded(organisation, person); - await GuardPersonIsNotAlreadyInvited(organisation, person); + + var joinRequest = await organisationJoinRequestRepository.FindByOrganisationAndPerson(organisation.Guid, person.Guid); - var organisationJoinRequest = CreateOrganisationJoinRequest(organisation, person); + if (joinRequest != null) + { + joinRequest.Status = OrganisationJoinRequestStatus.Pending; + } + else + { + joinRequest = CreateOrganisationJoinRequest(organisation, person); + } - organisationJoinRequestRepository.Save(organisationJoinRequest); + organisationJoinRequestRepository.Save(joinRequest); await NotifyUserRequestSent(organisation: organisation, person: person); await NotifyOrgAdminsOfApprovalRequest(organisation: organisation, person: person); - return mapper.Map(organisationJoinRequest); + return mapper.Map(joinRequest); } private Persistence.OrganisationJoinRequest CreateOrganisationJoinRequest( From 3840801c0babea06e94e69ce37fbb2ee1bca5e85 Mon Sep 17 00:00:00 2001 From: dpatel017 Date: Fri, 8 Nov 2024 09:52:47 +0000 Subject: [PATCH 2/2] removed unused method --- .../UseCase/CreateOrganisationJoinRequestUseCase.cs | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs b/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs index 25727fd2a..604176202 100644 --- a/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs +++ b/Services/CO.CDP.Organisation.WebApi/UseCase/CreateOrganisationJoinRequestUseCase.cs @@ -169,18 +169,7 @@ private async Task> GetOrganisationAdminUsers(Persistence.Organisat var organisationPersons = await organisationRepository.FindOrganisationPersons(organisation.Guid); return organisationPersons.Where(op => op.Scopes.Contains(Constants.OrganisationPersonScope.Admin)).Select(op => op.Person).ToList(); } - - private async Task GuardPersonIsNotAlreadyInvited(Persistence.Organisation organisation, Person person) - { - var joinRequest = await organisationJoinRequestRepository.FindByOrganisationAndPerson(organisation.Guid, person.Guid); - - if (joinRequest != null) - { - throw new PersonAlreadyInvitedToOrganisationException( - $"Person {person.Guid} already invited to organisation {organisation.Guid}."); - } - } - + private async Task GuardPersonIsNotAlreadyAdded(Persistence.Organisation organisation, Person person) { var matchingOrganisationPerson = await organisationRepository.FindOrganisationPerson(organisation.Guid, person.Guid);