Files
no-copy-admin-panel-frontend/src/proxy.ts
T
2026-05-12 11:51:31 +07:00

59 lines
1.8 KiB
TypeScript

import { NextResponse, NextRequest } from 'next/server';
import { cookies } from 'next/headers'
import createIntlMiddleware from 'next-intl/middleware'
import { routing } from '@/i18n/routing'
import { decrypt } from '@/app/actions/session';
const intlMiddleware = createIntlMiddleware(routing);
export default async function proxy(request: NextRequest) {
const path = request.nextUrl.pathname;
if (
path.startsWith('/_next') ||
path.includes('/api/')
) {
return NextResponse.next();
}
const pathname = request.nextUrl.pathname;
const locale = pathname.split('/')[1];
const isValidLocale = routing.locales.includes(locale as any);
if (!isValidLocale && !path.includes('/login')) {
const defaultLocale = routing.defaultLocale;
const newUrl = new URL(`/${defaultLocale}${path}`, request.url);
return NextResponse.redirect(newUrl);
}
const isLoginPage = path.includes(`/${locale}/login`) || path === '/login';
const isPublicPage = isLoginPage || path.includes('/api/');
if (!isPublicPage) {
const cookie = (await cookies()).get('session_nc_ap')?.value;
const session = await decrypt(cookie);
const targetLocale = isValidLocale ? locale : routing.defaultLocale;
if (!session?.token) {
const loginUrl = new URL(`/${targetLocale}/login`, request.url);
return NextResponse.redirect(loginUrl);
} else if (path === '/en' || path === '/ru') {
const dashboardUrl = new URL(`/${targetLocale}/pages`, request.url);
dashboardUrl.search = new URL(request.url).search;
return NextResponse.redirect(dashboardUrl);
}
}
const intlResponse = intlMiddleware(request);
if (intlResponse) {
const response = new NextResponse(intlResponse.body, intlResponse);
response.headers.set('x-pathname', path);
return response;
}
return NextResponse.next();
}
export const config = {
matcher: ['/((?!_next/static|_next/image|.*\\.png$).*)']
};