From 753d1311d490b9b9dda881b973bf9c04d1f476d6 Mon Sep 17 00:00:00 2001 From: Rui Tome Date: Fri, 2 May 2025 12:09:37 +0100 Subject: [PATCH] Rename ProviderClientOrganizationSignUpCommand --- ...SignUpProviderClientOrganizationCommand.cs | 15 ----- ...roviderClientOrganizationSignUpCommand.cs} | 58 +++++++++---------- ...erClientOrganizationSignUpCommandTests.cs} | 28 ++++----- 3 files changed, 42 insertions(+), 59 deletions(-) delete mode 100644 src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/ISignUpProviderClientOrganizationCommand.cs rename src/Core/AdminConsole/OrganizationFeatures/Organizations/{SignUpProviderClientOrganizationCommand.cs => ProviderClientOrganizationSignUpCommand.cs} (76%) rename test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/{SignUpProviderClientOrganizationCommandTests.cs => OrganizationSignUp/ProviderClientOrganizationSignUpCommandTests.cs} (87%) diff --git a/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/ISignUpProviderClientOrganizationCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/ISignUpProviderClientOrganizationCommand.cs deleted file mode 100644 index 241698b41f..0000000000 --- a/src/Core/AdminConsole/OrganizationFeatures/Organizations/Interfaces/ISignUpProviderClientOrganizationCommand.cs +++ /dev/null @@ -1,15 +0,0 @@ -using Bit.Core.AdminConsole.Entities; -using Bit.Core.Entities; -using Bit.Core.Models.Business; - -namespace Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces; - -public interface ISignUpProviderClientOrganizationCommand -{ - /// - /// Sign up a new client organization for a provider. - /// - /// The signup information. - /// A tuple containing the new organization and its default collection. - Task<(Organization organization, Collection defaultCollection)> SignUpClientOrganizationAsync(OrganizationSignup signup); -} diff --git a/src/Core/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommand.cs b/src/Core/AdminConsole/OrganizationFeatures/Organizations/ProviderClientOrganizationSignUpCommand.cs similarity index 76% rename from src/Core/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommand.cs rename to src/Core/AdminConsole/OrganizationFeatures/Organizations/ProviderClientOrganizationSignUpCommand.cs index eb89214466..642e94636f 100644 --- a/src/Core/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommand.cs +++ b/src/Core/AdminConsole/OrganizationFeatures/Organizations/ProviderClientOrganizationSignUpCommand.cs @@ -1,5 +1,4 @@ using Bit.Core.AdminConsole.Entities; -using Bit.Core.AdminConsole.OrganizationFeatures.Organizations.Interfaces; using Bit.Core.Billing.Pricing; using Bit.Core.Context; using Bit.Core.Entities; @@ -16,7 +15,21 @@ using Bit.Core.Utilities; namespace Bit.Core.AdminConsole.OrganizationFeatures.Organizations; -public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrganizationCommand +public record ProviderClientOrganizationSignUpResponse( + Organization Organization, + Collection DefaultCollection); + +public interface IProviderClientOrganizationSignUpCommand +{ + /// + /// Sign up a new client organization for a provider. + /// + /// The signup information. + /// A tuple containing the new organization and its default collection. + Task SignUpClientOrganizationAsync(OrganizationSignup signup); +} + +public class ProviderClientOrganizationSignUpCommand : IProviderClientOrganizationSignUpCommand { private readonly ICurrentContext _currentContext; private readonly IPricingClient _pricingClient; @@ -25,19 +38,15 @@ public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrga private readonly IOrganizationApiKeyRepository _organizationApiKeyRepository; private readonly IApplicationCacheService _applicationCacheService; private readonly ICollectionRepository _collectionRepository; - private readonly IDeviceRepository _deviceRepository; - private readonly IPaymentService _paymentService; - public SignUpProviderClientOrganizationCommand( + public ProviderClientOrganizationSignUpCommand( ICurrentContext currentContext, IPricingClient pricingClient, IReferenceEventService referenceEventService, IOrganizationRepository organizationRepository, IOrganizationApiKeyRepository organizationApiKeyRepository, IApplicationCacheService applicationCacheService, - ICollectionRepository collectionRepository, - IDeviceRepository deviceRepository, - IPaymentService paymentService) + ICollectionRepository collectionRepository) { _currentContext = currentContext; _pricingClient = pricingClient; @@ -46,15 +55,13 @@ public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrga _organizationApiKeyRepository = organizationApiKeyRepository; _applicationCacheService = applicationCacheService; _collectionRepository = collectionRepository; - _deviceRepository = deviceRepository; - _paymentService = paymentService; } - public async Task<(Organization organization, Collection defaultCollection)> SignUpClientOrganizationAsync(OrganizationSignup signup) + public async Task SignUpClientOrganizationAsync(OrganizationSignup signup) { var plan = await _pricingClient.GetPlanOrThrow(signup.Plan); - ValidatePlan(plan, signup.AdditionalSeats, "Password Manager"); + ValidatePlan(plan, signup.AdditionalSeats); var organization = new Organization { @@ -101,38 +108,37 @@ public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrga { PlanName = plan.Name, PlanType = plan.Type, - Seats = returnValue.Item1.Seats, + Seats = returnValue.Organization.Seats, SignupInitiationPath = signup.InitiationPath, - Storage = returnValue.Item1.MaxStorageGb, + Storage = returnValue.Organization.MaxStorageGb, }); return returnValue; } - private static void ValidatePlan(Plan plan, int additionalSeats, string productType) + private static void ValidatePlan(Plan plan, int additionalSeats) { if (plan is null) { - throw new BadRequestException($"{productType} Plan was null."); + throw new BadRequestException("Password Manager Plan was null."); } if (plan.Disabled) { - throw new BadRequestException($"{productType} Plan not found."); + throw new BadRequestException("Password Manager Plan is disabled."); } if (additionalSeats < 0) { - throw new BadRequestException($"You can't subtract {productType} seats!"); + throw new BadRequestException("You can't subtract Password Manager seats!"); } } /// /// Private helper method to create a new organization. - /// This is common code used by both the cloud and self-hosted methods. /// - private async Task<(Organization organization, Collection defaultCollection)> SignUpAsync(Organization organization, - string collectionName) + private async Task SignUpAsync( + Organization organization, string collectionName) { try { @@ -160,7 +166,7 @@ public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrga await _collectionRepository.CreateAsync(defaultCollection, null, null); } - return (organization, defaultCollection); + return new ProviderClientOrganizationSignUpResponse(organization, defaultCollection); } catch { @@ -173,12 +179,4 @@ public class SignUpProviderClientOrganizationCommand : ISignUpProviderClientOrga throw; } } - - private async Task> GetUserDeviceIdsAsync(Guid userId) - { - var devices = await _deviceRepository.GetManyByUserIdAsync(userId); - return devices - .Where(d => !string.IsNullOrWhiteSpace(d.PushToken)) - .Select(d => d.Id.ToString()); - } } diff --git a/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommandTests.cs b/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationSignUp/ProviderClientOrganizationSignUpCommandTests.cs similarity index 87% rename from test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommandTests.cs rename to test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationSignUp/ProviderClientOrganizationSignUpCommandTests.cs index 2bc6703b7c..936a63d9ca 100644 --- a/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/SignUpProviderClientOrganizationCommandTests.cs +++ b/test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationSignUp/ProviderClientOrganizationSignUpCommandTests.cs @@ -19,10 +19,10 @@ using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using Xunit; -namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.Organizations; +namespace Bit.Core.Test.AdminConsole.OrganizationFeatures.Organizations.OrganizationSignUp; [SutProviderCustomize] -public class SignUpProviderClientOrganizationCommandTests +public class ProviderClientOrganizationSignUpCommandTests { [Theory] [BitAutoData(PlanType.TeamsAnnually)] @@ -33,7 +33,7 @@ public class SignUpProviderClientOrganizationCommandTests PlanType planType, OrganizationSignup signup, string collectionName, - SutProvider sutProvider) + SutProvider sutProvider) { signup.Plan = planType; signup.AdditionalSeats = 15; @@ -46,9 +46,9 @@ public class SignUpProviderClientOrganizationCommandTests var result = await sutProvider.Sut.SignUpClientOrganizationAsync(signup); - Assert.NotNull(result.organization); - Assert.NotNull(result.defaultCollection); - Assert.Equal(collectionName, result.defaultCollection.Name); + Assert.NotNull(result.Organization); + Assert.NotNull(result.DefaultCollection); + Assert.Equal(collectionName, result.DefaultCollection.Name); await sutProvider.GetDependency() .Received(1) @@ -71,8 +71,8 @@ public class SignUpProviderClientOrganizationCommandTests referenceEvent.Type == ReferenceEventType.Signup && referenceEvent.PlanName == plan.Name && referenceEvent.PlanType == plan.Type && - referenceEvent.Seats == result.organization.Seats && - referenceEvent.Storage == result.organization.MaxStorageGb && + referenceEvent.Seats == result.Organization.Seats && + referenceEvent.Storage == result.Organization.MaxStorageGb && referenceEvent.SignupInitiationPath == signup.InitiationPath )); @@ -81,7 +81,7 @@ public class SignUpProviderClientOrganizationCommandTests .CreateAsync( Arg.Is(c => c.Name == collectionName && - c.OrganizationId == result.organization.Id + c.OrganizationId == result.Organization.Id ), Arg.Any>(), Arg.Any>() @@ -91,21 +91,21 @@ public class SignUpProviderClientOrganizationCommandTests .Received(1) .CreateAsync( Arg.Is(k => - k.OrganizationId == result.organization.Id && + k.OrganizationId == result.Organization.Id && k.Type == OrganizationApiKeyType.Default ) ); await sutProvider.GetDependency() .Received(1) - .UpsertOrganizationAbilityAsync(Arg.Is(o => o.Id == result.organization.Id)); + .UpsertOrganizationAbilityAsync(Arg.Is(o => o.Id == result.Organization.Id)); } [Theory] [BitAutoData] public async Task SignupClientAsync_NullPlan_ThrowsBadRequestException( OrganizationSignup signup, - SutProvider sutProvider) + SutProvider sutProvider) { sutProvider.GetDependency() .GetPlanOrThrow(signup.Plan) @@ -121,7 +121,7 @@ public class SignUpProviderClientOrganizationCommandTests [BitAutoData] public async Task SignupClientAsync_NegativeAdditionalSeats_ThrowsBadRequestException( OrganizationSignup signup, - SutProvider sutProvider) + SutProvider sutProvider) { signup.Plan = PlanType.TeamsMonthly; signup.AdditionalSeats = -5; @@ -142,7 +142,7 @@ public class SignUpProviderClientOrganizationCommandTests public async Task SignupClientAsync_WhenExceptionIsThrown_CleanupIsPerformed( PlanType planType, OrganizationSignup signup, - SutProvider sutProvider) + SutProvider sutProvider) { signup.Plan = planType;