Skip to content

Commit

Permalink
feat(serviceAccount): added filter and lasteditorData (#381)
Browse files Browse the repository at this point in the history
Ref: CPLP-3137
Reviewed-By: Phil Schneider <[email protected]>
  • Loading branch information
VPrasannaK94 authored Dec 13, 2023
1 parent d20c582 commit d0639fa
Show file tree
Hide file tree
Showing 12 changed files with 105 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,6 @@ public interface IServiceAccountBusinessLogic
Task<ServiceAccountConnectorOfferData> GetOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId);
Task<ServiceAccountDetails> UpdateOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId, ServiceAccountEditableDetails serviceAccountDetails);
Task<ServiceAccountDetails> ResetOwnCompanyServiceAccountSecretAsync(Guid serviceAccountId);
Task<Pagination.Response<CompanyServiceAccountData>> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner);
Task<Pagination.Response<CompanyServiceAccountData>> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool isUserStatusActive);
IAsyncEnumerable<UserRoleWithDescription> GetServiceAccountRolesAsync(string? languageShortName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,8 @@ public async Task<ServiceAccountConnectorOfferData> GetOwnCompanyServiceAccountD
authData.Secret,
result.ConnectorData,
result.OfferSubscriptionData,
result.CompanyLastEditorData!.Name,
result.CompanyLastEditorData.CompanyName,
result.SubscriptionId);
}

Expand Down Expand Up @@ -264,12 +266,12 @@ await _provisioningManager.UpdateCentralClientAsync(
result.OfferSubscriptionId);
}

public Task<Pagination.Response<CompanyServiceAccountData>> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner) =>
public Task<Pagination.Response<CompanyServiceAccountData>> GetOwnCompanyServiceAccountsDataAsync(int page, int size, string? clientId, bool? isOwner, bool isUserStatusActive) =>
Pagination.CreateResponseAsync(
page,
size,
15,
_portalRepositories.GetInstance<IServiceAccountRepository>().GetOwnCompanyServiceAccountsUntracked(_identityService.IdentityData.CompanyId, clientId, isOwner));
_portalRepositories.GetInstance<IServiceAccountRepository>().GetOwnCompanyServiceAccountsUntracked(_identityService.IdentityData.CompanyId, clientId, isOwner, isUserStatusActive ? UserStatusId.ACTIVE : UserStatusId.INACTIVE));

