41 lines
1.2 KiB
TypeScript
41 lines
1.2 KiB
TypeScript
import { getDb } from "./db";
|
|
import { verifySession, SESSION_COOKIE, type SessionUser } from "./session";
|
|
import { cookies } from "next/headers";
|
|
import type { Viewer } from "./access";
|
|
|
|
async function sessionFromCookie(): Promise<SessionUser | null> {
|
|
const store = await cookies();
|
|
const token = store.get(SESSION_COOKIE)?.value;
|
|
if (!token) return null;
|
|
try {
|
|
return await verifySession(token);
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Aktueller Betrachter inkl. Haushaltsmitgliedschaft (genau ein Haushalt oder keiner).
|
|
* Gibt null zurück, wenn kein gültiges, aktuelles Login vorliegt.
|
|
*/
|
|
export async function getViewer(): Promise<Viewer | null> {
|
|
const sess = await sessionFromCookie();
|
|
if (!sess) return null;
|
|
const db = getDb();
|
|
const user = await db.user.findUnique({
|
|
where: { id: sess.uid },
|
|
include: { membership: { include: { household: true } } },
|
|
});
|
|
if (!user || user.tokenVersion !== sess.tokenVersion) return null;
|
|
return {
|
|
id: user.id,
|
|
name: user.name,
|
|
email: user.email,
|
|
role: user.role,
|
|
isServerAdmin: user.role === "admin",
|
|
householdId: user.membership?.householdId ?? null,
|
|
householdName: user.membership?.household.name ?? null,
|
|
householdRole: user.membership?.role ?? null,
|
|
};
|
|
}
|