chore(codebase): full cleanup pass
This commit is contained in:
@@ -14,7 +14,7 @@ public class Membership
|
||||
public DateTimeOffset? StartDate { get; set; }
|
||||
public DateTimeOffset? EndDate { get; set; }
|
||||
public bool IsActive => EndDate == null || EndDate > DateTimeOffset.UtcNow;
|
||||
[MaxLength(256)]public string? StripeSubscriptionId { get; set; }
|
||||
|
||||
[MaxLength(256)] public string? StripeSubscriptionId { get; set; }
|
||||
|
||||
public ICollection<Payment> Payments { get; set; } = [];
|
||||
}
|
||||
|
||||
@@ -9,8 +9,8 @@ public sealed class MembershipsDbContext(
|
||||
public DbSet<MembershipTier> MembershipTiers => Set<MembershipTier>();
|
||||
public DbSet<Membership> Memberships => Set<Membership>();
|
||||
public DbSet<Payment> Payments => Set<Payment>();
|
||||
|
||||
|
||||
|
||||
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.HasDefaultSchema(SchemaName);
|
||||
@@ -20,7 +20,7 @@ public sealed class MembershipsDbContext(
|
||||
.Property(c => c.CreatedAt)
|
||||
.ValueGeneratedOnAdd()
|
||||
.HasDefaultValueSql("CURRENT_TIMESTAMP");
|
||||
|
||||
|
||||
modelBuilder
|
||||
.Entity<Membership>()
|
||||
.Property(c => c.CreatedAt)
|
||||
|
||||
@@ -9,5 +9,4 @@ public class Payment
|
||||
public decimal Amount { get; set; }
|
||||
[MaxLength(8)] public required string Currency { get; set; }
|
||||
[MaxLength(2048)] public required string InvoiceUrl { get; set; }
|
||||
|
||||
}
|
||||
|
||||
@@ -13,19 +13,19 @@ public static class DependencyInjection
|
||||
builder.Services.AddDbContext<MembershipsDbContext>(configureAction);
|
||||
|
||||
builder.Services.AddTransient<IMembershipNotifier, MembershipNotifier>();
|
||||
|
||||
|
||||
return builder;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public static async Task<IApplicationBuilder> UseMembershipModuleAsync(
|
||||
this IApplicationBuilder app,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
|
||||
using var scope = scopeFactory.CreateScope();
|
||||
await using var context = scope.ServiceProvider.GetRequiredService<MembershipsDbContext>();
|
||||
await context.Database.MigrateAsync(cancellationToken: cancellationToken);
|
||||
IServiceScopeFactory scopeFactory = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>();
|
||||
using IServiceScope scope = scopeFactory.CreateScope();
|
||||
await using MembershipsDbContext context = scope.ServiceProvider.GetRequiredService<MembershipsDbContext>();
|
||||
await context.Database.MigrateAsync(cancellationToken);
|
||||
|
||||
return app;
|
||||
}
|
||||
|
||||
@@ -19,18 +19,18 @@ public class CancelMembershipHandler(
|
||||
Delete("/api/memberships");
|
||||
Options(o => o.WithTags("Memberships"));
|
||||
}
|
||||
|
||||
|
||||
public override async Task HandleAsync(
|
||||
CancelMembershipRequest req,
|
||||
CancellationToken ct)
|
||||
{
|
||||
var subscription = await dbContext
|
||||
Membership? subscription = await dbContext
|
||||
.Memberships
|
||||
.FindAsync(
|
||||
[req.SubscriptionId],
|
||||
cancellationToken: ct);
|
||||
ct);
|
||||
|
||||
if (subscription is not { EndDate: null }
|
||||
if (subscription is not { EndDate: null }
|
||||
|| subscription.StripeSubscriptionId is null)
|
||||
{
|
||||
await SendNotFoundAsync(ct);
|
||||
|
||||
@@ -27,9 +27,9 @@ public class CreateMembershipTierEndpoint(
|
||||
CreateMembershipTierRequest req,
|
||||
CancellationToken ct)
|
||||
{
|
||||
var tierId = Guid.CreateVersion7();
|
||||
Guid tierId = Guid.CreateVersion7();
|
||||
|
||||
var productId = await membershipTierProcessor.CreateAsync(
|
||||
string productId = await membershipTierProcessor.CreateAsync(
|
||||
req.CreatorId,
|
||||
tierId,
|
||||
req.Name,
|
||||
@@ -37,14 +37,14 @@ public class CreateMembershipTierEndpoint(
|
||||
req.Price);
|
||||
|
||||
// Record the new Tier
|
||||
var tier = new MembershipTier
|
||||
MembershipTier tier = new()
|
||||
{
|
||||
Id = tierId,
|
||||
CreatorId = req.CreatorId,
|
||||
Price = req.Price,
|
||||
Name = req.Name,
|
||||
Description = req.Description,
|
||||
StripeProductId = productId,
|
||||
StripeProductId = productId
|
||||
};
|
||||
|
||||
dbContext.MembershipTiers.Add(tier);
|
||||
|
||||
@@ -28,16 +28,16 @@ public class GetActiveMembershipsHandler(
|
||||
public override async Task HandleAsync(
|
||||
CancellationToken ct)
|
||||
{
|
||||
var subscriptions = await dbContext
|
||||
List<Membership> subscriptions = await dbContext
|
||||
.Memberships
|
||||
.Where(subscription => subscription.UserId == User.GetUserId())
|
||||
.Where(subscription => subscription.State == MembershipState.Active)
|
||||
.ToListAsync(ct);
|
||||
|
||||
var result = await Task.WhenAll(
|
||||
GetActiveMembershipsResponse[] result = await Task.WhenAll(
|
||||
subscriptions.Select(async subscription =>
|
||||
{
|
||||
var creator = await creatorLookup.GetCreatorAsync(subscription.CreatorId, ct);
|
||||
CreatorReference? creator = await creatorLookup.GetCreatorAsync(subscription.CreatorId, ct);
|
||||
|
||||
return new GetActiveMembershipsResponse(
|
||||
subscription.Id,
|
||||
|
||||
@@ -4,7 +4,7 @@ namespace Hutopy.Modules.Memberships.Handlers;
|
||||
|
||||
[PublicAPI]
|
||||
public record GetMembershipTiersRequest
|
||||
{
|
||||
{
|
||||
public Guid CreatorId { get; set; }
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ public class GetMembershipTiersEndpoint(
|
||||
GetMembershipTiersRequest req,
|
||||
CancellationToken ct)
|
||||
{
|
||||
var tiers = await dbContext
|
||||
List<TierModel> tiers = await dbContext
|
||||
.MembershipTiers
|
||||
.Where(tier => tier.CreatorId == req.CreatorId)
|
||||
.Select(tier => new TierModel(
|
||||
|
||||
@@ -44,7 +44,7 @@ public class SubscribeHandler(
|
||||
SubscribeRequest req,
|
||||
CancellationToken ct)
|
||||
{
|
||||
var tier = await dbContext
|
||||
MembershipTier? tier = await dbContext
|
||||
.MembershipTiers
|
||||
.Where(tier => tier.Id == req.MembershipTierId)
|
||||
.FirstOrDefaultAsync(ct);
|
||||
@@ -54,7 +54,7 @@ public class SubscribeHandler(
|
||||
return;
|
||||
}
|
||||
|
||||
var creator = await creatorLookup.GetCreatorAsync(tier.CreatorId, ct);
|
||||
CreatorReference? creator = await creatorLookup.GetCreatorAsync(tier.CreatorId, ct);
|
||||
if (creator == null)
|
||||
{
|
||||
await SendNotFoundAsync(ct);
|
||||
@@ -68,7 +68,7 @@ public class SubscribeHandler(
|
||||
}
|
||||
|
||||
// Process Stripe subscription
|
||||
var checkoutSession = await membershipPaymentProcessor.CreateCheckoutSessionAsync(
|
||||
MembershipCheckoutSession checkoutSession = await membershipPaymentProcessor.CreateCheckoutSessionAsync(
|
||||
User.GetUserId(),
|
||||
creator,
|
||||
tier.Id,
|
||||
@@ -78,6 +78,6 @@ public class SubscribeHandler(
|
||||
|
||||
await SendOkAsync(
|
||||
new SubscriptionResponse { StripeCheckoutUrl = checkoutSession.Url },
|
||||
cancellation: ct);
|
||||
ct);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ public class MembershipNotifier(
|
||||
string tierId,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var membership = new Membership
|
||||
Membership membership = new()
|
||||
{
|
||||
Id = Guid.CreateVersion7(),
|
||||
CreatedAt = DateTimeOffset.UtcNow,
|
||||
@@ -40,17 +40,17 @@ public class MembershipNotifier(
|
||||
string currency,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var membership = await dbContext
|
||||
Membership? membership = await dbContext
|
||||
.Memberships
|
||||
.SingleOrDefaultAsync(
|
||||
m => m.StripeSubscriptionId == stripeSubscriptionId,
|
||||
cancellationToken: cancellationToken);
|
||||
cancellationToken);
|
||||
if (membership is null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var payment = new Payment
|
||||
Payment payment = new()
|
||||
{
|
||||
Id = Guid.CreateVersion7(),
|
||||
CreatedAt = DateTimeOffset.UtcNow,
|
||||
@@ -73,11 +73,11 @@ public class MembershipNotifier(
|
||||
DateTimeOffset? endDate,
|
||||
CancellationToken cancellationToken = default)
|
||||
{
|
||||
var membership = await dbContext
|
||||
Membership? membership = await dbContext
|
||||
.Memberships
|
||||
.SingleOrDefaultAsync(
|
||||
s => s.StripeSubscriptionId == subscriptionId,
|
||||
cancellationToken: cancellationToken);
|
||||
cancellationToken);
|
||||
if (membership == null)
|
||||
{
|
||||
return;
|
||||
@@ -92,11 +92,11 @@ public class MembershipNotifier(
|
||||
string subscriptionId,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
var membership = await dbContext
|
||||
Membership? membership = await dbContext
|
||||
.Memberships
|
||||
.SingleOrDefaultAsync(
|
||||
s => s.StripeSubscriptionId == subscriptionId,
|
||||
cancellationToken: cancellationToken);
|
||||
cancellationToken);
|
||||
if (membership == null)
|
||||
{
|
||||
return;
|
||||
|
||||
Reference in New Issue
Block a user