From bbbebfcae4b6ec714c1af3b27472d832b5e1289d Mon Sep 17 00:00:00 2001 From: "cyril.tsui" Date: Thu, 30 May 2024 16:45:02 +0800 Subject: [PATCH] Update task & project access right (Need MAINTAIN_TASK_TEMPLATE, MAINTAIN_PROJECT) --- src/app/(main)/projects/page.tsx | 2 +- src/app/utils/commonUtil.ts | 2 +- src/components/NavigationContent/NavigationContent.tsx | 5 +++-- src/middleware.ts | 9 +++++++++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/app/(main)/projects/page.tsx b/src/app/(main)/projects/page.tsx index 724b25c..837be0a 100644 --- a/src/app/(main)/projects/page.tsx +++ b/src/app/(main)/projects/page.tsx @@ -22,7 +22,7 @@ const Projects: React.FC = async () => { fetchProjectCategories(); const projects = await fetchProjects(); const abilities = await getUserAbilities() - if (![VIEW_PROJECT, MAINTAIN_PROJECT].some(ability => abilities.includes(ability))) { + if (![MAINTAIN_PROJECT].some(ability => abilities.includes(ability))) { notFound(); } diff --git a/src/app/utils/commonUtil.ts b/src/app/utils/commonUtil.ts index 9356047..fa68bda 100644 --- a/src/app/utils/commonUtil.ts +++ b/src/app/utils/commonUtil.ts @@ -53,5 +53,5 @@ export function readIntFromString(input: string): [string, number | null] | stri export const getUserAbilities = async () => { const session = await getServerSession(authOptions) as SessionWithTokens; - return session?.abilities ?? [] + return session?.abilities ?? [] as string[] } \ No newline at end of file diff --git a/src/components/NavigationContent/NavigationContent.tsx b/src/components/NavigationContent/NavigationContent.tsx index ccf1b2a..9ee6354 100644 --- a/src/components/NavigationContent/NavigationContent.tsx +++ b/src/components/NavigationContent/NavigationContent.tsx @@ -38,6 +38,7 @@ import { GENERATE_REPORTS, MAINTAIN_MASTERDATA, MAINTAIN_PROJECT, + MAINTAIN_TASK_TEMPLATE, MAINTAIN_USER, VIEW_MASTERDATA, VIEW_PROJECT, @@ -133,8 +134,8 @@ const NavigationContent: React.FC = ({ abilities }) => { // }, // ], // }, - { icon: , label: "Project Management", path: "/projects", isHidden: ![VIEW_PROJECT, MAINTAIN_PROJECT].some((ability) => abilities?.includes(ability)) }, - { icon: , label: "Task Template", path: "/tasks" }, + { icon: , label: "Project Management", path: "/projects", isHidden: ![MAINTAIN_PROJECT].some((ability) => abilities?.includes(ability)) }, + { icon: , label: "Task Template", path: "/tasks", isHidden: ![MAINTAIN_TASK_TEMPLATE].some((ability) => abilities?.includes(ability)) }, { icon: , label: "Invoice", path: "/invoice" }, { icon: , diff --git a/src/middleware.ts b/src/middleware.ts index 9f2e2b3..03da1b5 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -97,6 +97,15 @@ export default async function middleware( return Boolean(token) } const abilities = (token!.abilities as ability[]).map((item: ability) => item.actionSubjectCombo); + + if (req.nextUrl.pathname.startsWith('/projects')) { + isAuth = [MAINTAIN_PROJECT].some((ability) => abilities.includes(ability)); + } + + if (req.nextUrl.pathname.startsWith('/tasks')) { + isAuth = [MAINTAIN_TASK_TEMPLATE].some((ability) => abilities.includes(ability)); + } + if (req.nextUrl.pathname.startsWith('/settings')) { isAuth = [VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities.includes(ability)); }