From e8ad23c8bc5a06fbdc3915f1e7c63c9d618e8da9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rui=20Tom=C3=A9?= <108268980+r-tome@users.noreply.github.com> Date: Tue, 1 Jul 2025 13:17:53 +0100 Subject: [PATCH] [PM-22442] Remove CollectionService (#6015) * Refactor Collections and OrganizationExport Controllers to Remove ICollectionService Dependency * Remove ICollectionService registration from ServiceCollectionExtensions * Remove CollectionServiceTests file as part of the ongoing refactor to eliminate ICollectionService. * Remove ICollectionService and its implementation in CollectionService as part of the ongoing refactor to eliminate the service. --- src/Api/Controllers/CollectionsController.cs | 3 - .../OrganizationExportController.cs | 3 - src/Core/Services/ICollectionService.cs | 8 --- .../Implementations/CollectionService.cs | 40 ----------- .../Utilities/ServiceCollectionExtensions.cs | 1 - .../Services/CollectionServiceTests.cs | 70 ------------------- 6 files changed, 125 deletions(-) delete mode 100644 src/Core/Services/ICollectionService.cs delete mode 100644 src/Core/Services/Implementations/CollectionService.cs delete mode 100644 test/Core.Test/Services/CollectionServiceTests.cs diff --git a/src/Api/Controllers/CollectionsController.cs b/src/Api/Controllers/CollectionsController.cs index c8a12b9c22..87f53b0891 100644 --- a/src/Api/Controllers/CollectionsController.cs +++ b/src/Api/Controllers/CollectionsController.cs @@ -19,7 +19,6 @@ namespace Bit.Api.Controllers; public class CollectionsController : Controller { private readonly ICollectionRepository _collectionRepository; - private readonly ICollectionService _collectionService; private readonly ICreateCollectionCommand _createCollectionCommand; private readonly IUpdateCollectionCommand _updateCollectionCommand; private readonly IDeleteCollectionCommand _deleteCollectionCommand; @@ -30,7 +29,6 @@ public class CollectionsController : Controller public CollectionsController( ICollectionRepository collectionRepository, - ICollectionService collectionService, ICreateCollectionCommand createCollectionCommand, IUpdateCollectionCommand updateCollectionCommand, IDeleteCollectionCommand deleteCollectionCommand, @@ -40,7 +38,6 @@ public class CollectionsController : Controller IBulkAddCollectionAccessCommand bulkAddCollectionAccessCommand) { _collectionRepository = collectionRepository; - _collectionService = collectionService; _createCollectionCommand = createCollectionCommand; _updateCollectionCommand = updateCollectionCommand; _deleteCollectionCommand = deleteCollectionCommand; diff --git a/src/Api/Tools/Controllers/OrganizationExportController.cs b/src/Api/Tools/Controllers/OrganizationExportController.cs index 520746f139..10b2d87456 100644 --- a/src/Api/Tools/Controllers/OrganizationExportController.cs +++ b/src/Api/Tools/Controllers/OrganizationExportController.cs @@ -19,7 +19,6 @@ public class OrganizationExportController : Controller { private readonly ICurrentContext _currentContext; private readonly IUserService _userService; - private readonly ICollectionService _collectionService; private readonly ICipherService _cipherService; private readonly GlobalSettings _globalSettings; private readonly IFeatureService _featureService; @@ -30,7 +29,6 @@ public class OrganizationExportController : Controller public OrganizationExportController( ICurrentContext currentContext, ICipherService cipherService, - ICollectionService collectionService, IUserService userService, GlobalSettings globalSettings, IFeatureService featureService, @@ -40,7 +38,6 @@ public class OrganizationExportController : Controller { _currentContext = currentContext; _cipherService = cipherService; - _collectionService = collectionService; _userService = userService; _globalSettings = globalSettings; _featureService = featureService; diff --git a/src/Core/Services/ICollectionService.cs b/src/Core/Services/ICollectionService.cs deleted file mode 100644 index 101f3ea23b..0000000000 --- a/src/Core/Services/ICollectionService.cs +++ /dev/null @@ -1,8 +0,0 @@ -using Bit.Core.Entities; - -namespace Bit.Core.Services; - -public interface ICollectionService -{ - Task DeleteUserAsync(Collection collection, Guid organizationUserId); -} diff --git a/src/Core/Services/Implementations/CollectionService.cs b/src/Core/Services/Implementations/CollectionService.cs deleted file mode 100644 index 3b828955af..0000000000 --- a/src/Core/Services/Implementations/CollectionService.cs +++ /dev/null @@ -1,40 +0,0 @@ -#nullable enable - -using Bit.Core.Entities; -using Bit.Core.Exceptions; -using Bit.Core.Repositories; - -namespace Bit.Core.Services; - -public class CollectionService : ICollectionService -{ - private readonly IEventService _eventService; - private readonly IOrganizationUserRepository _organizationUserRepository; - private readonly ICollectionRepository _collectionRepository; - - public CollectionService( - IEventService eventService, - IOrganizationUserRepository organizationUserRepository, - ICollectionRepository collectionRepository) - { - _eventService = eventService; - _organizationUserRepository = organizationUserRepository; - _collectionRepository = collectionRepository; - } - - public async Task DeleteUserAsync(Collection collection, Guid organizationUserId) - { - if (collection.Type == Enums.CollectionType.DefaultUserCollection) - { - throw new BadRequestException("You cannot modify member access for collections with the type as DefaultUserCollection."); - } - - var orgUser = await _organizationUserRepository.GetByIdAsync(organizationUserId); - if (orgUser == null || orgUser.OrganizationId != collection.OrganizationId) - { - throw new NotFoundException(); - } - await _collectionRepository.DeleteUserAsync(collection.Id, organizationUserId); - await _eventService.LogOrganizationUserEventAsync(orgUser, Enums.EventType.OrganizationUser_Updated); - } -} diff --git a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs index 1c4473674c..1e5af42576 100644 --- a/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs +++ b/src/SharedWeb/Utilities/ServiceCollectionExtensions.cs @@ -117,7 +117,6 @@ public static class ServiceCollectionExtensions services.AddTrialInitiationServices(); services.AddOrganizationServices(globalSettings); services.AddPolicyServices(); - services.AddScoped(); services.AddScoped(); services.AddScoped(); services.AddScoped(); diff --git a/test/Core.Test/Services/CollectionServiceTests.cs b/test/Core.Test/Services/CollectionServiceTests.cs deleted file mode 100644 index 118c0fa6b2..0000000000 --- a/test/Core.Test/Services/CollectionServiceTests.cs +++ /dev/null @@ -1,70 +0,0 @@ -using Bit.Core.AdminConsole.Entities; -using Bit.Core.Entities; -using Bit.Core.Enums; -using Bit.Core.Exceptions; -using Bit.Core.Repositories; -using Bit.Core.Services; -using Bit.Core.Test.AutoFixture.OrganizationFixtures; -using Bit.Test.Common.AutoFixture; -using Bit.Test.Common.AutoFixture.Attributes; -using NSubstitute; -using Xunit; - -namespace Bit.Core.Test.Services; - -[SutProviderCustomize] -[OrganizationCustomize] -public class CollectionServiceTest -{ - [Theory, BitAutoData] - public async Task DeleteUserAsync_DeletesValidUserWhoBelongsToCollection(Collection collection, - Organization organization, OrganizationUser organizationUser, SutProvider sutProvider) - { - collection.OrganizationId = organization.Id; - organizationUser.OrganizationId = organization.Id; - sutProvider.GetDependency().GetByIdAsync(organizationUser.Id) - .Returns(organizationUser); - - await sutProvider.Sut.DeleteUserAsync(collection, organizationUser.Id); - - await sutProvider.GetDependency().Received() - .DeleteUserAsync(collection.Id, organizationUser.Id); - await sutProvider.GetDependency().Received().LogOrganizationUserEventAsync(organizationUser, EventType.OrganizationUser_Updated); - } - - [Theory, BitAutoData] - public async Task DeleteUserAsync_InvalidUser_ThrowsNotFound(Collection collection, Organization organization, - OrganizationUser organizationUser, SutProvider sutProvider) - { - collection.OrganizationId = organization.Id; - sutProvider.GetDependency().GetByIdAsync(organizationUser.Id) - .Returns(organizationUser); - - // user not in organization - await Assert.ThrowsAsync(() => - sutProvider.Sut.DeleteUserAsync(collection, organizationUser.Id)); - // invalid user - await Assert.ThrowsAsync(() => sutProvider.Sut.DeleteUserAsync(collection, Guid.NewGuid())); - await sutProvider.GetDependency().DidNotReceiveWithAnyArgs().DeleteUserAsync(default, default); - await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() - .LogOrganizationUserEventAsync(default, default); - } - - [Theory, BitAutoData] - public async Task DeleteUserAsync_WithDefaultUserCollectionType_ThrowsBadRequest(Collection collection, - Organization organization, OrganizationUser organizationUser, SutProvider sutProvider) - { - collection.Type = CollectionType.DefaultUserCollection; - collection.OrganizationId = organization.Id; - organizationUser.OrganizationId = organization.Id; - - var exception = await Assert.ThrowsAsync(() => - sutProvider.Sut.DeleteUserAsync(collection, organizationUser.Id)); - Assert.Contains("You cannot modify member access for collections with the type as DefaultUserCollection.", exception.Message); - - await sutProvider.GetDependency().DidNotReceiveWithAnyArgs().GetByIdAsync(default); - await sutProvider.GetDependency().DidNotReceiveWithAnyArgs().DeleteUserAsync(default, default); - await sutProvider.GetDependency().DidNotReceiveWithAnyArgs() - .LogOrganizationUserEventAsync(default, default); - } -}