@@ -22,7 +22,7 @@ const Projects: React.FC = async () => { | |||||
fetchProjectCategories(); | fetchProjectCategories(); | ||||
const projects = await fetchProjects(); | const projects = await fetchProjects(); | ||||
const abilities = await getUserAbilities() | const abilities = await getUserAbilities() | ||||
if (![VIEW_PROJECT, MAINTAIN_PROJECT].some(ability => abilities.includes(ability))) { | |||||
if (![MAINTAIN_PROJECT].some(ability => abilities.includes(ability))) { | |||||
notFound(); | notFound(); | ||||
} | } | ||||
@@ -53,5 +53,5 @@ export function readIntFromString(input: string): [string, number | null] | stri | |||||
export const getUserAbilities = async () => { | export const getUserAbilities = async () => { | ||||
const session = await getServerSession(authOptions) as SessionWithTokens; | const session = await getServerSession(authOptions) as SessionWithTokens; | ||||
return session?.abilities ?? [] | |||||
return session?.abilities ?? [] as string[] | |||||
} | } |
@@ -38,6 +38,7 @@ import { | |||||
GENERATE_REPORTS, | GENERATE_REPORTS, | ||||
MAINTAIN_MASTERDATA, | MAINTAIN_MASTERDATA, | ||||
MAINTAIN_PROJECT, | MAINTAIN_PROJECT, | ||||
MAINTAIN_TASK_TEMPLATE, | |||||
MAINTAIN_USER, | MAINTAIN_USER, | ||||
VIEW_MASTERDATA, | VIEW_MASTERDATA, | ||||
VIEW_PROJECT, | VIEW_PROJECT, | ||||
@@ -133,8 +134,8 @@ const NavigationContent: React.FC<Props> = ({ abilities }) => { | |||||
// }, | // }, | ||||
// ], | // ], | ||||
// }, | // }, | ||||
{ icon: <Assignment />, label: "Project Management", path: "/projects", isHidden: ![VIEW_PROJECT, MAINTAIN_PROJECT].some((ability) => abilities?.includes(ability)) }, | |||||
{ icon: <Task />, label: "Task Template", path: "/tasks" }, | |||||
{ icon: <Assignment />, label: "Project Management", path: "/projects", isHidden: ![MAINTAIN_PROJECT].some((ability) => abilities?.includes(ability)) }, | |||||
{ icon: <Task />, label: "Task Template", path: "/tasks", isHidden: ![MAINTAIN_TASK_TEMPLATE].some((ability) => abilities?.includes(ability)) }, | |||||
{ icon: <Payments />, label: "Invoice", path: "/invoice" }, | { icon: <Payments />, label: "Invoice", path: "/invoice" }, | ||||
{ | { | ||||
icon: <Analytics />, | icon: <Analytics />, | ||||
@@ -97,6 +97,15 @@ export default async function middleware( | |||||
return Boolean(token) | return Boolean(token) | ||||
} | } | ||||
const abilities = (token!.abilities as ability[]).map((item: ability) => item.actionSubjectCombo); | 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')) { | if (req.nextUrl.pathname.startsWith('/settings')) { | ||||
isAuth = [VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities.includes(ability)); | isAuth = [VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities.includes(ability)); | ||||
} | } | ||||