Auto-enroll user into household if membership missing on session load

If a user has a valid session but no household_members row (e.g. they
first signed in before the household was seeded), getCurrentSession now
auto-enrolls them instead of throwing. Assigns owner if first member,
member otherwise, and creates their default calendars and lists.

Removes the permanently-stuck state that occurred on first deploy.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
ginnoir
2026-05-06 21:12:26 -05:00
co-authored by Claude Sonnet 4.6
parent c66bf68373
commit 484f747f66
+33 -2
View File
@@ -2,6 +2,8 @@ import { eq } from "drizzle-orm";
import { auth } from "@/lib/auth";
import { db } from "@/lib/db";
import { householdMembers, households, users } from "@/modules/_core/schema";
import { ensureDefaultCalendarsForMembership } from "@/modules/calendar/server/defaults";
import { ensureDefaultListsForHousehold } from "@/modules/lists/server/defaults";
export interface CurrentSession {
user: typeof users.$inferSelect;
@@ -25,7 +27,36 @@ export async function getCurrentSession(): Promise<CurrentSession> {
.where(eq(householdMembers.userId, session.user.id))
.limit(1);
if (!row) throw new Error("No household membership");
if (row) return row;
return row;
// No membership yet — happens when the household was seeded after the user's
// first sign-in (e.g. first deploy). Auto-enroll into the single household.
const [household] = await db.select().from(households).limit(1);
if (!household) throw new Error("No household membership");
const [anyMember] = await db
.select()
.from(householdMembers)
.where(eq(householdMembers.householdId, household.id))
.limit(1);
const role = anyMember ? "member" : "owner";
await db
.insert(householdMembers)
.values({ householdId: household.id, userId: session.user.id, role })
.onConflictDoNothing();
await ensureDefaultCalendarsForMembership({ householdId: household.id, userId: session.user.id });
await ensureDefaultListsForHousehold(household.id);
const [fixed] = await db
.select({ user: users, household: households, role: householdMembers.role })
.from(householdMembers)
.innerJoin(users, eq(householdMembers.userId, users.id))
.innerJoin(households, eq(householdMembers.householdId, households.id))
.where(eq(householdMembers.userId, session.user.id))
.limit(1);
if (!fixed) throw new Error("No household membership");
return fixed;
}