import type { LoginRootMutation, SwitchToRootMutation, AuthUserFragment } from "#graphql-operations"; import type { H3Event } from "h3"; import { pick } from "es-toolkit/compat"; import type { User } from "#auth-utils"; export async function handleLogin(event: H3Event, loginData?: LoginRootMutation) { if (!loginData?.login?.user) { return; } const { authToken, refreshToken, user } = loginData.login; await setUserSession(event, { user: getAuthUser(user), secure: { authToken, refreshToken, }, loggedInAt: new Date().toISOString(), isSwitchedTo: false, }); } export async function handleLogout(event: H3Event) { await clearUserSession(event); } export async function handleSwitchTo(event: H3Event, data?: SwitchToRootMutation) { if (!data?.switchTo?.user) { return; } const session = await getUserSession(event); const { authToken, refreshToken, user } = data.switchTo; await setUserSession(event, { user: getAuthUser(user), secure: { authToken, refreshToken, previous: { user: session.user, loggedInAt: session.loggedInAt, secure: pick(session.secure, ["authToken", "refreshToken"]), }, }, loggedInAt: new Date().toISOString(), isSwitchedTo: true, }); } export async function handleSwitchBack(event: H3Event) { const session = await getUserSession(event); if (!session.secure?.previous) { return; } const { user, loggedInAt, secure } = session.secure.previous; await setUserSession(event, { user, secure, loggedInAt, isSwitchedTo: false, }); } function getAuthUser(user: AuthUserFragment): User { return { id: Number(user.id), email: user.email!, roles: user.roles?.nodes.map(({ name }) => name!) || [], }; }