mirror of
https://github.com/bitwarden/server.git
synced 2024-11-28 13:15:12 +01:00
[AC-2706] [Defect] ProviderId does not populate when payment for provider subscription is created/updated (#4138)
* Resolve the issue of not updating the db Signed-off-by: Cy Okeke <cokeke@bitwarden.com> * Resolve the failing test Signed-off-by: Cy Okeke <cokeke@bitwarden.com> --------- Signed-off-by: Cy Okeke <cokeke@bitwarden.com>
This commit is contained in:
parent
9da75fc78f
commit
f73b7c7fa8
@ -1,5 +1,6 @@
|
|||||||
using System.Text;
|
using System.Text;
|
||||||
using Bit.Billing.Models;
|
using Bit.Billing.Models;
|
||||||
|
using Bit.Core.AdminConsole.Repositories;
|
||||||
using Bit.Core.Entities;
|
using Bit.Core.Entities;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
@ -21,6 +22,7 @@ public class PayPalController : Controller
|
|||||||
private readonly IPaymentService _paymentService;
|
private readonly IPaymentService _paymentService;
|
||||||
private readonly ITransactionRepository _transactionRepository;
|
private readonly ITransactionRepository _transactionRepository;
|
||||||
private readonly IUserRepository _userRepository;
|
private readonly IUserRepository _userRepository;
|
||||||
|
private readonly IProviderRepository _providerRepository;
|
||||||
|
|
||||||
public PayPalController(
|
public PayPalController(
|
||||||
IOptions<BillingSettings> billingSettings,
|
IOptions<BillingSettings> billingSettings,
|
||||||
@ -29,7 +31,8 @@ public class PayPalController : Controller
|
|||||||
IOrganizationRepository organizationRepository,
|
IOrganizationRepository organizationRepository,
|
||||||
IPaymentService paymentService,
|
IPaymentService paymentService,
|
||||||
ITransactionRepository transactionRepository,
|
ITransactionRepository transactionRepository,
|
||||||
IUserRepository userRepository)
|
IUserRepository userRepository,
|
||||||
|
IProviderRepository providerRepository)
|
||||||
{
|
{
|
||||||
_billingSettings = billingSettings?.Value;
|
_billingSettings = billingSettings?.Value;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
@ -38,6 +41,7 @@ public class PayPalController : Controller
|
|||||||
_paymentService = paymentService;
|
_paymentService = paymentService;
|
||||||
_transactionRepository = transactionRepository;
|
_transactionRepository = transactionRepository;
|
||||||
_userRepository = userRepository;
|
_userRepository = userRepository;
|
||||||
|
_providerRepository = providerRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost("ipn")]
|
[HttpPost("ipn")]
|
||||||
@ -83,7 +87,7 @@ public class PayPalController : Controller
|
|||||||
|
|
||||||
if (!entityId.HasValue)
|
if (!entityId.HasValue)
|
||||||
{
|
{
|
||||||
_logger.LogError("PayPal IPN ({Id}): 'custom' did not contain a User ID or Organization ID", transactionModel.TransactionId);
|
_logger.LogError("PayPal IPN ({Id}): 'custom' did not contain a User ID or Organization ID or provider ID", transactionModel.TransactionId);
|
||||||
return BadRequest();
|
return BadRequest();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -260,6 +264,17 @@ public class PayPalController : Controller
|
|||||||
billingEmail = user.BillingEmailAddress();
|
billingEmail = user.BillingEmailAddress();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (transaction.ProviderId.HasValue)
|
||||||
|
{
|
||||||
|
var provider = await _providerRepository.GetByIdAsync(transaction.ProviderId.Value);
|
||||||
|
|
||||||
|
if (await _paymentService.CreditAccountAsync(provider, transaction.Amount))
|
||||||
|
{
|
||||||
|
await _providerRepository.ReplaceAsync(provider);
|
||||||
|
|
||||||
|
billingEmail = provider.BillingEmailAddress();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(billingEmail))
|
if (!string.IsNullOrEmpty(billingEmail))
|
||||||
{
|
{
|
||||||
|
@ -582,6 +582,7 @@ public class StripeController : Controller
|
|||||||
CreationDate = refund.Created,
|
CreationDate = refund.Created,
|
||||||
OrganizationId = parentTransaction.OrganizationId,
|
OrganizationId = parentTransaction.OrganizationId,
|
||||||
UserId = parentTransaction.UserId,
|
UserId = parentTransaction.UserId,
|
||||||
|
ProviderId = parentTransaction.ProviderId,
|
||||||
Type = TransactionType.Refund,
|
Type = TransactionType.Refund,
|
||||||
Gateway = GatewayType.Stripe,
|
Gateway = GatewayType.Stripe,
|
||||||
GatewayId = refund.Id,
|
GatewayId = refund.Id,
|
||||||
@ -606,7 +607,7 @@ public class StripeController : Controller
|
|||||||
}
|
}
|
||||||
|
|
||||||
var (organizationId, userId, providerId) = await GetEntityIdsFromChargeAsync(charge);
|
var (organizationId, userId, providerId) = await GetEntityIdsFromChargeAsync(charge);
|
||||||
if (!organizationId.HasValue && !userId.HasValue)
|
if (!organizationId.HasValue && !userId.HasValue && !providerId.HasValue)
|
||||||
{
|
{
|
||||||
_logger.LogWarning("Charge success has no subscriber ids. {ChargeId}", charge.Id);
|
_logger.LogWarning("Charge success has no subscriber ids. {ChargeId}", charge.Id);
|
||||||
return;
|
return;
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using Bit.Billing.Controllers;
|
using Bit.Billing.Controllers;
|
||||||
using Bit.Billing.Test.Utilities;
|
using Bit.Billing.Test.Utilities;
|
||||||
using Bit.Core.AdminConsole.Entities;
|
using Bit.Core.AdminConsole.Entities;
|
||||||
|
using Bit.Core.AdminConsole.Repositories;
|
||||||
using Bit.Core.Entities;
|
using Bit.Core.Entities;
|
||||||
using Bit.Core.Enums;
|
using Bit.Core.Enums;
|
||||||
using Bit.Core.Repositories;
|
using Bit.Core.Repositories;
|
||||||
@ -32,6 +33,7 @@ public class PayPalControllerTests
|
|||||||
private readonly IPaymentService _paymentService = Substitute.For<IPaymentService>();
|
private readonly IPaymentService _paymentService = Substitute.For<IPaymentService>();
|
||||||
private readonly ITransactionRepository _transactionRepository = Substitute.For<ITransactionRepository>();
|
private readonly ITransactionRepository _transactionRepository = Substitute.For<ITransactionRepository>();
|
||||||
private readonly IUserRepository _userRepository = Substitute.For<IUserRepository>();
|
private readonly IUserRepository _userRepository = Substitute.For<IUserRepository>();
|
||||||
|
private readonly IProviderRepository _providerRepository = Substitute.For<IProviderRepository>();
|
||||||
|
|
||||||
private const string _defaultWebhookKey = "webhook-key";
|
private const string _defaultWebhookKey = "webhook-key";
|
||||||
|
|
||||||
@ -110,7 +112,7 @@ public class PayPalControllerTests
|
|||||||
|
|
||||||
HasStatusCode(result, 400);
|
HasStatusCode(result, 400);
|
||||||
|
|
||||||
LoggedError(logger, "PayPal IPN (2PK15573S8089712Y): 'custom' did not contain a User ID or Organization ID");
|
LoggedError(logger, "PayPal IPN (2PK15573S8089712Y): 'custom' did not contain a User ID or Organization ID or provider ID");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -542,7 +544,8 @@ public class PayPalControllerTests
|
|||||||
_organizationRepository,
|
_organizationRepository,
|
||||||
_paymentService,
|
_paymentService,
|
||||||
_transactionRepository,
|
_transactionRepository,
|
||||||
_userRepository);
|
_userRepository,
|
||||||
|
_providerRepository);
|
||||||
|
|
||||||
var httpContext = new DefaultHttpContext();
|
var httpContext = new DefaultHttpContext();
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user