hazo_auth 1.4.2 → 1.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (320) hide show
  1. package/SETUP_CHECKLIST.md +708 -0
  2. package/dist/app/api/hazo_auth/change_password/route.d.ts +8 -0
  3. package/dist/app/api/hazo_auth/change_password/route.d.ts.map +1 -0
  4. package/dist/app/api/hazo_auth/change_password/route.js +98 -0
  5. package/dist/app/api/hazo_auth/forgot_password/route.d.ts +8 -0
  6. package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -0
  7. package/dist/app/api/hazo_auth/forgot_password/route.js +78 -0
  8. package/dist/app/api/hazo_auth/get_auth/route.d.ts +10 -0
  9. package/dist/app/api/hazo_auth/get_auth/route.d.ts.map +1 -0
  10. package/dist/app/api/hazo_auth/get_auth/route.js +63 -0
  11. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts +14 -0
  12. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts.map +1 -0
  13. package/dist/app/api/hazo_auth/invalidate_cache/route.js +96 -0
  14. package/dist/app/api/hazo_auth/library_photos/route.d.ts +13 -0
  15. package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
  16. package/dist/app/api/hazo_auth/library_photos/route.js +55 -0
  17. package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
  18. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
  19. package/dist/app/api/hazo_auth/login/route.js +140 -0
  20. package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
  21. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
  22. package/dist/app/api/hazo_auth/logout/route.js +71 -0
  23. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  24. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
  25. package/dist/app/api/hazo_auth/me/route.js +34 -0
  26. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
  27. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
  28. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
  29. package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
  30. package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
  31. package/dist/app/api/hazo_auth/register/route.js +80 -0
  32. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
  33. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
  34. package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
  35. package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
  36. package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
  37. package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
  38. package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
  39. package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
  40. package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
  41. package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
  42. package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
  43. package/dist/app/api/hazo_auth/update_user/route.js +95 -0
  44. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
  45. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
  46. package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
  47. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
  48. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
  49. package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
  50. package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
  51. package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
  52. package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
  53. package/dist/cli/generate.d.ts +2 -0
  54. package/dist/cli/generate.d.ts.map +1 -0
  55. package/dist/cli/generate.js +117 -0
  56. package/dist/cli/index.d.ts +3 -0
  57. package/dist/cli/index.d.ts.map +1 -0
  58. package/dist/cli/index.js +120 -0
  59. package/dist/cli/validate.d.ts +15 -0
  60. package/dist/cli/validate.d.ts.map +1 -0
  61. package/dist/cli/validate.js +509 -0
  62. package/dist/components/ui/card.d.ts +9 -0
  63. package/dist/components/ui/card.d.ts.map +1 -0
  64. package/dist/components/ui/card.js +45 -0
  65. package/dist/hooks/use-mobile.d.ts.map +1 -1
  66. package/dist/hooks/use-mobile.js +17 -3
  67. package/dist/server/routes/change_password.d.ts +2 -0
  68. package/dist/server/routes/change_password.d.ts.map +1 -0
  69. package/dist/server/routes/change_password.js +2 -0
  70. package/dist/server/routes/forgot_password.d.ts +2 -0
  71. package/dist/server/routes/forgot_password.d.ts.map +1 -0
  72. package/dist/server/routes/forgot_password.js +2 -0
  73. package/dist/server/routes/get_auth.d.ts +2 -0
  74. package/dist/server/routes/get_auth.d.ts.map +1 -0
  75. package/dist/server/routes/get_auth.js +2 -0
  76. package/dist/server/routes/index.d.ts +18 -0
  77. package/dist/server/routes/index.d.ts.map +1 -0
  78. package/dist/server/routes/index.js +24 -0
  79. package/dist/server/routes/invalidate_cache.d.ts +2 -0
  80. package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
  81. package/dist/server/routes/invalidate_cache.js +2 -0
  82. package/dist/server/routes/library_photos.d.ts +2 -0
  83. package/dist/server/routes/library_photos.d.ts.map +1 -0
  84. package/dist/server/routes/library_photos.js +2 -0
  85. package/dist/server/routes/login.d.ts +2 -0
  86. package/dist/server/routes/login.d.ts.map +1 -0
  87. package/dist/server/routes/login.js +2 -0
  88. package/dist/server/routes/logout.d.ts +2 -0
  89. package/dist/server/routes/logout.d.ts.map +1 -0
  90. package/dist/server/routes/logout.js +2 -0
  91. package/dist/server/routes/me.d.ts +2 -0
  92. package/dist/server/routes/me.d.ts.map +1 -0
  93. package/dist/server/routes/me.js +2 -0
  94. package/dist/server/routes/profile_picture_filename.d.ts +2 -0
  95. package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
  96. package/dist/server/routes/profile_picture_filename.js +3 -0
  97. package/dist/server/routes/register.d.ts +2 -0
  98. package/dist/server/routes/register.d.ts.map +1 -0
  99. package/dist/server/routes/register.js +2 -0
  100. package/dist/server/routes/remove_profile_picture.d.ts +2 -0
  101. package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
  102. package/dist/server/routes/remove_profile_picture.js +2 -0
  103. package/dist/server/routes/resend_verification.d.ts +2 -0
  104. package/dist/server/routes/resend_verification.d.ts.map +1 -0
  105. package/dist/server/routes/resend_verification.js +2 -0
  106. package/dist/server/routes/reset_password.d.ts +2 -0
  107. package/dist/server/routes/reset_password.d.ts.map +1 -0
  108. package/dist/server/routes/reset_password.js +2 -0
  109. package/dist/server/routes/update_user.d.ts +2 -0
  110. package/dist/server/routes/update_user.d.ts.map +1 -0
  111. package/dist/server/routes/update_user.js +2 -0
  112. package/dist/server/routes/upload_profile_picture.d.ts +2 -0
  113. package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
  114. package/dist/server/routes/upload_profile_picture.js +2 -0
  115. package/dist/server/routes/validate_reset_token.d.ts +2 -0
  116. package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
  117. package/dist/server/routes/validate_reset_token.js +2 -0
  118. package/dist/server/routes/verify_email.d.ts +2 -0
  119. package/dist/server/routes/verify_email.d.ts.map +1 -0
  120. package/dist/server/routes/verify_email.js +2 -0
  121. package/package.json +12 -17
  122. package/components.json +0 -22
  123. package/instrumentation.ts +0 -32
  124. package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
  125. package/migrations/002_add_name_to_hazo_users.sql +0 -7
  126. package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
  127. package/next.config.mjs +0 -67
  128. package/postcss.config.mjs +0 -8
  129. package/public/file.svg +0 -1
  130. package/public/globe.svg +0 -1
  131. package/public/next.svg +0 -1
  132. package/public/vercel.svg +0 -1
  133. package/public/window.svg +0 -1
  134. package/scripts/apply_migration.ts +0 -118
  135. package/scripts/init_users.ts +0 -378
  136. package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
  137. package/src/app/api/hazo_auth/change_password/route.ts +0 -132
  138. package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
  139. package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
  140. package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
  141. package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
  142. package/src/app/api/hazo_auth/login/route.ts +0 -181
  143. package/src/app/api/hazo_auth/logout/route.ts +0 -89
  144. package/src/app/api/hazo_auth/me/route.ts +0 -47
  145. package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
  146. package/src/app/api/hazo_auth/register/route.ts +0 -109
  147. package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
  148. package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
  149. package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
  150. package/src/app/api/hazo_auth/update_user/route.ts +0 -126
  151. package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
  152. package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
  153. package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
  154. package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
  155. package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
  156. package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
  157. package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
  158. package/src/app/api/migrations/apply/route.ts +0 -91
  159. package/src/app/favicon.ico +0 -0
  160. package/src/app/fonts/GeistMonoVF.woff +0 -0
  161. package/src/app/fonts/GeistVF.woff +0 -0
  162. package/src/app/globals.css +0 -89
  163. package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
  164. package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
  165. package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
  166. package/src/app/hazo_auth/login/page.tsx +0 -38
  167. package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
  168. package/src/app/hazo_auth/my_settings/page.tsx +0 -40
  169. package/src/app/hazo_auth/register/page.tsx +0 -36
  170. package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
  171. package/src/app/hazo_auth/reset_password/page.tsx +0 -29
  172. package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
  173. package/src/app/hazo_auth/user_management/page.tsx +0 -14
  174. package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
  175. package/src/app/hazo_auth/verify_email/page.tsx +0 -24
  176. package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
  177. package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
  178. package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
  179. package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
  180. package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
  181. package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
  182. package/src/app/layout.tsx +0 -43
  183. package/src/app/page.tsx +0 -170
  184. package/src/components/index.ts +0 -7
  185. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
  186. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
  187. package/src/components/layouts/email_verification/index.tsx +0 -297
  188. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
  189. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
  190. package/src/components/layouts/forgot_password/index.tsx +0 -168
  191. package/src/components/layouts/index.ts +0 -26
  192. package/src/components/layouts/login/config/login_field_config.ts +0 -67
  193. package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
  194. package/src/components/layouts/login/index.tsx +0 -252
  195. package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
  196. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
  197. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
  198. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
  199. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
  200. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
  201. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
  202. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
  203. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
  204. package/src/components/layouts/my_settings/index.tsx +0 -351
  205. package/src/components/layouts/register/config/register_field_config.ts +0 -101
  206. package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
  207. package/src/components/layouts/register/index.tsx +0 -226
  208. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
  209. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
  210. package/src/components/layouts/reset_password/index.tsx +0 -294
  211. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
  212. package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
  213. package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
  214. package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
  215. package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
  216. package/src/components/layouts/shared/components/form_header.tsx +0 -36
  217. package/src/components/layouts/shared/components/logout_button.tsx +0 -76
  218. package/src/components/layouts/shared/components/password_field.tsx +0 -72
  219. package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
  220. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
  221. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
  222. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
  223. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
  224. package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
  225. package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
  226. package/src/components/layouts/shared/config/layout_customization.ts +0 -95
  227. package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
  228. package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
  229. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
  230. package/src/components/layouts/shared/index.ts +0 -34
  231. package/src/components/layouts/shared/utils/ip_address.ts +0 -37
  232. package/src/components/layouts/shared/utils/validation.ts +0 -66
  233. package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
  234. package/src/components/layouts/user_management/index.tsx +0 -1295
  235. package/src/components/ui/alert-dialog.tsx +0 -141
  236. package/src/components/ui/avatar.tsx +0 -50
  237. package/src/components/ui/button.tsx +0 -57
  238. package/src/components/ui/checkbox.tsx +0 -30
  239. package/src/components/ui/dialog.tsx +0 -122
  240. package/src/components/ui/dropdown-menu.tsx +0 -201
  241. package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
  242. package/src/components/ui/index.ts +0 -22
  243. package/src/components/ui/input.tsx +0 -22
  244. package/src/components/ui/label.tsx +0 -26
  245. package/src/components/ui/separator.tsx +0 -31
  246. package/src/components/ui/sheet.tsx +0 -139
  247. package/src/components/ui/sidebar.tsx +0 -773
  248. package/src/components/ui/skeleton.tsx +0 -15
  249. package/src/components/ui/sonner.tsx +0 -31
  250. package/src/components/ui/switch.tsx +0 -29
  251. package/src/components/ui/table.tsx +0 -120
  252. package/src/components/ui/tabs.tsx +0 -55
  253. package/src/components/ui/tooltip.tsx +0 -32
  254. package/src/components/ui/vertical-tabs.tsx +0 -59
  255. package/src/hooks/use-mobile.tsx +0 -19
  256. package/src/index.ts +0 -7
  257. package/src/lib/already_logged_in_config.server.ts +0 -46
  258. package/src/lib/app_logger.ts +0 -24
  259. package/src/lib/auth/auth_cache.ts +0 -220
  260. package/src/lib/auth/auth_rate_limiter.ts +0 -121
  261. package/src/lib/auth/auth_types.ts +0 -65
  262. package/src/lib/auth/auth_utils.server.ts +0 -196
  263. package/src/lib/auth/hazo_get_auth.server.ts +0 -333
  264. package/src/lib/auth/index.ts +0 -23
  265. package/src/lib/auth/server_auth.ts +0 -88
  266. package/src/lib/auth_utility_config.server.ts +0 -136
  267. package/src/lib/config/config_loader.server.ts +0 -164
  268. package/src/lib/email_verification_config.server.ts +0 -32
  269. package/src/lib/file_types_config.server.ts +0 -25
  270. package/src/lib/forgot_password_config.server.ts +0 -32
  271. package/src/lib/hazo_connect_instance.server.ts +0 -101
  272. package/src/lib/hazo_connect_setup.server.ts +0 -194
  273. package/src/lib/hazo_connect_setup.ts +0 -54
  274. package/src/lib/index.ts +0 -44
  275. package/src/lib/login_config.server.ts +0 -71
  276. package/src/lib/messages_config.server.ts +0 -45
  277. package/src/lib/migrations/apply_migration.ts +0 -105
  278. package/src/lib/my_settings_config.server.ts +0 -135
  279. package/src/lib/password_requirements_config.server.ts +0 -39
  280. package/src/lib/profile_pic_menu_config.server.ts +0 -138
  281. package/src/lib/profile_picture_config.server.ts +0 -56
  282. package/src/lib/register_config.server.ts +0 -73
  283. package/src/lib/reset_password_config.server.ts +0 -75
  284. package/src/lib/services/email_service.ts +0 -581
  285. package/src/lib/services/email_verification_service.ts +0 -270
  286. package/src/lib/services/index.ts +0 -15
  287. package/src/lib/services/login_service.ts +0 -134
  288. package/src/lib/services/password_change_service.ts +0 -154
  289. package/src/lib/services/password_reset_service.ts +0 -405
  290. package/src/lib/services/profile_picture_remove_service.ts +0 -120
  291. package/src/lib/services/profile_picture_service.ts +0 -215
  292. package/src/lib/services/profile_picture_source_mapper.ts +0 -62
  293. package/src/lib/services/registration_service.ts +0 -184
  294. package/src/lib/services/token_service.ts +0 -240
  295. package/src/lib/services/user_profiles_service.ts +0 -143
  296. package/src/lib/services/user_update_service.ts +0 -141
  297. package/src/lib/ui_shell_config.server.ts +0 -73
  298. package/src/lib/ui_sizes_config.server.ts +0 -37
  299. package/src/lib/user_fields_config.server.ts +0 -31
  300. package/src/lib/user_management_config.server.ts +0 -39
  301. package/src/lib/utils/api_route_helpers.ts +0 -60
  302. package/src/lib/utils/error_sanitizer.ts +0 -75
  303. package/src/lib/utils.ts +0 -11
  304. package/src/middleware.ts +0 -94
  305. package/src/routes/index.ts +0 -34
  306. package/src/server/config/config_loader.ts +0 -496
  307. package/src/server/index.ts +0 -38
  308. package/src/server/logging/logger_service.ts +0 -56
  309. package/src/server/routes/root_router.ts +0 -16
  310. package/src/server/server.ts +0 -28
  311. package/src/server/types/app_types.ts +0 -74
  312. package/src/server/types/express.d.ts +0 -16
  313. package/src/stories/email_verification_layout.stories.tsx +0 -137
  314. package/src/stories/forgot_password_layout.stories.tsx +0 -85
  315. package/src/stories/login_layout.stories.tsx +0 -85
  316. package/src/stories/project_overview.stories.tsx +0 -33
  317. package/src/stories/register_layout.stories.tsx +0 -107
  318. package/tailwind.config.ts +0 -77
  319. package/tsconfig.build.json +0 -36
  320. package/tsconfig.json +0 -28
