import { createCookieSessionStorage, redirect } from "remix"; import invariant from "tiny-invariant"; import { discordIdentify, User, SessionInformation } from "~/models/user.server"; import { getUserByDiscordId } from "~/models/user.server"; invariant(process.env.SESSION_SECRET, "SESSION_SECRET must be set"); export const sessionStorage = createCookieSessionStorage({ cookie: { name: "__session", httpOnly: true, maxAge: 0, path: "/", sameSite: "lax", secrets: [process.env.SESSION_SECRET], secure: process.env.NODE_ENV === "production", }, }); const USER_SESSION_KEY = "userId"; const BEARER_TOKEN_KEY = "bearerToken"; const REFRESH_TOKEN_KEY = "refreshToken"; export async function getSession(request: Request) { const cookie = request.headers.get("Cookie"); return sessionStorage.getSession(cookie); } export async function getUserId(request: Request): Promise { const session = await getSession(request); const userId = session.get(USER_SESSION_KEY); return userId; } export async function getUser(request: Request): Promise { const userId = await getUserId(request); if (userId === undefined) return null; const user = await getUserByDiscordId(userId); if (user) return user; throw await logout(request); } export async function requireUserId( request: Request, redirectTo: string = new URL(request.url).pathname ): Promise { const userId = await getUserId(request); if (!userId) { const searchParams = new URLSearchParams([["redirectTo", redirectTo]]); throw redirect(`/loginstart?${searchParams}`); } return userId; } export async function requireUser(request: Request) { const session = await getSession(request); const user_id = session.get(USER_SESSION_KEY); const client_id = process.env.DISCORD_CLIENT_ID || ""; const redirect_uri = process.env.DISCORD_REDIRECT_URI || ""; if (!user_id) { return redirect(`https://discord.com/api/oauth2/authorize?client_id=${client_id}` + `&response_type=code&redirect_uri=${encodeURIComponent(redirect_uri)}&scope=identify`); } } export async function createUserSession({ request, discord_id, redirectTo, }: { request: Request; discord_id: string; redirectTo: string; }) { const session = await getSession(request); session.set(USER_SESSION_KEY, discord_id); console.log(discord_id); return redirect(redirectTo, { headers: { "Set-Cookie": await sessionStorage.commitSession(session, { maxAge: 60 * 60 * 24 * 7 // 7 days }), }, }); } export async function logout(request: Request) { const session = await getSession(request); return redirect("/", { headers: { "Set-Cookie": await sessionStorage.destroySession(session), }, }); }