diff --git a/src/administration/Administration.Service/BusinessLogic/IInvitationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/IInvitationBusinessLogic.cs index 123767d543..2de7717f54 100644 --- a/src/administration/Administration.Service/BusinessLogic/IInvitationBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/IInvitationBusinessLogic.cs @@ -23,7 +23,7 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog { public interface IInvitationBusinessLogic { - Task ExecuteInvitation(CompanyInvitationData invitationData); + Task ExecuteInvitation(CompanyInvitationData invitationData); Task RetriggerCreateCentralIdp(Guid processId); Task RetriggerCreateSharedIdpServiceAccount(Guid processId); Task RetriggerUpdateCentralIdpUrls(Guid processId); diff --git a/src/administration/Administration.Service/BusinessLogic/InvitationBusinessLogic.cs b/src/administration/Administration.Service/BusinessLogic/InvitationBusinessLogic.cs index ca076d8ef6..974e5cfc56 100644 --- a/src/administration/Administration.Service/BusinessLogic/InvitationBusinessLogic.cs +++ b/src/administration/Administration.Service/BusinessLogic/InvitationBusinessLogic.cs @@ -42,7 +42,7 @@ public InvitationBusinessLogic( _portalRepositories = portalRepositories; } - public Task ExecuteInvitation(CompanyInvitationData invitationData) + public Task ExecuteInvitation(CompanyInvitationData invitationData) { if (string.IsNullOrWhiteSpace(invitationData.Email)) { @@ -57,7 +57,7 @@ public Task ExecuteInvitation(CompanyInvitationData invitationData) return ExecuteInvitationInternalAsync(invitationData); } - private async Task ExecuteInvitationInternalAsync(CompanyInvitationData invitationData) + private async Task ExecuteInvitationInternalAsync(CompanyInvitationData invitationData) { var (userName, firstName, lastName, email, organisationName) = invitationData; var processStepRepository = _portalRepositories.GetInstance(); @@ -78,6 +78,7 @@ private async Task ExecuteInvitationInternalAsync(CompanyInvitationData invitati }); await _portalRepositories.SaveAsync().ConfigureAwait(ConfigureAwaitOptions.None); + return new CompanyInvitationResponse(applicationId, company.Id); } public Task RetriggerCreateCentralIdp(Guid processId) => ProcessStepTypeId.RETRIGGER_INVITATION_CREATE_CENTRAL_IDP.TriggerProcessStep(processId, _portalRepositories); diff --git a/src/administration/Administration.Service/Controllers/InvitationController.cs b/src/administration/Administration.Service/Controllers/InvitationController.cs index e445c6c78a..8463e92224 100644 --- a/src/administration/Administration.Service/Controllers/InvitationController.cs +++ b/src/administration/Administration.Service/Controllers/InvitationController.cs @@ -63,12 +63,12 @@ public InvitationController(IInvitationBusinessLogic logic) [HttpPost] [Authorize(Roles = "invite_new_partner")] [Authorize(Policy = PolicyTypes.ValidCompany)] - [ProducesResponseType(StatusCodes.Status200OK)] + [ProducesResponseType(typeof(CompanyInvitationResponse), StatusCodes.Status200OK)] [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status400BadRequest)] [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status500InternalServerError)] [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status502BadGateway)] [ProducesResponseType(typeof(ErrorResponse), StatusCodes.Status409Conflict)] - public Task ExecuteInvitation([FromBody] CompanyInvitationData invitationData) => + public Task ExecuteInvitation([FromBody] CompanyInvitationData invitationData) => _logic.ExecuteInvitation(invitationData); /// diff --git a/src/administration/Administration.Service/Models/CompanyInvitationResponse.cs b/src/administration/Administration.Service/Models/CompanyInvitationResponse.cs new file mode 100644 index 0000000000..31e22a1fdc --- /dev/null +++ b/src/administration/Administration.Service/Models/CompanyInvitationResponse.cs @@ -0,0 +1,22 @@ +/******************************************************************************** +* Copyright (c) 2024 Contributors to the Eclipse Foundation +* +* See the NOTICE file(s) distributed with this work for additional +* information regarding copyright ownership. +* +* This program and the accompanying materials are made available under the +* terms of the Apache License, Version 2.0 which is available at +* https://www.apache.org/licenses/LICENSE-2.0. +* +* Unless required by applicable law or agreed to in writing, software +* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +* License for the specific language governing permissions and limitations +* under the License. +* +* SPDX-License-Identifier: Apache-2.0 +********************************************************************************/ + +namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Models; + +public record CompanyInvitationResponse(Guid ApplicationId, Guid CompanyId); diff --git a/tests/administration/Administration.Service.Tests/BusinessLogic/InvitationBusinessLogicTests.cs b/tests/administration/Administration.Service.Tests/BusinessLogic/InvitationBusinessLogicTests.cs index 033f501632..846188e9a2 100644 --- a/tests/administration/Administration.Service.Tests/BusinessLogic/InvitationBusinessLogicTests.cs +++ b/tests/administration/Administration.Service.Tests/BusinessLogic/InvitationBusinessLogicTests.cs @@ -97,13 +97,14 @@ public async Task ExecuteInvitation_WithValidData_CreatesExpected() .WithEmailPattern(x => x.Email) .Create(); - await _sut.ExecuteInvitation(invitationData); + var result = await _sut.ExecuteInvitation(invitationData); processes.Should().ContainSingle().And.Satisfy(x => x.ProcessTypeId == ProcessTypeId.INVITATION); processSteps.Should().ContainSingle().And.Satisfy(x => x.ProcessStepTypeId == ProcessStepTypeId.INVITATION_CREATE_CENTRAL_IDP && x.ProcessStepStatusId == ProcessStepStatusId.TODO); invitations.Should().ContainSingle().And.Satisfy(x => x.ProcessId == processes.Single().Id && x.UserName == "testUserName" && x.ApplicationId == ApplicationId); A.CallTo(() => _companyRepository.CreateCompany(A._, null)).MustHaveHappenedOnceExactly(); A.CallTo(() => _applicationRepository.CreateCompanyApplication(CompanyId, CompanyApplicationStatusId.CREATED, CompanyApplicationTypeId.INTERNAL, null)).MustHaveHappenedOnceExactly(); + result.Should().Be(new CompanyInvitationResponse(ApplicationId, CompanyId)); } [Theory] diff --git a/tests/administration/Administration.Service.Tests/Controllers/InvitationControllerTests.cs b/tests/administration/Administration.Service.Tests/Controllers/InvitationControllerTests.cs index 2b6794d647..39ae092eb1 100644 --- a/tests/administration/Administration.Service.Tests/Controllers/InvitationControllerTests.cs +++ b/tests/administration/Administration.Service.Tests/Controllers/InvitationControllerTests.cs @@ -41,12 +41,15 @@ public async Task ExecuteInvitation_ReturnsExpected() { // Arrange var data = _fixture.Create(); + var expectedResponse = new CompanyInvitationResponse(Guid.NewGuid(), Guid.NewGuid()); + A.CallTo(() => _logic.ExecuteInvitation(A._)).Returns(expectedResponse); // Act - await _controller.ExecuteInvitation(data); + var result = await _controller.ExecuteInvitation(data); // Assert A.CallTo(() => _logic.ExecuteInvitation(data)).MustHaveHappenedOnceExactly(); + result.Should().Be(expectedResponse); } [Fact]