Files
famapp/src/lib/session.ts
T
ginnoir ec2f3930ad feat: proper logo, favicon, and pwa icons
- 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
2026-06-03 15:59:34 -05:00

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