From 0f28ac45f9e052dc36259157c8c84a019f5caa3f Mon Sep 17 00:00:00 2001 From: Chad Scharf <3904944+cscharf@users.noreply.github.com> Date: Thu, 18 Jun 2020 10:41:55 -0400 Subject: [PATCH] Consistency on TaxInfo use in service params --- src/Api/Controllers/AccountsController.cs | 21 +++++---- src/Core/Services/IPaymentService.cs | 4 +- src/Core/Services/IUserService.cs | 4 +- .../Implementations/StripePaymentService.cs | 44 +++++++++++-------- .../Services/Implementations/UserService.cs | 8 ++-- 5 files changed, 46 insertions(+), 35 deletions(-) diff --git a/src/Api/Controllers/AccountsController.cs b/src/Api/Controllers/AccountsController.cs index 168af1a4a1..cb4630d007 100644 --- a/src/Api/Controllers/AccountsController.cs +++ b/src/Api/Controllers/AccountsController.cs @@ -467,7 +467,8 @@ namespace Bit.Api.Controllers { license = await ApiHelpers.ReadJsonFileFromBody(HttpContext, model.License); } - else if (!valid && !_globalSettings.SelfHosted) + + if (!valid && !_globalSettings.SelfHosted && string.IsNullOrWhiteSpace(model.Country)) { throw new BadRequestException("Country is required."); } @@ -479,7 +480,11 @@ namespace Bit.Api.Controllers var result = await _userService.SignUpPremiumAsync(user, model.PaymentToken, model.PaymentMethodType.Value, model.AdditionalStorageGb.GetValueOrDefault(0), license, - model.Country, model.PostalCode); + new TaxInfo + { + BillingAddressCountry = model.Country, + BillingAddressPostalCode = model.PostalCode, + }); var profile = new ProfileResponseModel(user, null, await _userService.TwoFactorIsEnabledAsync(user)); return new PaymentResponseModel { @@ -539,12 +544,12 @@ namespace Bit.Api.Controllers throw new UnauthorizedAccessException(); } - await _paymentService.SaveTaxInfoAsync(user, new TaxInfo - { - BillingAddressCountry = model.Country, - BillingAddressPostalCode = model.PostalCode, - }); - await _userService.ReplacePaymentMethodAsync(user, model.PaymentToken, model.PaymentMethodType.Value); + await _userService.ReplacePaymentMethodAsync(user, model.PaymentToken, model.PaymentMethodType.Value, + new TaxInfo + { + BillingAddressCountry = model.Country, + BillingAddressPostalCode = model.PostalCode, + }); } [HttpPost("storage")] diff --git a/src/Core/Services/IPaymentService.cs b/src/Core/Services/IPaymentService.cs index 166fb23c6c..b9b688ff09 100644 --- a/src/Core/Services/IPaymentService.cs +++ b/src/Core/Services/IPaymentService.cs @@ -14,13 +14,13 @@ namespace Bit.Core.Services Task UpgradeFreeOrganizationAsync(Organization org, Models.StaticStore.Plan plan, short additionalStorageGb, short additionalSeats, bool premiumAccessAddon); Task PurchasePremiumAsync(User user, PaymentMethodType paymentMethodType, string paymentToken, - short additionalStorageGb, string country, string postalCode); + short additionalStorageGb, TaxInfo taxInfo); Task AdjustStorageAsync(IStorableSubscriber storableSubscriber, int additionalStorage, string storagePlanId); Task CancelSubscriptionAsync(ISubscriber subscriber, bool endOfPeriod = false, bool skipInAppPurchaseCheck = false); Task ReinstateSubscriptionAsync(ISubscriber subscriber); Task UpdatePaymentMethodAsync(ISubscriber subscriber, PaymentMethodType paymentMethodType, - string paymentToken, bool allowInAppPurchases = false); + string paymentToken, bool allowInAppPurchases = false, TaxInfo taxInfo = null); Task CreditAccountAsync(ISubscriber subscriber, decimal creditAmount); Task GetBillingAsync(ISubscriber subscriber); Task GetSubscriptionAsync(ISubscriber subscriber); diff --git a/src/Core/Services/IUserService.cs b/src/Core/Services/IUserService.cs index 5e51183c3e..ccea70a45b 100644 --- a/src/Core/Services/IUserService.cs +++ b/src/Core/Services/IUserService.cs @@ -47,11 +47,11 @@ namespace Bit.Core.Services Task SendDeleteConfirmationAsync(string email); Task> SignUpPremiumAsync(User user, string paymentToken, PaymentMethodType paymentMethodType, short additionalStorageGb, UserLicense license, - string country, string postalCode); + TaxInfo taxInfo); Task IapCheckAsync(User user, PaymentMethodType paymentMethodType); Task UpdateLicenseAsync(User user, UserLicense license); Task AdjustStorageAsync(User user, short storageAdjustmentGb); - Task ReplacePaymentMethodAsync(User user, string paymentToken, PaymentMethodType paymentMethodType); + Task ReplacePaymentMethodAsync(User user, string paymentToken, PaymentMethodType paymentMethodType, TaxInfo taxInfo); Task CancelPremiumAsync(User user, bool? endOfPeriod = null, bool accountDelete = false); Task ReinstatePremiumAsync(User user); Task EnablePremiumAsync(Guid userId, DateTime? expirationDate); diff --git a/src/Core/Services/Implementations/StripePaymentService.cs b/src/Core/Services/Implementations/StripePaymentService.cs index 357c8ea83d..2326544826 100644 --- a/src/Core/Services/Implementations/StripePaymentService.cs +++ b/src/Core/Services/Implementations/StripePaymentService.cs @@ -345,7 +345,7 @@ namespace Bit.Core.Services } public async Task PurchasePremiumAsync(User user, PaymentMethodType paymentMethodType, - string paymentToken, short additionalStorageGb, string country, string postalCode) + string paymentToken, short additionalStorageGb, TaxInfo taxInfo) { if (paymentMethodType != PaymentMethodType.Credit && string.IsNullOrWhiteSpace(paymentToken)) { @@ -393,7 +393,7 @@ namespace Bit.Core.Services { try { - await UpdatePaymentMethodAsync(user, paymentMethodType, paymentToken, true); + await UpdatePaymentMethodAsync(user, paymentMethodType, paymentToken, true, taxInfo); } catch (Exception e) { @@ -467,24 +467,12 @@ namespace Bit.Core.Services Address = new AddressOptions { Line1 = string.Empty, - Country = country, - PostalCode = postalCode, + Country = taxInfo.BillingAddressCountry, + PostalCode = taxInfo.BillingAddressPostalCode, }, }); createdStripeCustomer = true; } - else if (customer != null) - { - await customerService.UpdateAsync(customer.Id, new CustomerUpdateOptions - { - Address = new AddressOptions - { - Line1 = string.Empty, - Country = country, - PostalCode = postalCode, - } - }); - } if (customer == null) { @@ -1116,7 +1104,7 @@ namespace Bit.Core.Services } public async Task UpdatePaymentMethodAsync(ISubscriber subscriber, PaymentMethodType paymentMethodType, - string paymentToken, bool allowInAppPurchases = false) + string paymentToken, bool allowInAppPurchases = false, TaxInfo taxInfo = null) { if (subscriber == null) { @@ -1304,7 +1292,16 @@ namespace Bit.Core.Services InvoiceSettings = new CustomerInvoiceSettingsOptions { DefaultPaymentMethod = stipeCustomerPaymentMethodId - } + }, + Address = taxInfo == null ? null : new AddressOptions + { + Country = taxInfo.BillingAddressCountry, + PostalCode = taxInfo.BillingAddressPostalCode, + Line1 = taxInfo.BillingAddressLine1 ?? string.Empty, + Line2 = taxInfo.BillingAddressLine2, + City = taxInfo.BillingAddressCity, + State = taxInfo.BillingAddressState, + }, }); subscriber.Gateway = GatewayType.Stripe; @@ -1363,7 +1360,16 @@ namespace Bit.Core.Services InvoiceSettings = new CustomerInvoiceSettingsOptions { DefaultPaymentMethod = defaultPaymentMethodId - } + }, + Address = taxInfo == null ? null : new AddressOptions + { + Country = taxInfo.BillingAddressCountry, + PostalCode = taxInfo.BillingAddressPostalCode, + Line1 = taxInfo.BillingAddressLine1 ?? string.Empty, + Line2 = taxInfo.BillingAddressLine2, + City = taxInfo.BillingAddressCity, + State = taxInfo.BillingAddressState, + }, }); } } diff --git a/src/Core/Services/Implementations/UserService.cs b/src/Core/Services/Implementations/UserService.cs index 0a2a7452f1..cfbb648883 100644 --- a/src/Core/Services/Implementations/UserService.cs +++ b/src/Core/Services/Implementations/UserService.cs @@ -704,7 +704,7 @@ namespace Bit.Core.Services public async Task> SignUpPremiumAsync(User user, string paymentToken, PaymentMethodType paymentMethodType, short additionalStorageGb, UserLicense license, - string country, string postalCode) + TaxInfo taxInfo) { if (user.Premium) { @@ -743,7 +743,7 @@ namespace Bit.Core.Services else { paymentIntentClientSecret = await _paymentService.PurchasePremiumAsync(user, paymentMethodType, - paymentToken, additionalStorageGb, country, postalCode); + paymentToken, additionalStorageGb, taxInfo); } user.Premium = true; @@ -845,14 +845,14 @@ namespace Bit.Core.Services return secret; } - public async Task ReplacePaymentMethodAsync(User user, string paymentToken, PaymentMethodType paymentMethodType) + public async Task ReplacePaymentMethodAsync(User user, string paymentToken, PaymentMethodType paymentMethodType, TaxInfo taxInfo) { if (paymentToken.StartsWith("btok_")) { throw new BadRequestException("Invalid token."); } - var updated = await _paymentService.UpdatePaymentMethodAsync(user, paymentMethodType, paymentToken); + var updated = await _paymentService.UpdatePaymentMethodAsync(user, paymentMethodType, paymentToken, taxInfo: taxInfo); if (updated) { await SaveUserAsync(user);