import { NextResponse } from "next/server"; import type { NextRequest } from "next/server"; import { SESSION_COOKIE } from "@/lib/auth/constants"; const PUBLIC_PATHS = ["/login"]; const PUBLIC_API_PREFIXES = ["/api/auth/", "/api/threads/oauth/callback"]; function isPublicPath(pathname: string) { if (PUBLIC_PATHS.includes(pathname)) return true; return PUBLIC_API_PREFIXES.some((prefix) => pathname.startsWith(prefix)); } export function middleware(request: NextRequest) { const { pathname } = request.nextUrl; const token = request.cookies.get(SESSION_COOKIE)?.value; if (pathname.startsWith("/api/") || pathname.startsWith("/")) { if (isPublicPath(pathname)) { if (token && pathname === "/login") { return NextResponse.redirect(new URL("/", request.url)); } return NextResponse.next(); } if (!token) { if (pathname.startsWith("/api/")) { return NextResponse.json({ error: "請先登入" }, { status: 401 }); } const loginUrl = new URL("/login", request.url); loginUrl.searchParams.set("next", pathname); return NextResponse.redirect(loginUrl); } } return NextResponse.next(); } export const config = { matcher: ["/((?!_next/static|_next/image|favicon.ico|.*\\..*).*)"], };