Skip to content

Commit

Permalink
feat(identity): move identity access from controller to bl (#288)
Browse files Browse the repository at this point in the history
* remove all identity related code from controllers
add identityservice to buisnessLogic to access idenitity
* optimize IdentityService accessing UserPrincipal only once + unit-tests
Refs: CPLP-3101
---------
Co-authored-by: Norbert Truchsess <norbert.truchsess@t-online.de>
Reviewed-by: Norbert Truchsess <norbert.truchsess@t-online.de>
  • Loading branch information
Phil91 authored Oct 11, 2023
1 parent 61dfeb0 commit a67ba94
Show file tree
Hide file tree
Showing 60 changed files with 1,298 additions and 930 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.DBAccess.Repositories;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Entities;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Enums;
using Org.Eclipse.TractusX.Portal.Backend.PortalBackend.PortalEntities.Identities;

namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLogic;

Expand All @@ -35,22 +36,24 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog
public class DocumentsBusinessLogic : IDocumentsBusinessLogic
{
private readonly IPortalRepositories _portalRepositories;
private readonly IIdentityService _identityService;
private readonly DocumentSettings _settings;

/// <summary>
/// Creates a new instance <see cref="DocumentsBusinessLogic"/>
/// </summary>
public DocumentsBusinessLogic(IPortalRepositories portalRepositories, IOptions<DocumentSettings> options)
public DocumentsBusinessLogic(IPortalRepositories portalRepositories, IIdentityService identityService, IOptions<DocumentSettings> options)
{
_portalRepositories = portalRepositories;
_identityService = identityService;
_settings = options.Value;
}

/// <inheritdoc />
public async Task<(string FileName, byte[] Content, string MediaType)> GetDocumentAsync(Guid documentId, Guid companyId)
public async Task<(string FileName, byte[] Content, string MediaType)> GetDocumentAsync(Guid documentId)
{
var documentDetails = await _portalRepositories.GetInstance<IDocumentRepository>()
.GetDocumentDataAndIsCompanyUserAsync(documentId, companyId)
.GetDocumentDataAndIsCompanyUserAsync(documentId, _identityService.IdentityData.CompanyId)
.ConfigureAwait(false);
if (documentDetails == default)
{
Expand Down Expand Up @@ -84,10 +87,10 @@ public DocumentsBusinessLogic(IPortalRepositories portalRepositories, IOptions<D
}

/// <inheritdoc />
public async Task<bool> DeleteDocumentAsync(Guid documentId, Guid companyUserId)
public async Task<bool> DeleteDocumentAsync(Guid documentId)
{
var documentRepository = _portalRepositories.GetInstance<IDocumentRepository>();
var details = await documentRepository.GetDocumentDetailsForIdUntrackedAsync(documentId, companyUserId).ConfigureAwait(false);
var details = await documentRepository.GetDocumentDetailsForIdUntrackedAsync(documentId, _identityService.IdentityData.UserId).ConfigureAwait(false);

if (details.DocumentId == Guid.Empty)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,9 +31,8 @@ public interface IDocumentsBusinessLogic
/// Gets the document with the given id
/// </summary>
/// <param name="documentId">Id of the document to get</param>
/// <param name="companyId">Company of the user</param>
/// <returns>Returns the filename and content of the file</returns>
Task<(string FileName, byte[] Content, string MediaType)> GetDocumentAsync(Guid documentId, Guid companyId);
Task<(string FileName, byte[] Content, string MediaType)> GetDocumentAsync(Guid documentId);

/// <summary>
/// Gets the selfdescription document with the given id
Expand All @@ -46,9 +45,8 @@ public interface IDocumentsBusinessLogic
/// Deletes the document and the corresponding consent from the persistence layer.
/// </summary>
/// <param name="documentId">Id of the document that should be deleted</param>
/// <param name="companyUserId"></param>
/// <returns>Returns <c>true</c> if the document and corresponding consent were deleted successfully. Otherwise a specific error is thrown.</returns>
Task<bool> DeleteDocumentAsync(Guid documentId, Guid companyUserId);
Task<bool> DeleteDocumentAsync(Guid documentId);

/// <summary>
/// Gets the document as json for the seeding data
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,12 @@ public interface IIdentityProviderBusinessLogic
ValueTask<IdentityProviderDetails> SetOwnCompanyIdentityProviderStatusAsync(Guid identityProviderId, bool enabled);
ValueTask<IdentityProviderDetails> UpdateOwnCompanyIdentityProviderAsync(Guid identityProviderId, IdentityProviderEditableDetails details);
ValueTask DeleteCompanyIdentityProviderAsync(Guid identityProviderId);
IAsyncEnumerable<UserIdentityProviderData> GetOwnCompanyUsersIdentityProviderDataAsync(IEnumerable<Guid> identityProviderIds, Guid companyId, bool unlinkedUsersOnly);
(Stream FileStream, string ContentType, string FileName, Encoding Encoding) GetOwnCompanyUsersIdentityProviderLinkDataStream(IEnumerable<Guid> identityProviderIds, Guid companyId, bool unlinkedUsersOnly);
ValueTask<IdentityProviderUpdateStats> UploadOwnCompanyUsersIdentityProviderLinkDataAsync(IFormFile document, Guid companyId, CancellationToken cancellationToken);
ValueTask<UserIdentityProviderLinkData> CreateOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, UserIdentityProviderLinkData identityProviderLinkData, Guid companyId);
ValueTask<UserIdentityProviderLinkData> CreateOrUpdateOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, Guid identityProviderId, UserLinkData userLinkData, Guid companyId);
ValueTask<UserIdentityProviderLinkData> GetOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, Guid identityProviderId, Guid companyId);
ValueTask DeleteOwnCompanyUserIdentityProviderDataAsync(Guid companyUserId, Guid identityProviderId, Guid companyId);
IAsyncEnumerable<UserIdentityProviderData> GetOwnCompanyUsersIdentityProviderDataAsync(IEnumerable<Guid> identityProviderIds, bool unlinkedUsersOnly);
(Stream FileStream, string ContentType, string FileName, Encoding Encoding) GetOwnCompanyUsersIdentityProviderLinkDataStream(IEnumerable<Guid> identityProviderIds, bool unlinkedUsersOnly);
ValueTask<IdentityProviderUpdateStats> UploadOwnCompanyUsersIdentityProviderLinkDataAsync(IFormFile document, CancellationToken cancellationToken);
ValueTask<UserIdentityProviderLinkData> CreateOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, UserIdentityProviderLinkData identityProviderLinkData);
ValueTask<UserIdentityProviderLinkData> CreateOrUpdateOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, Guid identityProviderId, UserLinkData userLinkData);
ValueTask<UserIdentityProviderLinkData> GetOwnCompanyUserIdentityProviderLinkDataAsync(Guid companyUserId, Guid identityProviderId);
ValueTask DeleteOwnCompanyUserIdentityProviderDataAsync(Guid companyUserId, Guid identityProviderId);
ValueTask<IdentityProviderDetailsWithConnectedCompanies> GetOwnIdentityProviderWithConnectedCompanies(Guid identityProviderId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,11 +27,11 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog

public interface IServiceAccountBusinessLogic
{
Task<ServiceAccountDetails> CreateOwnCompanyServiceAccountAsync(ServiceAccountCreationInfo serviceAccountCreationInfos, Guid companyId);
Task<int> DeleteOwnCompanyServiceAccountAsync(Guid serviceAccountId, Guid companyId);
Task<ServiceAccountConnectorOfferData> GetOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId, Guid companyId);
Task<ServiceAccountDetails> UpdateOwnCompanyServiceAccountDetailsAsync(Guid serviceAccountId, ServiceAccountEditableDetails serviceAccountDetails, Guid companyId);
Task<ServiceAccountDetails> ResetOwnCompanyServiceAccountSecretAsync(Guid serviceAccountId, Guid companyId);
Task<Pagination.Response<CompanyServiceAccountData>> GetOwnCompanyServiceAccountsDataAsync(int page, int size, Guid companyId, string? clientId, bool? isOwner);
IAsyncEnumerable<UserRoleWithDescription> GetServiceAccountRolesAsync(Guid companyId, string? languageShortName);
Task<ServiceAccountDetails> CreateOwnCompanyServiceAccountAsync(ServiceAccountCreationInfo serviceAccountCreationInfos);
Task<int> DeleteOwnCompanyServiceAccountAsync(Guid serviceAccountId);
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);
IAsyncEnumerable<UserRoleWithDescription> GetServiceAccountRolesAsync(string? languageShortName);
}
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ public interface ISubscriptionConfigurationBusinessLogic
/// </summary>
/// <param name="companyId">Id of the users company</param>
/// <returns>The detail data</returns>
Task<ProviderDetailReturnData> GetProviderCompanyDetailsAsync(Guid companyId);
Task<ProviderDetailReturnData> GetProviderCompanyDetailsAsync();

