25 lines
875 B
TypeScript
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;
|
|
}
|