06b8d9f64b
- WrappedRun Prisma model + migration (aggregates only, no note names/text) - /wrapped authed route: FSA + webkitdirectory + drag-drop reader, Web Worker parser - archetype + score heuristics, ДС-2 result card - POST /api/wrapped/run (userId from session), public /share/wrapped/[token] - next/og OG image (Satori+resvg-wasm, alpine-safe) + Fira Mono ttf - middleware: /share/wrapped public Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
36 lines
1.2 KiB
TypeScript
36 lines
1.2 KiB
TypeScript
import { NextRequest, NextResponse } from "next/server";
|
|
import { getSessionCookie } from "better-auth/cookies";
|
|
|
|
const PUBLIC_ROUTES = ["/login", "/register", "/verify-email", "/forgot-password", "/reset-password", "/api/auth", "/api/register", "/api/internal", "/maintenance", "/share/wrapped"];
|
|
|
|
export function middleware(request: NextRequest) {
|
|
const { pathname } = request.nextUrl;
|
|
|
|
// Прямой Better Auth sign-up обходит Turnstile/honeypot-обёртку
|
|
// (/api/register) — наружу закрыт. Сама регистрация не страдает:
|
|
// /api/register вызывает auth.handler программно, минуя middleware.
|
|
if (pathname.startsWith("/api/auth/sign-up")) {
|
|
return new NextResponse(null, { status: 404 });
|
|
}
|
|
|
|
if (
|
|
PUBLIC_ROUTES.some((route) => pathname.startsWith(route)) ||
|
|
pathname.startsWith("/_next") ||
|
|
pathname.startsWith("/favicon")
|
|
) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
const sessionCookie = getSessionCookie(request);
|
|
|
|
if (!sessionCookie) {
|
|
return NextResponse.redirect(new URL("/login", request.url));
|
|
}
|
|
|
|
return NextResponse.next();
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ["/((?!_next/static|_next/image|favicon.ico).*)"],
|
|
};
|