sendou.ink/app/features/auth/core/user.server.ts
Kalle fd48bced91
Migrate Prettier/Eslint/Stylelint setup to Biome (#1772)
* Initial

* CSS lint

* Test CI

* Add 1v1, 2v2, and 3v3 Tags (#1771)

* Initial

* CSS lint

* Test CI

* Rename step

---------

Co-authored-by: xi <104683822+ximk@users.noreply.github.com>
2024-06-24 13:07:17 +03:00

58 lines
1.6 KiB
TypeScript

import { redirect } from "@remix-run/node";
import type { User } from "~/db/types";
import { userIsBanned } from "~/features/ban/core/banned.server";
import * as UserRepository from "~/features/user-page/UserRepository.server";
import { SUSPENDED_PAGE } from "~/utils/urls";
import { IMPERSONATED_SESSION_KEY, SESSION_KEY } from "./authenticator.server";
import { authSessionStorage } from "./session.server";
export async function getUserId(
request: Request,
redirectIfBanned = true,
): Promise<Pick<User, "id"> | undefined> {
const session = await authSessionStorage.getSession(
request.headers.get("Cookie"),
);
const userId =
session.get(IMPERSONATED_SESSION_KEY) ?? session.get(SESSION_KEY);
if (!userId) return;
if (userIsBanned(userId) && redirectIfBanned) throw redirect(SUSPENDED_PAGE);
return { id: userId };
}
export async function getUser(request: Request, redirectIfBanned = true) {
const userId = (await getUserId(request, redirectIfBanned))?.id;
if (!userId) return;
return UserRepository.findLeanById(userId);
}
export async function requireUserId(request: Request) {
const user = await getUserId(request);
if (!user) throw new Response(null, { status: 401 });
return user;
}
export async function requireUser(request: Request) {
const user = await getUser(request);
if (!user) throw new Response(null, { status: 401 });
return user;
}
export async function isImpersonating(request: Request) {
const session = await authSessionStorage.getSession(
request.headers.get("Cookie"),
);
return Boolean(session.get(IMPERSONATED_SESSION_KEY));
}