Files
imphnen-frontend-service/apps/dimentorin/src/middleware.ts
T

130 lines
3.1 KiB
TypeScript
Raw Normal View History

2025-05-23 00:28:29 +07:00
import {
PERMISSIONS,
SessionToken,
SessionUser,
} from '@imphnen-frontend-service/utils';
import { LoaderFunctionArgs, redirect } from 'react-router';
const mappingPublicRoutes = [
'/',
'/auth/login',
'/auth/forgot',
2025-05-26 20:49:57 +07:00
'/auth/forgot/otp',
2025-06-18 18:50:06 +07:00
'/auth/register',
2025-05-26 20:49:57 +07:00
'/auth/register/otp',
'/auth/register/success',
2025-05-23 00:28:29 +07:00
'/auth/new-password',
2025-07-13 03:40:23 +07:00
'/auth/register-mentor',
'/auth/register-mentor/pending',
2025-07-28 23:26:22 +07:00
'/auth/register-mentor/success',
'/resources',
2025-05-23 00:28:29 +07:00
];
const mappingRoutePermissions = [
{
path: '/dashboard',
permissions: [],
},
{
path: '/users',
permissions: [PERMISSIONS.USERS.READ_LIST],
},
{
path: '/users/create',
permissions: [PERMISSIONS.USERS.CREATE],
},
{
path: '/users/update',
permissions: [PERMISSIONS.USERS.UPDATE],
},
{
path: '/users/detail',
permissions: [PERMISSIONS.USERS.READ_DETAIL],
},
{
path: '/roles',
permissions: [PERMISSIONS.ROLES.READ_LIST],
},
{
path: '/roles/create',
permissions: [PERMISSIONS.ROLES.CREATE],
},
{
path: '/roles/update',
permissions: [PERMISSIONS.ROLES.UPDATE],
},
{
path: '/roles/detail',
permissions: [PERMISSIONS.ROLES.READ_DETAIL],
},
{
path: '/permissions',
permissions: [PERMISSIONS.PERMISSIONS.READ_LIST],
},
{
path: '/permissions/create',
permissions: [PERMISSIONS.PERMISSIONS.CREATE],
},
{
path: '/permissions/update',
permissions: [PERMISSIONS.PERMISSIONS.UPDATE],
},
{
path: '/permissions/detail',
permissions: [PERMISSIONS.PERMISSIONS.READ_DETAIL],
},
];
2025-07-28 23:26:22 +07:00
const mappingPublicPrefixRoutes = [
'/mentoring',
'/articles',
]
2025-05-23 00:28:29 +07:00
//TODO : Fix this later
// const redirectToFirstAccessibleRoute = (userPermissions: string[]) => {
// const fallback = mappingRoutePermissions.find((route) =>
// route.permissions.some((perm) => userPermissions.includes(perm))
// );
// return redirect(fallback?.path ?? '/auth/login');
// };
2025-03-13 02:03:13 +07:00
export const middleware = async ({ request }: LoaderFunctionArgs) => {
const url = new URL(request.url);
const pathname = url.pathname;
2025-05-23 00:28:29 +07:00
const session = SessionUser.get();
const session_token = SessionToken.get();
const token = session_token?.token?.access_token;
const userPermissions =
session?.role?.permissions?.map?.((perm) => perm?.name) ?? [];
2025-07-28 23:26:22 +07:00
// Allow to access the landing page without authentication
// So, if the route prefix is in the mappingPublicPrefixRoutes, we return null
// to indicate that we don't need to authenticate the user
if (mappingPublicPrefixRoutes.some((prefix) => pathname.startsWith(prefix))) {
return null;
}
2025-03-13 02:03:13 +07:00
2025-05-23 00:28:29 +07:00
if (mappingPublicRoutes.includes(pathname)) {
if (token) return redirect('/dashboard');
return null;
}
if (!session) return redirect('/auth/login');
const matchedRoute = mappingRoutePermissions.find(
(route) => route.path === pathname
);
if (matchedRoute) {
const hasPermission =
!matchedRoute.permissions ||
matchedRoute.permissions.some((perm) => userPermissions.includes(perm));
if (!hasPermission) {
return '/dashboard';
}
}
2025-03-13 02:03:13 +07:00
return null;
};