62 lines
2.1 KiB
TypeScript
62 lines
2.1 KiB
TypeScript
/**
|
|
*
|
|
* @description This page represent the middleware which contain the function
|
|
* that stay between the request and the source , it filter them and do what must be do
|
|
* for example it protect the must to be user api routes
|
|
* * source : https://nextjs.org/docs/app/building-your-application/routing/middleware
|
|
*/
|
|
|
|
import createIntlMiddleware from 'next-intl/middleware';
|
|
import { NextRequest } from 'next/server';
|
|
import { NextResponse } from 'next/server'
|
|
import validateAuthToken from '@/middleware/validateAuthToken'
|
|
|
|
export default async function middleware(request: NextRequest) {
|
|
|
|
// log the request general informations
|
|
let ip = request.ip ?? request.headers.get('X-Forwarded-For')?.split(':')[3]
|
|
console.log("request to : " ,request.nextUrl.pathname , 'from ip :' , ip)
|
|
|
|
// handle pages
|
|
if(!request.nextUrl.pathname.startsWith('/api'))
|
|
{
|
|
// handle next-intl Internationalization
|
|
const defaultLocale = request.headers.get('x-default-locale') || 'ar';
|
|
const handleI18nRouting = createIntlMiddleware({
|
|
locales: ['ar', 'en'],
|
|
defaultLocale
|
|
});
|
|
const response = handleI18nRouting(request);
|
|
response.headers.set('x-default-locale', defaultLocale);
|
|
|
|
return response;
|
|
}
|
|
|
|
// handle api routes
|
|
// must be user routes
|
|
|
|
// protect /api/user routes
|
|
if(request.nextUrl.pathname.startsWith('/api/user'))
|
|
{
|
|
let authToken : {name:string , value : string} | undefined = request.cookies.get('authToken')
|
|
let authValidation : boolean | undefined = await validateAuthToken(authToken?.value)
|
|
|
|
if(!authValidation)
|
|
{ // you are not auth you cant access this route
|
|
return new NextResponse(
|
|
JSON.stringify({
|
|
success: false,
|
|
message: "notAllowed",
|
|
// @ts-ignore
|
|
} , {status : 405 , headers: { 'content-type': 'application/json'}})
|
|
)
|
|
}
|
|
// you can access the api route
|
|
return NextResponse.next()
|
|
}
|
|
}
|
|
|
|
// represent the routes that this middleware supposed to handle them
|
|
export const config = {
|
|
matcher: ['/((?!_next/static|_next/image|favicon.ico).*)']
|
|
}; |