Skip to content

Commit f140c7f

Browse files
[PM-11730] Remove feature flag: AC-2476-deprecate-stripe-sources-api (#5201)
* Removed feature flag * Run dotnet format * Fix integration tests
1 parent 99a1dbb commit f140c7f

File tree

9 files changed

+43
-119
lines changed

9 files changed

+43
-119
lines changed

src/Api/Billing/Controllers/OrganizationBillingController.cs

-31
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using Bit.Api.AdminConsole.Models.Request.Organizations;
33
using Bit.Api.Billing.Models.Requests;
44
using Bit.Api.Billing.Models.Responses;
5-
using Bit.Core;
65
using Bit.Core.Billing.Models.Sales;
76
using Bit.Core.Billing.Services;
87
using Bit.Core.Context;
@@ -139,11 +138,6 @@ public async Task<IResult> GetBillingAsync(Guid organizationId)
139138
[HttpGet("payment-method")]
140139
public async Task<IResult> GetPaymentMethodAsync([FromRoute] Guid organizationId)
141140
{
142-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
143-
{
144-
return Error.NotFound();
145-
}
146-
147141
if (!await currentContext.EditPaymentMethods(organizationId))
148142
{
149143
return Error.Unauthorized();
@@ -168,11 +162,6 @@ public async Task<IResult> UpdatePaymentMethodAsync(
168162
[FromRoute] Guid organizationId,
169163
[FromBody] UpdatePaymentMethodRequestBody requestBody)
170164
{
171-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
172-
{
173-
return Error.NotFound();
174-
}
175-
176165
if (!await currentContext.EditPaymentMethods(organizationId))
177166
{
178167
return Error.Unauthorized();
@@ -199,11 +188,6 @@ public async Task<IResult> VerifyBankAccountAsync(
199188
[FromRoute] Guid organizationId,
200189
[FromBody] VerifyBankAccountRequestBody requestBody)
201190
{
202-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
203-
{
204-
return Error.NotFound();
205-
}
206-
207191
if (!await currentContext.EditPaymentMethods(organizationId))
208192
{
209193
return Error.Unauthorized();
@@ -229,11 +213,6 @@ public async Task<IResult> VerifyBankAccountAsync(
229213
[HttpGet("tax-information")]
230214
public async Task<IResult> GetTaxInformationAsync([FromRoute] Guid organizationId)
231215
{
232-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
233-
{
234-
return Error.NotFound();
235-
}
236-
237216
if (!await currentContext.EditPaymentMethods(organizationId))
238217
{
239218
return Error.Unauthorized();
@@ -258,11 +237,6 @@ public async Task<IResult> UpdateTaxInformationAsync(
258237
[FromRoute] Guid organizationId,
259238
[FromBody] TaxInformationRequestBody requestBody)
260239
{
261-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
262-
{
263-
return Error.NotFound();
264-
}
265-
266240
if (!await currentContext.EditPaymentMethods(organizationId))
267241
{
268242
return Error.Unauthorized();
@@ -292,11 +266,6 @@ public async Task<IResult> RestartSubscriptionAsync([FromRoute] Guid organizatio
292266
throw new UnauthorizedAccessException();
293267
}
294268

295-
if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
296-
{
297-
return Error.NotFound();
298-
}
299-
300269
if (!await currentContext.EditPaymentMethods(organizationId))
301270
{
302271
return Error.Unauthorized();

src/Core/AdminConsole/OrganizationFeatures/Organizations/CloudOrganizationSignUpCommand.cs

+2-22
Original file line numberDiff line numberDiff line change
@@ -125,28 +125,8 @@ public async Task<SignUpOrganizationResponse> SignUpOrganizationAsync(Organizati
125125
}
126126
else if (plan.Type != PlanType.Free)
127127
{
128-
if (featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
129-
{
130-
var sale = OrganizationSale.From(organization, signup);
131-
await organizationBillingService.Finalize(sale);
132-
}
133-
else
134-
{
135-
if (signup.PaymentMethodType != null)
136-
{
137-
await paymentService.PurchaseOrganizationAsync(organization, signup.PaymentMethodType.Value,
138-
signup.PaymentToken, plan, signup.AdditionalStorageGb, signup.AdditionalSeats,
139-
signup.PremiumAccessAddon, signup.TaxInfo, signup.IsFromProvider, signup.AdditionalSmSeats.GetValueOrDefault(),
140-
signup.AdditionalServiceAccounts.GetValueOrDefault(), signup.IsFromSecretsManagerTrial);
141-
}
142-
else
143-
{
144-
await paymentService.PurchaseOrganizationNoPaymentMethod(organization, plan, signup.AdditionalSeats,
145-
signup.PremiumAccessAddon, signup.AdditionalSmSeats.GetValueOrDefault(),
146-
signup.AdditionalServiceAccounts.GetValueOrDefault(), signup.IsFromSecretsManagerTrial);
147-
}
148-
149-
}
128+
var sale = OrganizationSale.From(organization, signup);
129+
await organizationBillingService.Finalize(sale);
150130
}
151131

152132
var ownerId = signup.IsFromProvider ? default : signup.Owner.Id;

src/Core/Constants.cs

-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,6 @@ public static class FeatureFlagKeys
137137
public const string NotificationBarAddLoginImprovements = "notification-bar-add-login-improvements";
138138
public const string BlockBrowserInjectionsByDomain = "block-browser-injections-by-domain";
139139
public const string NotificationRefresh = "notification-refresh";
140-
public const string AC2476_DeprecateStripeSourcesAPI = "AC-2476-deprecate-stripe-sources-api";
141140
public const string PersistPopupView = "persist-popup-view";
142141
public const string CipherKeyEncryption = "cipher-key-encryption";
143142
public const string EnableNewCardCombinedExpiryAutofill = "enable-new-card-combined-expiry-autofill";

src/Core/OrganizationFeatures/OrganizationSubscriptions/UpgradeOrganizationPlanCommand.cs

+2-21
Original file line numberDiff line numberDiff line change
@@ -224,27 +224,8 @@ await _organizationUserRepository.GetManyByOrganizationAsync(organization.Id,
224224

225225
if (string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId))
226226
{
227-
if (_featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
228-
{
229-
var sale = OrganizationSale.From(organization, upgrade);
230-
await _organizationBillingService.Finalize(sale);
231-
}
232-
else
233-
{
234-
try
235-
{
236-
paymentIntentClientSecret = await _paymentService.UpgradeFreeOrganizationAsync(organization,
237-
newPlan, upgrade);
238-
success = string.IsNullOrWhiteSpace(paymentIntentClientSecret);
239-
}
240-
catch
241-
{
242-
await _paymentService.CancelAndRecoverChargesAsync(organization);
243-
organization.GatewayCustomerId = null;
244-
await _organizationService.ReplaceAndUpdateCacheAsync(organization);
245-
throw;
246-
}
247-
}
227+
var sale = OrganizationSale.From(organization, upgrade);
228+
await _organizationBillingService.Finalize(sale);
248229
}
249230
else
250231
{

src/Core/Services/Implementations/UserService.cs

+2-12
Original file line numberDiff line numberDiff line change
@@ -933,18 +933,8 @@ public async Task<Tuple<bool, string>> SignUpPremiumAsync(User user, string paym
933933
}
934934
else
935935
{
936-
var deprecateStripeSourcesAPI = _featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI);
937-
938-
if (deprecateStripeSourcesAPI)
939-
{
940-
var sale = PremiumUserSale.From(user, paymentMethodType, paymentToken, taxInfo, additionalStorageGb);
941-
await _premiumUserBillingService.Finalize(sale);
942-
}
943-
else
944-
{
945-
paymentIntentClientSecret = await _paymentService.PurchasePremiumAsync(user, paymentMethodType,
946-
paymentToken, additionalStorageGb, taxInfo);
947-
}
936+
var sale = PremiumUserSale.From(user, paymentMethodType, paymentToken, taxInfo, additionalStorageGb);
937+
await _premiumUserBillingService.Finalize(sale);
948938
}
949939

950940
user.Premium = true;

test/Api.IntegrationTest/Helpers/OrganizationTestHelpers.cs

+7-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,13 @@ public static async Task<Tuple<Organization, OrganizationUser>> SignUpAsync<T>(W
3636
OwnerKey = ownerKey,
3737
Owner = owner,
3838
AdditionalSeats = passwordManagerSeats,
39-
PaymentMethodType = paymentMethod
39+
PaymentMethodType = paymentMethod,
40+
PaymentToken = "TOKEN",
41+
TaxInfo = new TaxInfo
42+
{
43+
BillingAddressCountry = "US",
44+
BillingAddressPostalCode = "12345"
45+
}
4046
});
4147

4248
Debug.Assert(signUpResult.OrganizationUser is not null);

test/Core.Test/AdminConsole/OrganizationFeatures/Organizations/OrganizationSignUp/CloudOrganizationSignUpCommandTests.cs

+23-30
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
using Bit.Core.AdminConsole.Entities;
22
using Bit.Core.AdminConsole.OrganizationFeatures.Organizations;
33
using Bit.Core.Billing.Enums;
4+
using Bit.Core.Billing.Models.Sales;
5+
using Bit.Core.Billing.Services;
46
using Bit.Core.Entities;
57
using Bit.Core.Enums;
68
using Bit.Core.Exceptions;
79
using Bit.Core.Models.Business;
810
using Bit.Core.Models.Data;
9-
using Bit.Core.Models.StaticStore;
1011
using Bit.Core.Repositories;
11-
using Bit.Core.Services;
1212
using Bit.Core.Tools.Enums;
1313
using Bit.Core.Tools.Models.Business;
1414
using Bit.Core.Tools.Services;
@@ -60,20 +60,16 @@ await sutProvider.GetDependency<IReferenceEventService>().Received(1)
6060
Assert.NotNull(result.Organization);
6161
Assert.NotNull(result.OrganizationUser);
6262

63-
await sutProvider.GetDependency<IPaymentService>().Received(1).PurchaseOrganizationAsync(
64-
Arg.Any<Organization>(),
65-
signup.PaymentMethodType.Value,
66-
signup.PaymentToken,
67-
plan,
68-
signup.AdditionalStorageGb,
69-
signup.AdditionalSeats,
70-
signup.PremiumAccessAddon,
71-
signup.TaxInfo,
72-
false,
73-
signup.AdditionalSmSeats.GetValueOrDefault(),
74-
signup.AdditionalServiceAccounts.GetValueOrDefault(),
75-
signup.UseSecretsManager
76-
);
63+
await sutProvider.GetDependency<IOrganizationBillingService>().Received(1).Finalize(
64+
Arg.Is<OrganizationSale>(sale =>
65+
sale.CustomerSetup.TokenizedPaymentSource.Type == signup.PaymentMethodType.Value &&
66+
sale.CustomerSetup.TokenizedPaymentSource.Token == signup.PaymentToken &&
67+
sale.CustomerSetup.TaxInformation.Country == signup.TaxInfo.BillingAddressCountry &&
68+
sale.CustomerSetup.TaxInformation.PostalCode == signup.TaxInfo.BillingAddressPostalCode &&
69+
sale.SubscriptionSetup.Plan == plan &&
70+
sale.SubscriptionSetup.PasswordManagerOptions.Seats == signup.AdditionalSeats &&
71+
sale.SubscriptionSetup.PasswordManagerOptions.Storage == signup.AdditionalStorageGb &&
72+
sale.SubscriptionSetup.SecretsManagerOptions == null));
7773
}
7874

7975
[Theory]
@@ -155,20 +151,17 @@ await sutProvider.GetDependency<IReferenceEventService>().Received(1)
155151
Assert.NotNull(result.Organization);
156152
Assert.NotNull(result.OrganizationUser);
157153

158-
await sutProvider.GetDependency<IPaymentService>().Received(1).PurchaseOrganizationAsync(
159-
Arg.Any<Organization>(),
160-
signup.PaymentMethodType.Value,
161-
signup.PaymentToken,
162-
Arg.Is<Plan>(plan),
163-
signup.AdditionalStorageGb,
164-
signup.AdditionalSeats,
165-
signup.PremiumAccessAddon,
166-
signup.TaxInfo,
167-
false,
168-
signup.AdditionalSmSeats.GetValueOrDefault(),
169-
signup.AdditionalServiceAccounts.GetValueOrDefault(),
170-
signup.IsFromSecretsManagerTrial
171-
);
154+
await sutProvider.GetDependency<IOrganizationBillingService>().Received(1).Finalize(
155+
Arg.Is<OrganizationSale>(sale =>
156+
sale.CustomerSetup.TokenizedPaymentSource.Type == signup.PaymentMethodType.Value &&
157+
sale.CustomerSetup.TokenizedPaymentSource.Token == signup.PaymentToken &&
158+
sale.CustomerSetup.TaxInformation.Country == signup.TaxInfo.BillingAddressCountry &&
159+
sale.CustomerSetup.TaxInformation.PostalCode == signup.TaxInfo.BillingAddressPostalCode &&
160+
sale.SubscriptionSetup.Plan == plan &&
161+
sale.SubscriptionSetup.PasswordManagerOptions.Seats == signup.AdditionalSeats &&
162+
sale.SubscriptionSetup.PasswordManagerOptions.Storage == signup.AdditionalStorageGb &&
163+
sale.SubscriptionSetup.SecretsManagerOptions.Seats == signup.AdditionalSmSeats &&
164+
sale.SubscriptionSetup.SecretsManagerOptions.ServiceAccounts == signup.AdditionalServiceAccounts));
172165
}
173166

174167
[Theory]

test/Core.Test/OrganizationFeatures/OrganizationSubscriptionUpdate/UpgradeOrganizationPlanCommandTests.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,7 @@ await sutProvider.GetDependency<IOrganizationService>().Received(1).ReplaceAndUp
139139
&& o.SmServiceAccounts == plan.SecretsManager.BaseServiceAccount + upgrade.AdditionalServiceAccounts));
140140

141141
Assert.True(result.Item1);
142-
Assert.NotNull(result.Item2);
142+
Assert.Null(result.Item2);
143143
}
144144

145145
[Theory, FreeOrganizationUpgradeCustomize]

test/IntegrationTestCommon/Factories/WebApplicationFactoryBase.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using AspNetCoreRateLimit;
22
using Bit.Core.Auth.Services;
3+
using Bit.Core.Billing.Services;
34
using Bit.Core.Platform.Push;
45
using Bit.Core.Platform.Push.Internal;
56
using Bit.Core.Repositories;
@@ -247,6 +248,11 @@ protected override void ConfigureWebHost(IWebHostBuilder builder)
247248
var stripePaymentService = services.First(sd => sd.ServiceType == typeof(IPaymentService));
248249
services.Remove(stripePaymentService);
249250
services.AddSingleton(Substitute.For<IPaymentService>());
251+
252+
var organizationBillingService =
253+
services.First(sd => sd.ServiceType == typeof(IOrganizationBillingService));
254+
services.Remove(organizationBillingService);
255+
services.AddSingleton(Substitute.For<IOrganizationBillingService>());
250256
});
251257

252258
foreach (var configureTestService in _configureTestServices)

0 commit comments

Comments
 (0)