public IAsyncEnumerable<UserRoleWithDescription> GetServiceAccountRolesAsync(string? languageShortName) =>
_portalRepositories.GetInstance<IUserRolesRepository>().GetServiceAccountRolesAsync(_identityService.IdentityData.CompanyId, _settings.ClientId, languageShortName ?? Constants.DefaultLanguage);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,7 @@ public Task<ServiceAccountDetails> ResetServiceAccountCredentials([FromRoute] Gu
/// <param name="size">number of service account data</param>
/// <param name="isOwner">isOwner either true or false</param>
/// <param name="clientId">clientId is string clientclientid</param>
/// <param name="isUserStatusActive">isUserStatusActive is True or False</param>
/// <returns>Returns the specific number of service account data for the given page.</returns>
/// <remarks>Example: GET: api/administration/serviceaccount/owncompany/serviceaccounts</remarks>
/// <response code="200">Returns the specific number of service account data for the given page.</response>
Expand All @@ -170,8 +171,8 @@ public Task<ServiceAccountDetails> ResetServiceAccountCredentials([FromRoute] Gu
[Authorize(Policy = PolicyTypes.ValidCompany)]
[Route("owncompany/serviceaccounts")]
[ProducesResponseType(typeof(Pagination.Response<CompanyServiceAccountData>), StatusCodes.Status200OK)]
public Task<Pagination.Response<CompanyServiceAccountData>> GetServiceAccountsData([FromQuery] int page, [FromQuery] int size, [FromQuery] bool? isOwner, [FromQuery] string? clientId) =>
_logic.GetOwnCompanyServiceAccountsDataAsync(page, size, clientId, isOwner);
public Task<Pagination.Response<CompanyServiceAccountData>> GetServiceAccountsData([FromQuery] int page, [FromQuery] int size, [FromQuery] bool? isOwner, [FromQuery] string? clientId, [FromQuery] bool isUserStatusActive) =>
_logic.GetOwnCompanyServiceAccountsDataAsync(page, size, clientId, isOwner, isUserStatusActive);

/// <summary>
/// Get all service account roles
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,5 +36,7 @@ public record ServiceAccountConnectorOfferData(
[property: JsonPropertyName("secret")] string? Secret,
[property: JsonPropertyName("connector")] ConnectorResponseData? Connector,
[property: JsonPropertyName("offer")] OfferResponseData? Offer,
[property: JsonPropertyName("LastEditorName")] string? LastName,
[property: JsonPropertyName("LastEditorCompanyName")] string? CompanyName,
[property: JsonPropertyName("subscriptionId")] Guid? SubscriptionId = null
);
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,11 @@ public record CompanyServiceAccountDetailedData(
CompanyServiceAccountTypeId CompanyServiceAccountTypeId,
Guid? SubscriptionId,
ConnectorResponseData? ConnectorData,
OfferResponseData? OfferSubscriptionData);
OfferResponseData? OfferSubscriptionData,
CompanyLastEditorData? CompanyLastEditorData);

public record ConnectorResponseData(Guid Id, string Name);

public record OfferResponseData(Guid Id, OfferTypeId Type, string? Name, Guid? SubscriptionId);

public record CompanyLastEditorData(string? Name, string CompanyName);
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,6 @@ CompanyServiceAccount CreateCompanyServiceAccount(Guid identityId,
Task<CompanyServiceAccountWithRoleDataClientId?> GetOwnCompanyServiceAccountWithIamClientIdAsync(Guid serviceAccountId, Guid userCompanyId);
Task<(IEnumerable<Guid> UserRoleIds, Guid? ConnectorId, string? ClientId, ConnectorStatusId? statusId, OfferSubscriptionStatusId? OfferStatusId)> GetOwnCompanyServiceAccountWithIamServiceAccountRolesAsync(Guid serviceAccountId, Guid companyId);
Task<CompanyServiceAccountDetailedData?> GetOwnCompanyServiceAccountDetailedDataUntrackedAsync(Guid serviceAccountId, Guid companyId);
Func<int, int, Task<Pagination.Source<CompanyServiceAccountData>?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner);
Func<int, int, Task<Pagination.Source<CompanyServiceAccountData>?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, UserStatusId userStatusId);
Task<bool> CheckActiveServiceAccountExistsForCompanyAsync(Guid technicalUserId, Guid companyId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,16 @@ public void AttachAndModifyCompanyServiceAccount(
serviceAccount.OfferSubscription.OfferId,
serviceAccount.OfferSubscription.Offer!.OfferTypeId,
serviceAccount.OfferSubscription.Offer.Name,
serviceAccount.OfferSubscription.Id)))
serviceAccount.OfferSubscription.Id),
serviceAccount.Identity.LastEditorId == null ? null :
new CompanyLastEditorData(
serviceAccount.Identity.LastEditor!.IdentityTypeId == IdentityTypeId.COMPANY_USER
? serviceAccount.Identity.LastEditor.CompanyUser!.Lastname
: serviceAccount.Identity.LastEditor.CompanyServiceAccount!.Name,
serviceAccount.Identity.LastEditor.Company!.Name)))
.SingleOrDefaultAsync();