/// <summary>
/// Sets service provider company details
/// </summary>
/// <param name="data">Detail data for the service provider</param>
/// <param name="companyId">Id of the users company</param>
Task SetProviderCompanyDetailsAsync(ProviderDetailData data, Guid companyId);
Task SetProviderCompanyDetailsAsync(ProviderDetailData data);
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,26 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog
/// </summary>
public interface IUserBusinessLogic
{
IAsyncEnumerable<string> CreateOwnCompanyUsersAsync(IEnumerable<UserCreationInfo> userList, (Guid UserId, Guid CompanyId) identity);
Task<Guid> CreateOwnCompanyIdpUserAsync(Guid identityProviderId, UserCreationInfoIdp userCreationInfo, (Guid UserId, Guid CompanyId) identity);
Task<Pagination.Response<CompanyUserData>> GetOwnCompanyUserDatasAsync(Guid companyId, int page, int size, GetOwnCompanyUsersFilter filter);
IAsyncEnumerable<string> CreateOwnCompanyUsersAsync(IEnumerable<UserCreationInfo> userList);
Task<Guid> CreateOwnCompanyIdpUserAsync(Guid identityProviderId, UserCreationInfoIdp userCreationInfo);
Task<Pagination.Response<CompanyUserData>> GetOwnCompanyUserDatasAsync(int page, int size, GetOwnCompanyUsersFilter filter);
[Obsolete("to be replaced by UserRolesBusinessLogic.GetAppRolesAsync. Remove as soon frontend is adjusted")]
IAsyncEnumerable<ClientRoles> GetClientRolesAsync(Guid appId, string? languageShortName = null);
Task<CompanyUserDetails> GetOwnCompanyUserDetailsAsync(Guid userId, Guid companyId);
Task<int> AddOwnCompanyUsersBusinessPartnerNumbersAsync(Guid userId, IEnumerable<string> businessPartnerNumbers, Guid companyId);
Task<int> AddOwnCompanyUsersBusinessPartnerNumberAsync(Guid userId, string businessPartnerNumber, Guid companyId);
Task<CompanyOwnUserDetails> GetOwnUserDetails(Guid userId);
Task<CompanyUserDetails> UpdateOwnUserDetails(Guid companyUserId, OwnCompanyUserEditableDetails ownCompanyUserEditableDetails, Guid userId);
Task<CompanyUserDetails> GetOwnCompanyUserDetailsAsync(Guid userId);
Task<int> AddOwnCompanyUsersBusinessPartnerNumbersAsync(Guid userId, IEnumerable<string> businessPartnerNumbers);
Task<int> AddOwnCompanyUsersBusinessPartnerNumberAsync(Guid userId, string businessPartnerNumber);
Task<CompanyOwnUserDetails> GetOwnUserDetails();
Task<CompanyUserDetails> UpdateOwnUserDetails(Guid companyUserId, OwnCompanyUserEditableDetails ownCompanyUserEditableDetails);

/// <summary>
/// Delete User Own Account using userId
/// </summary>
/// <param name="companyUserId"></param>
/// <param name="userId"></param>
/// <returns></returns>
Task<int> DeleteOwnUserAsync(Guid companyUserId, Guid userId);
IAsyncEnumerable<Guid> DeleteOwnCompanyUsersAsync(IEnumerable<Guid> userIds, Guid companyId);
Task<bool> ExecuteOwnCompanyUserPasswordReset(Guid companyUserId, (Guid UserId, Guid CompanyId) identity);
Task<Pagination.Response<CompanyAppUserDetails>> GetOwnCompanyAppUsersAsync(Guid appId, Guid userId, int page, int size, CompanyUserFilter filter);
Task<int> DeleteOwnUserBusinessPartnerNumbersAsync(Guid userId, string businessPartnerNumber, (Guid UserId, Guid CompanyId) identity);
Task<int> DeleteOwnUserAsync(Guid companyUserId);
IAsyncEnumerable<Guid> DeleteOwnCompanyUsersAsync(IEnumerable<Guid> userIds);
Task<bool> ExecuteOwnCompanyUserPasswordReset(Guid companyUserId);
Task<Pagination.Response<CompanyAppUserDetails>> GetOwnCompanyAppUsersAsync(Guid appId, int page, int size, CompanyUserFilter filter);
Task<int> DeleteOwnUserBusinessPartnerNumbersAsync(Guid userId, string businessPartnerNumber);
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,36 +25,33 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog

public interface IUserRolesBusinessLogic
{
IAsyncEnumerable<OfferRoleInfos> GetCoreOfferRoles(Guid companyId, string? languageShortName);
IAsyncEnumerable<OfferRoleInfo> GetAppRolesAsync(Guid appId, Guid companyId, string? languageShortName);
IAsyncEnumerable<OfferRoleInfos> GetCoreOfferRoles(string? languageShortName);
IAsyncEnumerable<OfferRoleInfo> GetAppRolesAsync(Guid appId, string? languageShortName);

/// <summary>
/// Update Role to User
/// </summary>
/// <param name="offerId"></param>
/// <param name="companyUserId"></param>
/// <param name="roles"></param>
/// <param name="companyId">CompanyId of Admin User</param>
/// <returns>messages</returns>
Task<IEnumerable<UserRoleWithId>> ModifyCoreOfferUserRolesAsync(Guid offerId, Guid companyUserId, IEnumerable<string> roles, Guid companyId);
Task<IEnumerable<UserRoleWithId>> ModifyCoreOfferUserRolesAsync(Guid offerId, Guid companyUserId, IEnumerable<string> roles);

/// <summary>
/// Update Role to User
/// </summary>
/// <param name="appId"></param>
/// <param name="companyUserId"></param>
/// <param name="roles"></param>
/// <param name="companyId">CompanyId of Admin User</param>
/// <returns>messages</returns>
Task<IEnumerable<UserRoleWithId>> ModifyAppUserRolesAsync(Guid appId, Guid companyUserId, IEnumerable<string> roles, Guid companyId);
Task<IEnumerable<UserRoleWithId>> ModifyAppUserRolesAsync(Guid appId, Guid companyUserId, IEnumerable<string> roles);

/// <summary>
/// Update Role to User
/// </summary>
/// <param name="appId">app Id</param>
/// <param name="userRoleInfo">User and Role Information like CompanyUser Id and Role Name</param>
/// <param name="companyId">CompanyId of Admin User</param>
/// <returns>messages</returns>
[Obsolete("to be replaced by endpoint UserRolesBusinessLogic.ModifyAppUserRolesAsync. Remove as soon frontend is adjusted")]
Task<IEnumerable<UserRoleWithId>> ModifyUserRoleAsync(Guid appId, UserRoleInfo userRoleInfo, Guid companyId);
Task<IEnumerable<UserRoleWithId>> ModifyUserRoleAsync(Guid appId, UserRoleInfo userRoleInfo);
}
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,6 @@ namespace Org.Eclipse.TractusX.Portal.Backend.Administration.Service.BusinessLog

public interface IUserUploadBusinessLogic
{
ValueTask<UserCreationStats> UploadOwnCompanyIdpUsersAsync(Guid identityProviderId, IFormFile document, (Guid UserId, Guid CompanyId) identity, CancellationToken cancellationToken);
ValueTask<UserCreationStats> UploadOwnCompanySharedIdpUsersAsync(IFormFile document, (Guid UserId, Guid CompanyId) identity, CancellationToken cancellationToken);
ValueTask<UserCreationStats> UploadOwnCompanyIdpUsersAsync(Guid identityProviderId, IFormFile document, CancellationToken cancellationToken);
ValueTask<UserCreationStats> UploadOwnCompanySharedIdpUsersAsync(IFormFile document, CancellationToken cancellationToken);
}
Loading

0 comments on commit a67ba94

Please sign in to comment.