1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-01 08:02:49 -05:00

Use invoice to pay if subscription set to invoice (#1571)

* Use invoice to pay if subscription set to invoice

* Apply suggestions from code review

Co-authored-by: Addison Beck <abeck@bitwarden.com>

* PR review

Move to subscriber model for subscription updates.

Co-authored-by: Addison Beck <abeck@bitwarden.com>
This commit is contained in:
Matt Gibson
2021-09-14 09:18:06 -04:00
committed by GitHub
parent cc76d45aef
commit 97b27220dd
4 changed files with 157 additions and 145 deletions

View File

@ -0,0 +1,94 @@
using System.Linq;
using Bit.Core.Models.Table;
using Stripe;
using StaticStore = Bit.Core.Models.StaticStore;
namespace Bit.Core.Models.Business
{
public abstract class SubscriptionUpdate
{
protected abstract string PlanId { get; }
public abstract SubscriptionItemOptions RevertItemOptions(Subscription subscription);
public abstract SubscriptionItemOptions UpgradeItemOptions(Subscription subscription);
protected SubscriptionItem SubscriptionItem(Subscription subscription) =>
subscription.Items?.Data?.FirstOrDefault(i => i.Plan.Id == PlanId);
}
public class SeatSubscriptionUpdate : SubscriptionUpdate
{
private readonly Organization _organization;
private readonly StaticStore.Plan _plan;
private readonly long? _additionalSeats;
protected override string PlanId => _plan.StripeSeatPlanId;
public SeatSubscriptionUpdate(Organization organization, StaticStore.Plan plan, long? additionalSeats)
{
_organization = organization;
_plan = plan;
_additionalSeats = additionalSeats;
}
public override SubscriptionItemOptions UpgradeItemOptions(Subscription subscription)
{
var item = SubscriptionItem(subscription);
return new SubscriptionItemOptions
{
Id = item?.Id,
Plan = PlanId,
Quantity = _additionalSeats,
Deleted = (item?.Id != null && _additionalSeats == 0) ? true : (bool?)null,
};
}
public override SubscriptionItemOptions RevertItemOptions(Subscription subscription)
{
var item = SubscriptionItem(subscription);
return new SubscriptionItemOptions
{
Id = item?.Id,
Plan = PlanId,
Quantity = _organization.Seats,
Deleted = item?.Id != null ? true : (bool?)null,
};
}
}
public class StorageSubscriptionUpdate : SubscriptionUpdate
{
private readonly string _plan;
private readonly long? _additionalStorage;
protected override string PlanId => _plan;
public StorageSubscriptionUpdate(string plan, long? additionalStorage)
{
_plan = plan;
_additionalStorage = additionalStorage;
}
public override SubscriptionItemOptions UpgradeItemOptions(Subscription subscription)
{
var item = SubscriptionItem(subscription);
return new SubscriptionItemOptions
{
Id = item?.Id,
Plan = _plan,
Quantity = _additionalStorage,
Deleted = (item?.Id != null && _additionalStorage == 0) ? true : (bool?)null,
};
}
public override SubscriptionItemOptions RevertItemOptions(Subscription subscription)
{
var item = SubscriptionItem(subscription);
return new SubscriptionItemOptions
{
Id = item?.Id,
Plan = _plan,
Quantity = item?.Quantity ?? 0,
Deleted = item?.Id != null ? true : (bool?)null,
};
}
}
}