| 1 | import { cookies } from "next/headers"; |
| 2 | import { getDb } from "@stepping/db"; |
| 3 | import { |
| 4 | SESSION_COOKIE, |
| 5 | verifyCredentials, |
| 6 | createSession, |
| 7 | destroySession, |
| 8 | validateSession, |
| 9 | type SessionUser, |
| 10 | } from "@stepping/api"; |
| 11 | |
| 12 | export async function getCurrentUser(): Promise<SessionUser | null> { |
| 13 | const token = (await cookies()).get(SESSION_COOKIE)?.value ?? null; |
| 14 | return validateSession(getDb(), token); |
| 15 | } |
| 16 | |
| 17 | export function isAdmin(u: SessionUser | null): boolean { |
| 18 | return u?.role === "admin" || u?.role === "moderator"; |
| 19 | } |
| 20 | |
| 21 | export async function login(email: string, password: string): Promise<boolean> { |
| 22 | const db = getDb(); |
| 23 | const userId = await verifyCredentials(db, email, password); |
| 24 | if (!userId) return false; |
| 25 | |
| 26 | const { token, expiresAt } = await createSession(db, userId); |
| 27 | (await cookies()).set(SESSION_COOKIE, token, { |
| 28 | httpOnly: true, |
| 29 | secure: process.env.STEPPING_SECURE_COOKIES === "1", |
| 30 | sameSite: "lax", |
| 31 | path: "/", |
| 32 | expires: expiresAt, |
| 33 | }); |
| 34 | return true; |
| 35 | } |
| 36 | |
| 37 | export async function logout(): Promise<void> { |
| 38 | const jar = await cookies(); |
| 39 | const token = jar.get(SESSION_COOKIE)?.value; |
| 40 | await destroySession(getDb(), token); |
| 41 | jar.delete(SESSION_COOKIE); |
| 42 | } |