everything-dev
Version:
A consolidated product package for building Module Federation apps with oRPC APIs.
48 lines (46 loc) • 1.76 kB
JavaScript
import { pluginHref, pluginPath } from "./plugin-path.mjs";
import { sessionQueryKey, sessionQueryOptions } from "./auth.mjs";
import { redirect } from "@tanstack/react-router";
//#region src/ui/auth-guards.ts
async function ensureSession(context) {
const { queryClient, authClient } = context;
return queryClient.query(sessionQueryOptions(authClient));
}
function buildAuthContext(session) {
return {
isAuthenticated: !!session?.user,
user: session?.user ?? null,
session: session?.session ?? null,
activeOrganizationId: session?.session?.activeOrganizationId ?? null,
isAnonymous: session?.user?.isAnonymous ?? false,
isAdmin: session?.user?.role === "admin",
isBanned: session?.user?.banned ?? false
};
}
async function requireSession({ context, location }) {
const session = await ensureSession(context);
if (!session?.user) throw redirect({ href: pluginHref("/login", { redirect: location.href }) });
if (session.user.banned) throw redirect({ href: pluginPath("/login#banned") });
return {
auth: buildAuthContext(session),
session
};
}
async function requireAdmin(args) {
const result = await requireSession(args);
if (result.session.user?.role !== "admin") throw redirect({ to: "/dashboard" });
return result;
}
/**
* Clears private and public query data on sign-out while leaving an explicit
* signed-out session entry — the cache must remember "signed out" so a late
* router-context session cannot resurrect stale authed state.
*/
async function clearAuthenticatedQueries(queryClient) {
await queryClient.cancelQueries();
queryClient.clear();
queryClient.setQueryData(sessionQueryKey, null);
}
//#endregion
export { clearAuthenticatedQueries, requireAdmin, requireSession };
//# sourceMappingURL=auth-guards.mjs.map