Phase 7C User Delete
This commit is contained in:
parent
88f8894e87
commit
c88dde3693
@ -6,6 +6,7 @@ namespace PlotLine.Services;
|
|||||||
public interface ISubscriptionService
|
public interface ISubscriptionService
|
||||||
{
|
{
|
||||||
Task<UserSubscriptionDetail?> GetCurrentSubscriptionAsync(int userId);
|
Task<UserSubscriptionDetail?> GetCurrentSubscriptionAsync(int userId);
|
||||||
|
Task<bool> HasPaidBillingRiskAsync(int userId);
|
||||||
Task<SubscriptionLevel?> GetSubscriptionLevelAsync(int subscriptionLevelId);
|
Task<SubscriptionLevel?> GetSubscriptionLevelAsync(int subscriptionLevelId);
|
||||||
Task<IReadOnlyList<SubscriptionLevel>> GetActiveSubscriptionLevelsAsync();
|
Task<IReadOnlyList<SubscriptionLevel>> GetActiveSubscriptionLevelsAsync();
|
||||||
Task<SubscriptionLimitResult> CanCreateBookAsync(int userId);
|
Task<SubscriptionLimitResult> CanCreateBookAsync(int userId);
|
||||||
@ -25,6 +26,12 @@ public sealed class SubscriptionService(ISubscriptionRepository subscriptions, I
|
|||||||
public Task<UserSubscriptionDetail?> GetCurrentSubscriptionAsync(int userId) =>
|
public Task<UserSubscriptionDetail?> GetCurrentSubscriptionAsync(int userId) =>
|
||||||
subscriptions.GetCurrentSubscriptionAsync(userId);
|
subscriptions.GetCurrentSubscriptionAsync(userId);
|
||||||
|
|
||||||
|
public async Task<bool> HasPaidBillingRiskAsync(int userId)
|
||||||
|
{
|
||||||
|
var subscription = await subscriptions.GetCurrentSubscriptionAsync(userId);
|
||||||
|
return HasPaidBillingRisk(subscription, DateTime.UtcNow);
|
||||||
|
}
|
||||||
|
|
||||||
public Task<SubscriptionLevel?> GetSubscriptionLevelAsync(int subscriptionLevelId) =>
|
public Task<SubscriptionLevel?> GetSubscriptionLevelAsync(int subscriptionLevelId) =>
|
||||||
subscriptions.GetSubscriptionLevelAsync(subscriptionLevelId);
|
subscriptions.GetSubscriptionLevelAsync(subscriptionLevelId);
|
||||||
|
|
||||||
@ -121,6 +128,36 @@ public sealed class SubscriptionService(ISubscriptionRepository subscriptions, I
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static long ToBytes(int megabytes) => megabytes * 1024L * 1024L;
|
private static long ToBytes(int megabytes) => megabytes * 1024L * 1024L;
|
||||||
|
|
||||||
|
internal static bool HasPaidBillingRisk(UserSubscriptionDetail? subscription, DateTime utcNow)
|
||||||
|
{
|
||||||
|
if (subscription is null || string.IsNullOrWhiteSpace(subscription.StripeSubscriptionId))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
var stripeStatus = (subscription.StripeStatus ?? string.Empty).Trim().ToLowerInvariant();
|
||||||
|
if (stripeStatus is "canceled" or "cancelled" or "incomplete_expired")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subscription.CancelAtPeriodEnd
|
||||||
|
&& (!subscription.CurrentPeriodEndUTC.HasValue || subscription.CurrentPeriodEndUTC.Value > utcNow))
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (subscription.CurrentPeriodEndUTC.HasValue
|
||||||
|
&& subscription.CurrentPeriodEndUTC.Value <= utcNow
|
||||||
|
&& stripeStatus is "ended" or "expired" or "inactive")
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return stripeStatus is "active" or "trialing" or "past_due" or "unpaid" or "incomplete" or "paused"
|
||||||
|
|| string.IsNullOrWhiteSpace(stripeStatus);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class SubscriptionLimitException(string message) : InvalidOperationException(message);
|
public sealed class SubscriptionLimitException(string message) : InvalidOperationException(message);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user