25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

112 satır
3.2 KiB

  1. import { NextRequestWithAuth, withAuth } from "next-auth/middleware";
  2. import { ability, authOptions } from "@/config/authConfig";
  3. import { NextFetchEvent, NextResponse } from "next/server";
  4. import { getToken } from "next-auth/jwt";
  5. // abilities
  6. export const [
  7. VIEW_USER,
  8. MAINTAIN_USER,
  9. MAINTAIN_TIMESHEET,
  10. VIEW_TASK_TEMPLATE,
  11. VIEW_GROUP,
  12. VIEW_MASTERDATA,
  13. MAINTAIN_MASTERDATA,
  14. VIEW_DASHBOARD_SELF,
  15. VIEW_DASHBOARD_ALL,
  16. IMPORT_INVOICE,
  17. MAINTAIN_GROUP,
  18. GENERATE_REPORTS,
  19. VIEW_STAFF_PROFILE,
  20. IMPORT_RECEIPT,
  21. MAINTAIN_TASK_TEMPLATE,
  22. MAINTAIN_TIMESHEET_7DAYS,
  23. VIEW_PROJECT,
  24. MAINTAIN_PROJECT,
  25. ] = [
  26. 'VIEW_USER',
  27. 'MAINTAIN_USER',
  28. 'MAINTAIN_TIMESHEET',
  29. 'VIEW_TASK_TEMPLATE',
  30. 'VIEW_GROUP',
  31. 'VIEW_MASTERDATA',
  32. 'MAINTAIN_MASTERDATA',
  33. 'VIEW_DASHBOARD_SELF',
  34. 'VIEW_DASHBOARD_ALL',
  35. 'IMPORT_INVOICE',
  36. 'MAINTAIN_GROUP',
  37. 'GENERATE_REPORTS',
  38. 'VIEW_STAFF_PROFILE',
  39. 'IMPORT_RECEIPT',
  40. 'MAINTAIN_TASK_TEMPLATE',
  41. 'MAINTAIN_TIMESHEET_7DAYS',
  42. 'VIEW_PROJECT',
  43. 'MAINTAIN_PROJECT'
  44. ]
  45. const PRIVATE_ROUTES = [
  46. "/analytics",
  47. "/dashboard",
  48. "/home",
  49. "/invoice",
  50. "/projects",
  51. "/tasks",
  52. "/settings",
  53. "/staffReimbursement",
  54. ];
  55. const LANG_QUERY_PARAM = "lang";
  56. export default async function middleware(
  57. req: NextRequestWithAuth,
  58. event: NextFetchEvent,
  59. ) {
  60. const langPref = req.nextUrl.searchParams.get(LANG_QUERY_PARAM);
  61. const token = await getToken({ req: req, secret: process.env.SECRET });
  62. if (langPref) {
  63. // Redirect to same url without the lang query param + set cookies
  64. const newUrl = new URL(req.nextUrl);
  65. newUrl.searchParams.delete(LANG_QUERY_PARAM);
  66. const response = NextResponse.redirect(newUrl);
  67. response.cookies.set("i18next", langPref);
  68. return response;
  69. }
  70. let abilities: string[] = []
  71. if (token) {
  72. abilities = (token.abilities as ability[]).map((item: ability) => item.actionSubjectCombo);
  73. }
  74. const authMiddleware = withAuth({
  75. pages: authOptions.pages,
  76. callbacks: {
  77. authorized: ({req, token}) => {
  78. let isAuth = Boolean(token);
  79. if (!Boolean(token)) {
  80. return Boolean(token)
  81. }
  82. if (req.nextUrl.pathname.startsWith('/settings')) {
  83. isAuth = [VIEW_MASTERDATA, MAINTAIN_MASTERDATA].some((ability) => abilities.includes(ability));
  84. }
  85. if (req.nextUrl.pathname.startsWith('/settings/user')) {
  86. isAuth = [MAINTAIN_USER, VIEW_USER].some((ability) => abilities.includes(ability));
  87. }
  88. if (req.nextUrl.pathname.startsWith('/settings/staff/user')) {
  89. isAuth = [MAINTAIN_USER, VIEW_USER].some((ability) => abilities.includes(ability));
  90. }
  91. if (req.nextUrl.pathname.startsWith('/analytics')) {
  92. isAuth = [GENERATE_REPORTS].some((ability) => abilities.includes(ability));
  93. }
  94. if (req.nextUrl.pathname.startsWith('/settings/staff/edit')) {
  95. isAuth = [VIEW_STAFF_PROFILE].some((ability) => abilities.includes(ability));
  96. }
  97. return isAuth
  98. }
  99. }
  100. });
  101. // Matcher for using the auth middleware
  102. return PRIVATE_ROUTES.some((route) => req.nextUrl.pathname.startsWith(route))
  103. ? await authMiddleware(req, event) // Let auth middleware handle response
  104. : NextResponse.next(); // Return normal response
  105. }