46 lines
1.6 KiB
TypeScript
46 lines
1.6 KiB
TypeScript
// app/middleware.js
|
|
import { NextResponse, NextRequest } from 'next/server';
|
|
|
|
// Daftar route yang diizinkan tanpa login (public routes)
|
|
const publicRoutes = [
|
|
'/*', // Home page
|
|
'/about', // About page
|
|
'/public/*', // Wildcard untuk semua route di bawah /public
|
|
'/login', // Halaman login
|
|
];
|
|
|
|
// Fungsi untuk memeriksa apakah route saat ini adalah route publik
|
|
function isPublicRoute(pathname: string) {
|
|
return publicRoutes.some((route) => {
|
|
// Jika route mengandung wildcard (*), gunakan regex untuk mencocokkan
|
|
if (route.endsWith('*')) {
|
|
const baseRoute = route.replace('*', ''); // Hapus wildcard
|
|
return pathname.startsWith(baseRoute); // Cocokkan dengan pathname
|
|
}
|
|
return pathname === route; // Cocokkan exact path
|
|
});
|
|
}
|
|
|
|
export function middleware(request: NextRequest) {
|
|
const { pathname } = request.nextUrl;
|
|
|
|
// Jika route adalah public, izinkan akses
|
|
if (isPublicRoute(pathname)) {
|
|
return NextResponse.next();
|
|
}
|
|
|
|
// Jika bukan public route, periksa apakah pengguna sudah login
|
|
const isLoggedIn = request.cookies.get('darmasaba-auth-token'); // Contoh: cek cookie auth-token
|
|
if (!isLoggedIn) {
|
|
// Redirect ke halaman login jika belum login
|
|
return NextResponse.redirect(new URL('/login', request.url));
|
|
}
|
|
|
|
// Jika sudah login, izinkan akses
|
|
return NextResponse.next();
|
|
}
|
|
|
|
// Konfigurasi untuk menentukan path mana yang akan dijalankan middleware
|
|
export const config = {
|
|
matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'], // Jalankan middleware untuk semua route kecuali file statis
|
|
}; |