public Func<int, int, Task<Pagination.Source<CompanyServiceAccountData>?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner) =>
public Func<int, int, Task<Pagination.Source<CompanyServiceAccountData>?>> GetOwnCompanyServiceAccountsUntracked(Guid userCompanyId, string? clientId, bool? isOwner, UserStatusId userStatusId) =>
(skip, take) => Pagination.CreateSourceQueryAsync(
skip,
take,
Expand All @@ -156,7 +162,7 @@ public void AttachAndModifyCompanyServiceAccount(
.Where(serviceAccount =>
(!isOwner.HasValue && (serviceAccount.CompaniesLinkedServiceAccount!.Owners == userCompanyId || serviceAccount.CompaniesLinkedServiceAccount!.Provider == userCompanyId) ||
isOwner.HasValue && (isOwner.Value && serviceAccount.CompaniesLinkedServiceAccount!.Owners == userCompanyId || !isOwner.Value && serviceAccount.CompaniesLinkedServiceAccount!.Provider == userCompanyId)) &&
serviceAccount.Identity!.UserStatusId == UserStatusId.ACTIVE &&
serviceAccount.Identity!.UserStatusId == userStatusId &&
(clientId == null || EF.Functions.ILike(serviceAccount.ClientClientId!, $"%{clientId.EscapeForILike()}%")))
.GroupBy(serviceAccount => serviceAccount.Identity!.UserStatusId),
serviceAccounts => serviceAccounts.OrderBy(serviceAccount => serviceAccount.Name),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -374,19 +374,21 @@ public async Task UpdateOwnCompanyServiceAccountDetailsAsync_WithInactiveService

#region GetOwnCompanyServiceAccountsDataAsync

[Fact]
public async Task GetOwnCompanyServiceAccountsDataAsync_GetsExpectedData()
[Theory]
[InlineData(UserStatusId.ACTIVE, true)]
[InlineData(UserStatusId.INACTIVE, false)]
public async Task GetOwnCompanyServiceAccountsDataAsync_GetsExpectedData(UserStatusId userStatusId, bool isUserStatusActive)
{
// Arrange
var data = _fixture.CreateMany<CompanyServiceAccountData>(15);
A.CallTo(() => _serviceAccountRepository.GetOwnCompanyServiceAccountsUntracked(_identity.CompanyId, null, null))
A.CallTo(() => _serviceAccountRepository.GetOwnCompanyServiceAccountsUntracked(_identity.CompanyId, null, null, userStatusId))
.Returns((int skip, int take) => Task.FromResult((Pagination.Source<CompanyServiceAccountData>?)new Pagination.Source<CompanyServiceAccountData>(data.Count(), data.Skip(skip).Take(take))));

A.CallTo(() => _portalRepositories.GetInstance<IServiceAccountRepository>()).Returns(_serviceAccountRepository);
var sut = new ServiceAccountBusinessLogic(_provisioningManager, _portalRepositories, _options, null!, _identityService);

// Act
var result = await sut.GetOwnCompanyServiceAccountsDataAsync(1, 10, null, null).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsDataAsync(1, 10, null, null, isUserStatusActive).ConfigureAwait(false);

// Assert
result.Should().NotBeNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
using Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLogic;
using Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Controllers;
using Org.Eclipse.TractusX.Portal.Backend.Administration.Service.Models;
using Org.Eclipse.TractusX.Portal.Backend.Framework.Models;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Models;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities;
Expand Down Expand Up @@ -92,4 +93,35 @@ public async Task GetServiceAccountRolesAsync_CallsExpected()
result.Should().NotBeNull();
result.Should().HaveCount(5);
}

[Fact]
public async Task GetServiceAccountDetails_CallsExpected()
{
// Arrange
var serviceAcountId = _fixture.Create<Guid>();

// Act
await _controller.GetServiceAccountDetails(serviceAcountId).ConfigureAwait(false);

// Assert
A.CallTo(() => _logic.GetOwnCompanyServiceAccountDetailsAsync(serviceAcountId)).MustHaveHappenedOnceExactly();

}

[Fact]
public async Task GetServiceAccountsData_CallsExpected()
{
//Arrange
var paginationResponse = new Pagination.Response<CompanyServiceAccountData>(new Pagination.Metadata(15, 1, 1, 15), _fixture.CreateMany<CompanyServiceAccountData>(5));
A.CallTo(() => _logic.GetOwnCompanyServiceAccountsDataAsync(0, 15, null, null, true))
.Returns(paginationResponse);

//Act
var result = await this._controller.GetServiceAccountsData(0, 15, null, null, true).ConfigureAwait(false);

//Assert
A.CallTo(() => _logic.GetOwnCompanyServiceAccountsDataAsync(0, 15, null, null, true)).MustHaveHappenedOnceExactly();
Assert.IsType<Pagination.Response<CompanyServiceAccountData>>(result);
result.Content.Should().HaveCount(5);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,14 @@
"offer_subscription_id": null,
"company_id": "729e0af2-6723-4a7f-85a1-833d84b39bdf",
"client_client_id": "sa-x-inactive"
},
{
"id": "38c92162-6328-40ce-80f3-22e3f3e9b94e",
"name": "test-user-service-account-0",
"description": "test-user-service-account-desc-0",
"company_service_account_type_id": 1,
"offer_subscription_id": null,
"company_id": "729e0af2-6723-4a7f-85a1-833d84b39bdf",
"client_client_id": "sa-x-0"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -158,5 +158,14 @@
"user_status_id": 2,
"user_entity_id": null,
"identity_type_id": 2
},
{
"id": "38c92162-6328-40ce-80f3-22e3f3e9b94e",
"date_created": "2022-06-01 18:01:33.439000 +00:00",
"company_id": "729e0af2-6723-4a7f-85a1-833d84b39bdf",
"user_status_id": 1,
"user_entity_id": "3d8142f1-860b-48aa-8c2b-1ccb18699f66",
"identity_type_id": 2,
"last_editor_id":"8b42e6de-7b59-4217-a63c-198e83d93777"
}
]
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,8 @@ public async Task GetOwnCompanyServiceAccountDetailedDataUntrackedAsync_ReturnsE
// Assert
result.Should().NotBeNull();
result!.CompanyServiceAccountTypeId.Should().Be(CompanyServiceAccountTypeId.OWN);
result.CompanyLastEditorData!.CompanyName.Should().Be("CX-Test-Access");
result.CompanyLastEditorData.Name.Should().Be("CX Admin");
}

