- replace placeholder house svg with clean geometric house mark on indigo-700 (#4338CA) — roof triangle, body, door cutout - add favicon.svg with prefers-color-scheme dark variant - add icon-16/32 sizes; regenerate all pngs from svg via sharp - update BrandMark component to use inline svg house instead of 'f' - wire favicon + sized pngs into layout metadata - fix middleware to allow icon/manifest/favicon paths without auth (android launcher fetches icons in a cookieless system context) - fix getCurrentSession() to redirect to /login instead of throwing when session cookie is stale/invalid
64 lines
2.2 KiB
TypeScript
64 lines
2.2 KiB
TypeScript
import { eq } from "drizzle-orm";
|
|
import { redirect } from "next/navigation";
|
|
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;
|
|
household: typeof households.$inferSelect;
|
|
role: "owner" | "member";
|
|
}
|
|
|
|
export async function getCurrentSession(): Promise<CurrentSession> {
|
|
const session = await auth();
|
|
if (!session?.user?.id) redirect("/login");
|
|
|
|
const [row] = 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 (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;
|
|
}
|