aboutsummaryrefslogtreecommitdiffhomepage
path: root/frontend/app/.server/auth.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-02-13 22:40:45 +0900
committernsfisis <nsfisis@gmail.com>2026-02-13 23:07:26 +0900
commite239fe743fc66a8712cf9886d3dfed3cc41fce36 (patch)
treee3452fb13dce114cea0e8371dbb049118aa1229e /frontend/app/.server/auth.ts
parent482c3a52a0fcc5870a7db4a190475caf61b211a3 (diff)
downloadphperkaigi-2026-albatross-e239fe743fc66a8712cf9886d3dfed3cc41fce36.tar.gz
phperkaigi-2026-albatross-e239fe743fc66a8712cf9886d3dfed3cc41fce36.tar.zst
phperkaigi-2026-albatross-e239fe743fc66a8712cf9886d3dfed3cc41fce36.zip
refactor(frontend): replace React Router BFF with Wouter SPA
Remove React Router 7 SSR/BFF architecture (server-side loaders, actions, sessions, remix-auth) and replace with a client-side SPA using Wouter for routing and cookie-based JWT auth. - Replace reactRouter() Vite plugin with @vitejs/plugin-react - Add index.html + app/main.tsx as SPA entry points - Add Wouter routing with auth guards (ProtectedRoute/PublicOnlyRoute) - Add client-side auth (app/auth.ts) and useAuth hook - Migrate all route files to app/pages/ with client-side data fetching - Update NavigateLink and GolfPlayAppGaming to use Wouter Link - Remove .server/, routes/, root.tsx, react-router.config.ts - Clean up tsconfig.json (remove .react-router references) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Diffstat (limited to 'frontend/app/.server/auth.ts')
-rw-r--r--frontend/app/.server/auth.ts96
1 files changed, 0 insertions, 96 deletions
diff --git a/frontend/app/.server/auth.ts b/frontend/app/.server/auth.ts
deleted file mode 100644
index 3e24638..0000000
--- a/frontend/app/.server/auth.ts
+++ /dev/null
@@ -1,96 +0,0 @@
-import { type JwtPayload, jwtDecode } from "jwt-decode";
-import { redirect } from "react-router";
-import { Authenticator } from "remix-auth";
-import { FormStrategy } from "remix-auth-form";
-import { apiLogin } from "../api/client";
-import { components } from "../api/schema";
-import { createUnstructuredCookie } from "./cookie";
-import { cookieOptions, sessionStorage } from "./session";
-
-const authenticator = new Authenticator<string>();
-
-authenticator.use(
- new FormStrategy(async ({ form }) => {
- const username = String(form.get("username"));
- const password = String(form.get("password"));
- return (await apiLogin(username, password)).token;
- }),
- "default",
-);
-
-export type User = components["schemas"]["User"];
-
-// This cookie is used to directly store the JWT for the API server.
-// Remix's createCookie() returns "structured" cookies, which cannot be reused directly by non-Remix servers.
-const tokenCookie = createUnstructuredCookie("albatross_token", cookieOptions);
-
-/**
- * @throws Error on failure
- */
-export async function login(request: Request): Promise<never> {
- const jwt = await authenticator.authenticate("default", request);
-
- const session = await sessionStorage.getSession(
- request.headers.get("cookie"),
- );
- session.set("user", jwt);
-
- throw redirect("/dashboard", {
- headers: [
- ["Set-Cookie", await sessionStorage.commitSession(session)],
- ["Set-Cookie", await tokenCookie.serialize(jwt)],
- ],
- });
-}
-
-export async function logout(request: Request): Promise<never> {
- const session = await sessionStorage.getSession(
- request.headers.get("cookie"),
- );
- throw redirect("/", {
- headers: [
- ["Set-Cookie", await sessionStorage.destroySession(session)],
- [
- "Set-Cookie",
- await tokenCookie.serialize("", { maxAge: 0, expires: new Date(0) }),
- ],
- ],
- });
-}
-
-async function getCurrentValidSession(
- request: Request,
-): Promise<{ user: User; token: string } | null> {
- const session = await sessionStorage.getSession(
- request.headers.get("cookie"),
- );
- const token = session.get("user");
- if (!token) {
- return null;
- }
- const user = jwtDecode<User & JwtPayload>(token);
- const exp = user.exp;
- if (exp != null && new Date((exp - 3600) * 1000) < new Date()) {
- // If the token will expire in less than an hour, refresh it.
- return null;
- }
- return { user, token };
-}
-
-export async function ensureUserLoggedIn(
- request: Request,
-): Promise<{ user: User; token: string }> {
- const session = await getCurrentValidSession(request);
- if (!session) {
- throw redirect("/login");
- }
- return session;
-}
-
-export async function ensureUserNotLoggedIn(request: Request): Promise<null> {
- const session = await getCurrentValidSession(request);
- if (session) {
- throw redirect("/dashboard");
- }
- return null;
-}