- Upgrade Nx 22.1.1 → 22.6.3 and all patch/minor dependencies - Restructure shared libs: move business logic from utils to service - Consolidate shadcn-ui into ui lib with atomic design pattern - Fix container centering for landing app (Tailwind v4 compatibility) - Fix button styling by updating @source directive in globals.css - Fix SiCss3 → SiCss rename in react-icons 5.6 - Fix duplicate useSession export conflict - Remove dead code, comments, and unused files Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
119 lines
2.6 KiB
TypeScript
119 lines
2.6 KiB
TypeScript
import {
|
|
PERMISSIONS,
|
|
SessionToken,
|
|
SessionUser,
|
|
} from '@imphnen-frontend-service/service';
|
|
import { LoaderFunctionArgs, redirect } from 'react-router';
|
|
|
|
const mappingPublicRoutes = [
|
|
'/',
|
|
'/auth/login',
|
|
'/auth/forgot',
|
|
'/auth/forgot/otp',
|
|
'/auth/register',
|
|
'/auth/register/otp',
|
|
'/auth/register/success',
|
|
'/auth/new-password',
|
|
'/auth/register-mentor',
|
|
'/auth/register-mentor/pending',
|
|
'/auth/register-mentor/success',
|
|
'/auth/google-callback',
|
|
'/auth/google-oauth-popup',
|
|
'/resources',
|
|
];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],
|
|
},
|
|
];
|
|
|
|
const mappingPublicPrefixRoutes = [
|
|
'/mentoring',
|
|
'/articles',
|
|
]
|
|
|
|
export const middleware = async ({ request }: LoaderFunctionArgs) => {
|
|
const url = new URL(request.url);
|
|
const pathname = url.pathname;
|
|
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) ?? [];
|
|
|
|
if (mappingPublicPrefixRoutes.some((prefix) => pathname.startsWith(prefix))) {
|
|
return null;
|
|
}
|
|
|
|
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';
|
|
}
|
|
}
|
|
|
|
return null;
|
|
};
|