feat: add database backed membership tiers
All checks were successful
deploy-socialize / image (push) Successful in 1m9s
deploy-socialize / deploy (push) Successful in 19s

This commit is contained in:
2026-05-07 20:29:53 -04:00
parent db16e79d9f
commit 6d92119c9c
23 changed files with 3512 additions and 30 deletions

View File

@@ -16,34 +16,71 @@ internal record OrganizationDto(
Guid Id,
string Name,
string? LogoUrl,
OrganizationMembershipTierDto? MembershipTier,
Guid OwnerUserId,
IReadOnlyCollection<string> CurrentUserPermissions,
IReadOnlyCollection<OrganizationMemberDto> Members,
IReadOnlyCollection<WorkspaceDto> Workspaces,
OrganizationUsageDto? Usage,
IReadOnlyCollection<OrganizationMembershipTierDto> AvailableMembershipTiers,
DateTimeOffset CreatedAt)
{
public static OrganizationDto FromOrganization(
Organization organization,
IReadOnlyCollection<string> currentUserPermissions,
OrganizationMembershipTierDto? membershipTier = null,
IReadOnlyCollection<OrganizationMemberDto>? members = null,
IReadOnlyCollection<WorkspaceDto>? workspaces = null,
OrganizationUsageDto? usage = null)
OrganizationUsageDto? usage = null,
IReadOnlyCollection<OrganizationMembershipTierDto>? availableMembershipTiers = null)
{
return new OrganizationDto(
organization.Id,
organization.Name,
organization.LogoUrl,
membershipTier,
organization.OwnerUserId,
currentUserPermissions,
members ?? [],
workspaces ?? [],
usage,
availableMembershipTiers ?? [],
organization.CreatedAt);
}
}
internal record OrganizationMembershipTierDto(
Guid Id,
string Key,
string Name,
string Description,
int? MonthlyPriceCents,
int? WorkspaceLimit,
int? ActiveContentLimit,
int? MemberLimit,
int? ExternalReviewerLimit,
bool IsCustom,
int SortOrder)
{
public static OrganizationMembershipTierDto FromTier(OrganizationMembershipTier tier)
{
return new OrganizationMembershipTierDto(
tier.Id,
tier.Key,
tier.Name,
tier.Description,
tier.MonthlyPriceCents,
tier.WorkspaceLimit,
tier.ActiveContentLimit,
tier.MemberLimit,
tier.ExternalReviewerLimit,
tier.IsCustom,
tier.SortOrder);
}
}
internal record OrganizationUsageDto(
string PlanKey,
string PlanName,
IReadOnlyCollection<OrganizationUsageItemDto> Items);