rename: "Team" billing tier to "Family"

All literal "team" tier-value references renamed to "family" across
API routes, admin UI, OpenAPI schemas, and lib/tiers.ts. The DB enum
value itself is renamed in place via ALTER TYPE ... RENAME VALUE
(migration 0044) rather than drizzle-kit's auto-generated
drop-and-recreate-the-enum migration, which would have failed against
any existing row still holding 'team' — RENAME VALUE preserves
existing data with no cast/backfill needed.

Also adds STRIPE_PLAN.md — a full Stripe billing integration plan
(Checkout+Portal, tier→Price mapping, admin billing dashboard, and a
multi-user Family-group design since Family is meant to cover several
accounts under one subscription, not one payer). Planning only, no
Stripe code yet.

v0.47.0
This commit is contained in:
Arnaud
2026-07-18 00:25:51 +02:00
parent 21a3622e6c
commit c8f4b50ef3
47 changed files with 5469 additions and 60 deletions
+3 -3
View File
@@ -41,7 +41,7 @@ export default async function AdminStoragePage() {
const freePhotos = Number(photosByTier.find((r) => r.tier === "free")?.photoCount ?? 0);
const proPhotos = Number(photosByTier.find((r) => r.tier === "pro")?.photoCount ?? 0);
const teamPhotos = Number(photosByTier.find((r) => r.tier === "team")?.photoCount ?? 0);
const familyPhotos = Number(photosByTier.find((r) => r.tier === "family")?.photoCount ?? 0);
return (
<div className="space-y-6">
@@ -86,11 +86,11 @@ export default async function AdminStoragePage() {
<Card>
<CardHeader className="flex flex-row items-center justify-between pb-2">
<CardTitle className="text-sm font-medium text-muted-foreground">Team Tier Photos</CardTitle>
<CardTitle className="text-sm font-medium text-muted-foreground">Family Tier Photos</CardTitle>
<HardDrive className="h-4 w-4 text-muted-foreground" />
</CardHeader>
<CardContent>
<div className="text-2xl font-bold">{teamPhotos.toLocaleString()}</div>
<div className="text-2xl font-bold">{familyPhotos.toLocaleString()}</div>
</CardContent>
</Card>
</div>
+1 -1
View File
@@ -25,7 +25,7 @@ const ROLE_COLORS = {
const TIER_COLORS = {
free: "secondary",
pro: "default",
team: "default",
family: "default",
} as const;
export default async function AdminUserDetailPage({ params }: PageProps) {
+1 -1
View File
@@ -24,7 +24,7 @@ const ROLE_COLORS = {
const TIER_COLORS = {
free: "secondary",
pro: "default",
team: "default",
family: "default",
} as const;
export default async function AdminUsersPage({ searchParams }: PageProps) {