deadhead-space-freight-tycoon/apps/server/src/http/session.ts

25 lines
875 B
TypeScript

import { eq } from "drizzle-orm";
import { fromNodeHeaders } from "better-auth/node";
import type { FastifyRequest } from "fastify";
import type { Auth } from "../auth";
import type { Db } from "../db/client";
import { players } from "../db/schema";
import { ApiError } from "./errors";
/** The signed-in player's id, or a 401 `unauthorized` error. */
export async function requirePlayerId(
request: FastifyRequest,
auth: Auth,
db: Db,
): Promise<string> {
const session = await auth.api.getSession({ headers: fromNodeHeaders(request.headers) });
if (!session) throw new ApiError(401, "unauthorized", "Sign in to continue.");
const [player] = await db
.select({ id: players.id })
.from(players)
.where(eq(players.userId, session.user.id));
if (!player) throw new ApiError(401, "unauthorized", "No player for this account.");
return player.id;
}