[Fact]
Expand Down Expand Up @@ -228,7 +230,7 @@ public async Task GetOwnCompanyServiceAccountsUntracked_ReturnsExpectedResult(in
var newvalidCompanyId = new Guid("41fd2ab8-71cd-4546-9bef-a388d91b2542");
var (sut, _) = await CreateSut().ConfigureAwait(false);
// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(newvalidCompanyId, null, null)(page, size).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsUntracked(newvalidCompanyId, null, null, UserStatusId.ACTIVE)(page, size).ConfigureAwait(false);

// Assert
result.Should().NotBeNull();
Expand All @@ -248,7 +250,7 @@ public async Task GetOwnCompanyServiceAccountsUntracked_WithClientIdAndOwner_Ret
var (sut, _) = await CreateSut().ConfigureAwait(false);

// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl5-custodian-1", true)(0, 10).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl5-custodian-1", true, UserStatusId.ACTIVE)(0, 10).ConfigureAwait(false);

// Assert
result!.Count.Should().Be(1);
Expand All @@ -263,7 +265,7 @@ public async Task GetOwnCompanyServiceAccountsUntracked_WithClientIdAndProvider_
var (sut, _) = await CreateSut().ConfigureAwait(false);

// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(new("41fd2ab8-71cd-4546-9bef-a388d91b2543"), "sa-x-2", false)(0, 10).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsUntracked(new("41fd2ab8-71cd-4546-9bef-a388d91b2543"), "sa-x-2", false, UserStatusId.ACTIVE)(0, 10).ConfigureAwait(false);

// Assert
result!.Count.Should().Be(1);
Expand All @@ -278,7 +280,7 @@ public async Task GetOwnCompanyServiceAccountsUntracked_WithOnlyClientId_Returns
var (sut, _) = await CreateSut().ConfigureAwait(false);

// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl5-custodian-1", null)(0, 10).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl5-custodian-1", null, UserStatusId.ACTIVE)(0, 10).ConfigureAwait(false);

// Assert
result!.Count.Should().Be(1);
Expand All @@ -293,13 +295,31 @@ public async Task GetOwnCompanyServiceAccountsUntracked_WithSearch_ReturnsExpect
var (sut, _) = await CreateSut().ConfigureAwait(false);

// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl", null)(0, 10).ConfigureAwait(false);
var result = await sut.GetOwnCompanyServiceAccountsUntracked(_validCompanyId, "sa-cl", null, UserStatusId.ACTIVE)(0, 10).ConfigureAwait(false);

// Assert
result!.Count.Should().Be(11);
result.Data.Should().HaveCount(10);
}

[Fact]
public async Task GetOwnCompanyServiceAccountsUntracked_WithUserStatusId_InActive_ReturnsExpectedResult()
{
// Arrange
var (sut, _) = await CreateSut().ConfigureAwait(false);

// Act
var result = await sut.GetOwnCompanyServiceAccountsUntracked(new Guid("729e0af2-6723-4a7f-85a1-833d84b39bdf"), null, null, UserStatusId.INACTIVE)(0, 10).ConfigureAwait(false);

// Assert
result!.Count.Should().Be(1);
result.Data.Should().HaveCount(1)
.And.Satisfy(x =>
x.ServiceAccountId == new Guid("38c92162-6328-40ce-80f3-22e3f3e9b94d")
&& x.ClientId == "sa-x-inactive"
&& x.CompanyServiceAccountTypeId == CompanyServiceAccountTypeId.MANAGED);
}

#endregion

#region CheckActiveServiceAccountExistsForCompanyAsync
Expand Down

0 comments on commit d0639fa

Please sign in to comment.