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;