chore(codebase): full cleanup pass

This commit is contained in:
2025-06-21 01:58:48 -04:00
parent 8323477cd0
commit 81b5db34ef
92 changed files with 529 additions and 452 deletions

View File

@@ -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; } = [];
}

View File

@@ -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)

View File

@@ -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; }
}

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -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);

View File

@@ -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,

View File

@@ -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(

View File

@@ -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);
}
}

View File

@@ -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;