@@ -1,367 +0,0 @@
1
- // file_description: API route for permissions management operations (list, migrate from config, update, delete)
2
- // section: imports
3
- import { NextRequest, NextResponse } from "next/server";
4
- import { get_hazo_connect_instance } from "../../../../../lib/hazo_connect_instance.server";
5
- import { createCrudService } from "hazo_connect/server";
6
- import { create_app_logger } from "../../../../../lib/app_logger";
7
- import { get_filename, get_line_number } from "../../../../../lib/utils/api_route_helpers";
8
- import { get_user_management_config } from "../../../../../lib/user_management_config.server";
9
-
10
- // section: route_config
11
- export const dynamic = 'force-dynamic';
12
-
13
- // section: api_handler
14
- /**
15
- * GET - Fetch all permissions from database and config
16
- */
17
- export async function GET(request: NextRequest) {
18
- const logger = create_app_logger();
19
-
20
- try {
21
- const hazoConnect = get_hazo_connect_instance();
22
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
23
-
24
- // Fetch all permissions from database (empty object means no filter - get all records)
25
- const db_permissions = await permissions_service.findBy({});
26
-
27
- if (!Array.isArray(db_permissions)) {
28
- return NextResponse.json(
29
- { error: "Failed to fetch permissions" },
30
- { status: 500 }
31
- );
32
- }
33
-
34
- // Get config permissions
35
- const config = get_user_management_config();
36
- const config_permission_names = config.application_permission_list_defaults || [];
37
-
38
- // Get DB permission names
39
- const db_permission_names = db_permissions.map((p) => p.permission_name as string);
40
-
41
- // Find config permissions not in DB
42
- const config_only_permissions = config_permission_names.filter(
43
- (name) => !db_permission_names.includes(name)
44
- );
45
-
46
- logger.info("user_management_permissions_fetched", {
47
- filename: get_filename(),
48
- line_number: get_line_number(),
49
- db_count: db_permissions.length,
50
- config_count: config_permission_names.length,
51
- });
52
-
53
- return NextResponse.json(
54
- {
55
- success: true,
56
- db_permissions: db_permissions.map((p) => ({
57
- id: p.id,
58
- permission_name: p.permission_name,
59
- description: p.description || "",
60
- })),
61
- config_permissions: config_only_permissions,
62
- },
63
- { status: 200 }
64
- );
65
- } catch (error) {
66
- const error_message = error instanceof Error ? error.message : "Unknown error";
67
- const error_stack = error instanceof Error ? error.stack : undefined;
68
-
69
- logger.error("user_management_permissions_fetch_error", {
70
- filename: get_filename(),
71
- line_number: get_line_number(),
72
- error_message,
73
- error_stack,
74
- });
75
-
76
- return NextResponse.json(
77
- { error: "Failed to fetch permissions" },
78
- { status: 500 }
79
- );
80
- }
81
- }
82
-
83
- /**
84
- * POST - Create new permission or migrate config permissions to database
85
- */
86
- export async function POST(request: NextRequest) {
87
- const logger = create_app_logger();
88
-
89
- try {
90
- const { searchParams } = new URL(request.url);
91
- const action = searchParams.get("action");
92
-
93
- // Handle migrate action
94
- if (action === "migrate") {
95
- const hazoConnect = get_hazo_connect_instance();
96
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
97
-
98
- // Get config permissions
99
- const config = get_user_management_config();
100
- const config_permission_names = config.application_permission_list_defaults || [];
101
-
102
- if (config_permission_names.length === 0) {
103
- return NextResponse.json(
104
- {
105
- success: true,
106
- message: "No permissions to migrate",
107
- created: [],
108
- skipped: [],
109
- },
110
- { status: 200 }
111
- );
112
- }
113
-
114
- // Get existing permissions from DB (empty object means no filter - get all records)
115
- const db_permissions = await permissions_service.findBy({});
116
- const db_permission_names = Array.isArray(db_permissions)
117
- ? db_permissions.map((p) => p.permission_name as string)
118
- : [];
119
-
120
- const now = new Date().toISOString();
121
- const created: string[] = [];
122
- const skipped: string[] = [];
123
-
124
- // Migrate each config permission
125
- for (const permission_name of config_permission_names) {
126
- if (db_permission_names.includes(permission_name)) {
127
- // Skip if already exists
128
- skipped.push(permission_name);
129
- continue;
130
- }
131
-
132
- // Create new permission
133
- await permissions_service.insert({
134
- permission_name: permission_name.trim(),
135
- description: "",
136
- created_at: now,
137
- changed_at: now,
138
- });
139
-
140
- created.push(permission_name);
141
- }
142
-
143
- logger.info("user_management_permissions_migrated", {
144
- filename: get_filename(),
145
- line_number: get_line_number(),
146
- created_count: created.length,
147
- skipped_count: skipped.length,
148
- });
149
-
150
- return NextResponse.json(
151
- {
152
- success: true,
153
- created,
154
- skipped,
155
- },
156
- { status: 200 }
157
- );
158
- }
159
-
160
- // Handle create new permission
161
- const body = await request.json();
162
- const { permission_name, description } = body;
163
-
164
- if (!permission_name || typeof permission_name !== "string" || permission_name.trim().length === 0) {
165
- return NextResponse.json(
166
- { error: "permission_name is required and must be a non-empty string" },
167
- { status: 400 }
168
- );
169
- }
170
-
171
- const hazoConnect = get_hazo_connect_instance();
172
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
173
-
174
- // Check if permission already exists
175
- const existing_permissions = await permissions_service.findBy({
176
- permission_name: permission_name.trim(),
177
- });
178
-
179
- if (Array.isArray(existing_permissions) && existing_permissions.length > 0) {
180
- return NextResponse.json(
181
- { error: "Permission with this name already exists" },
182
- { status: 409 }
183
- );
184
- }
185
-
186
- // Create new permission
187
- const now = new Date().toISOString();
188
- const new_permission_result = await permissions_service.insert({
189
- permission_name: permission_name.trim(),
190
- description: (description || "").trim(),
191
- created_at: now,
192
- changed_at: now,
193
- });
194
-
195
- // insert() returns an array, get the first element
196
- if (!Array.isArray(new_permission_result) || new_permission_result.length === 0) {
197
- return NextResponse.json(
198
- { error: "Failed to create permission - no record returned" },
199
- { status: 500 }
200
- );
201
- }
202
-
203
- const new_permission = new_permission_result[0] as { id: number; permission_name: string; description: string };
204
-
205
- logger.info("user_management_permission_created", {
206
- filename: get_filename(),
207
- line_number: get_line_number(),
208
- permission_id: new_permission.id,
209
- permission_name: permission_name.trim(),
210
- });
211
-
212
- return NextResponse.json(
213
- {
214
- success: true,
215
- permission: {
216
- id: new_permission.id,
217
- permission_name: permission_name.trim(),
218
- description: (description || "").trim(),
219
- },
220
- },
221
- { status: 201 }
222
- );
223
- } catch (error) {
224
- const error_message = error instanceof Error ? error.message : "Unknown error";
225
- const error_stack = error instanceof Error ? error.stack : undefined;
226
-
227
- logger.error("user_management_permissions_post_error", {
228
- filename: get_filename(),
229
- line_number: get_line_number(),
230
- error_message,
231
- error_stack,
232
- });
233
-
234
- return NextResponse.json(
235
- { error: "Failed to create permission" },
236
- { status: 500 }
237
- );
238
- }
239
- }
240
-
241
- /**
242
- * PUT - Update permission description
243
- */
244
- export async function PUT(request: NextRequest) {
245
- const logger = create_app_logger();
246
-
247
- try {
248
- const body = await request.json();
249
- const { permission_id, description } = body;
250
-
251
- if (!permission_id || typeof description !== "string") {
252
- return NextResponse.json(
253
- { error: "permission_id and description are required" },
254
- { status: 400 }
255
- );
256
- }
257
-
258
- const hazoConnect = get_hazo_connect_instance();
259
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
260
-
261
- // Update permission with changed_at timestamp
262
- const now = new Date().toISOString();
263
- await permissions_service.updateById(permission_id, {
264
- description: description.trim(),
265
- changed_at: now,
266
- });
267
-
268
- logger.info("user_management_permission_updated", {
269
- filename: get_filename(),
270
- line_number: get_line_number(),
271
- permission_id,
272
- });
273
-
274
- return NextResponse.json(
275
- { success: true },
276
- { status: 200 }
277
- );
278
- } catch (error) {
279
- const error_message = error instanceof Error ? error.message : "Unknown error";
280
- const error_stack = error instanceof Error ? error.stack : undefined;
281
-
282
- logger.error("user_management_permission_update_error", {
283
- filename: get_filename(),
284
- line_number: get_line_number(),
285
- error_message,
286
- error_stack,
287
- });
288
-
289
- return NextResponse.json(
290
- { error: "Failed to update permission" },
291
- { status: 500 }
292
- );
293
- }
294
- }
295
-
296
- /**
297
- * DELETE - Delete permission from database
298
- */
299
- export async function DELETE(request: NextRequest) {
300
- const logger = create_app_logger();
301
-
302
- try {
303
- const { searchParams } = new URL(request.url);
304
- const permission_id = searchParams.get("permission_id");
305
-
306
- if (!permission_id) {
307
- return NextResponse.json(
308
- { error: "permission_id is required" },
309
- { status: 400 }
310
- );
311
- }
312
-
313
- const permission_id_num = parseInt(permission_id, 10);
314
- if (isNaN(permission_id_num)) {
315
- return NextResponse.json(
316
- { error: "permission_id must be a number" },
317
- { status: 400 }
318
- );
319
- }
320
-
321
- const hazoConnect = get_hazo_connect_instance();
322
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
323
- const role_permissions_service = createCrudService(hazoConnect, "hazo_role_permissions");
324
-
325
- // Check if permission is used in any role
326
- const role_permissions = await role_permissions_service.findBy({
327
- permission_id: permission_id_num,
328
- });
329
-
330
- if (Array.isArray(role_permissions) && role_permissions.length > 0) {
331
- return NextResponse.json(
332
- { error: "Cannot delete permission that is assigned to roles" },
333
- { status: 409 }
334
- );
335
- }
336
-
337
- // Delete permission
338
- await permissions_service.deleteById(permission_id_num);
339
-
340
- logger.info("user_management_permission_deleted", {
341
- filename: get_filename(),
342
- line_number: get_line_number(),
343
- permission_id: permission_id_num,
344
- });
345
-
346
- return NextResponse.json(
347
- { success: true },
348
- { status: 200 }
349
- );
350
- } catch (error) {
351
- const error_message = error instanceof Error ? error.message : "Unknown error";
352
- const error_stack = error instanceof Error ? error.stack : undefined;
353
-
354
- logger.error("user_management_permission_delete_error", {
355
- filename: get_filename(),
356
- line_number: get_line_number(),
357
- error_message,
358
- error_stack,
359
- });
360
-
361
- return NextResponse.json(
362
- { error: "Failed to delete permission" },
363
- { status: 500 }
364
- );
365
- }
366
- }
367
-