ironGym/webapp/src/middleware.ts
2025-06-19 23:16:02 +03:00

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).*)']
};