Next.js 14 App Router application for managing homophone pun game levels: - Better Auth with Prisma adapter for authentication - MySQL database with Prisma ORM - Level CRUD operations with drag-and-drop reordering - Tencent COS integration for image uploads - shadcn/ui components with Tailwind CSS - TanStack Query for server state management
36 lines
952 B
TypeScript
36 lines
952 B
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
|
|
|
export async function middleware(request: NextRequest) {
|
|
const { pathname } = request.nextUrl
|
|
|
|
// Allow auth API routes and static files
|
|
if (
|
|
pathname.startsWith('/api/auth') ||
|
|
pathname.startsWith('/_next') ||
|
|
pathname.startsWith('/favicon') ||
|
|
pathname.includes('.')
|
|
) {
|
|
return NextResponse.next()
|
|
}
|
|
|
|
// Allow login page
|
|
if (pathname === '/login') {
|
|
return NextResponse.next()
|
|
}
|
|
|
|
// Check if session cookie exists (simple check, full validation happens in server)
|
|
const sessionToken = request.cookies.get('better-auth.session_token')
|
|
|
|
if (!sessionToken?.value) {
|
|
const loginUrl = new URL('/login', request.url)
|
|
loginUrl.searchParams.set('callbackUrl', pathname)
|
|
return NextResponse.redirect(loginUrl)
|
|
}
|
|
|
|
return NextResponse.next()
|
|
}
|
|
|
|
export const config = {
|
|
matcher: ['/((?!api/auth|_next/static|_next/image|favicon.ico).*)'],
|
|
}
|