hazo_auth 1.4.2 → 1.6.1

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 (354) hide show
  1. package/README.md +65 -19
  2. package/SETUP_CHECKLIST.md +779 -0
  3. package/dist/app/api/hazo_auth/change_password/route.d.ts +8 -0
  4. package/dist/app/api/hazo_auth/change_password/route.d.ts.map +1 -0
  5. package/dist/app/api/hazo_auth/change_password/route.js +98 -0
  6. package/dist/app/api/hazo_auth/forgot_password/route.d.ts +8 -0
  7. package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -0
  8. package/dist/app/api/hazo_auth/forgot_password/route.js +78 -0
  9. package/dist/app/api/hazo_auth/get_auth/route.d.ts +10 -0
  10. package/dist/app/api/hazo_auth/get_auth/route.d.ts.map +1 -0
  11. package/dist/app/api/hazo_auth/get_auth/route.js +63 -0
  12. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts +14 -0
  13. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts.map +1 -0
  14. package/dist/app/api/hazo_auth/invalidate_cache/route.js +96 -0
  15. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.d.ts +9 -0
  16. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.d.ts.map +1 -0
  17. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.js +82 -0
  18. package/dist/app/api/hazo_auth/library_photos/route.d.ts +22 -0
  19. package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
  20. package/dist/app/api/hazo_auth/library_photos/route.js +80 -0
  21. package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
  22. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
  23. package/dist/app/api/hazo_auth/login/route.js +140 -0
  24. package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
  25. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
  26. package/dist/app/api/hazo_auth/logout/route.js +71 -0
  27. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  28. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
  29. package/dist/app/api/hazo_auth/me/route.js +34 -0
  30. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
  31. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
  32. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
  33. package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
  34. package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
  35. package/dist/app/api/hazo_auth/register/route.js +80 -0
  36. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
  37. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
  38. package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
  39. package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
  40. package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
  41. package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
  42. package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
  43. package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
  44. package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
  45. package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
  46. package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
  47. package/dist/app/api/hazo_auth/update_user/route.js +95 -0
  48. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
  49. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
  50. package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
  51. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
  52. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
  53. package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
  54. package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
  55. package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
  56. package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
  57. package/dist/cli/generate.d.ts +7 -0
  58. package/dist/cli/generate.d.ts.map +1 -0
  59. package/dist/cli/generate.js +184 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +173 -0
  63. package/dist/cli/init.d.ts +2 -0
  64. package/dist/cli/init.d.ts.map +1 -0
  65. package/dist/cli/init.js +201 -0
  66. package/dist/cli/validate.d.ts +15 -0
  67. package/dist/cli/validate.d.ts.map +1 -0
  68. package/dist/cli/validate.js +509 -0
  69. package/dist/components/ui/card.d.ts +9 -0
  70. package/dist/components/ui/card.d.ts.map +1 -0
  71. package/dist/components/ui/card.js +45 -0
  72. package/dist/hooks/use-mobile.d.ts.map +1 -1
  73. package/dist/hooks/use-mobile.js +17 -3
  74. package/dist/lib/services/profile_picture_service.d.ts +34 -2
  75. package/dist/lib/services/profile_picture_service.d.ts.map +1 -1
  76. package/dist/lib/services/profile_picture_service.js +157 -15
  77. package/dist/page_components/forgot_password.d.ts +19 -0
  78. package/dist/page_components/forgot_password.d.ts.map +1 -0
  79. package/dist/page_components/forgot_password.js +36 -0
  80. package/dist/page_components/index.d.ts +7 -0
  81. package/dist/page_components/index.d.ts.map +1 -0
  82. package/dist/page_components/index.js +9 -0
  83. package/dist/page_components/login.d.ts +26 -0
  84. package/dist/page_components/login.d.ts.map +1 -0
  85. package/dist/page_components/login.js +40 -0
  86. package/dist/page_components/my_settings.d.ts +64 -0
  87. package/dist/page_components/my_settings.d.ts.map +1 -0
  88. package/dist/page_components/my_settings.js +67 -0
  89. package/dist/page_components/register.d.ts +25 -0
  90. package/dist/page_components/register.d.ts.map +1 -0
  91. package/dist/page_components/register.js +43 -0
  92. package/dist/page_components/reset_password.d.ts +25 -0
  93. package/dist/page_components/reset_password.d.ts.map +1 -0
  94. package/dist/page_components/reset_password.js +43 -0
  95. package/dist/page_components/verify_email.d.ts +21 -0
  96. package/dist/page_components/verify_email.d.ts.map +1 -0
  97. package/dist/page_components/verify_email.js +36 -0
  98. package/dist/server/routes/change_password.d.ts +2 -0
  99. package/dist/server/routes/change_password.d.ts.map +1 -0
  100. package/dist/server/routes/change_password.js +2 -0
  101. package/dist/server/routes/forgot_password.d.ts +2 -0
  102. package/dist/server/routes/forgot_password.d.ts.map +1 -0
  103. package/dist/server/routes/forgot_password.js +2 -0
  104. package/dist/server/routes/get_auth.d.ts +2 -0
  105. package/dist/server/routes/get_auth.d.ts.map +1 -0
  106. package/dist/server/routes/get_auth.js +2 -0
  107. package/dist/server/routes/index.d.ts +19 -0
  108. package/dist/server/routes/index.d.ts.map +1 -0
  109. package/dist/server/routes/index.js +25 -0
  110. package/dist/server/routes/invalidate_cache.d.ts +2 -0
  111. package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
  112. package/dist/server/routes/invalidate_cache.js +2 -0
  113. package/dist/server/routes/library_photo.d.ts +2 -0
  114. package/dist/server/routes/library_photo.d.ts.map +1 -0
  115. package/dist/server/routes/library_photo.js +3 -0
  116. package/dist/server/routes/library_photos.d.ts +2 -0
  117. package/dist/server/routes/library_photos.d.ts.map +1 -0
  118. package/dist/server/routes/library_photos.js +2 -0
  119. package/dist/server/routes/login.d.ts +2 -0
  120. package/dist/server/routes/login.d.ts.map +1 -0
  121. package/dist/server/routes/login.js +2 -0
  122. package/dist/server/routes/logout.d.ts +2 -0
  123. package/dist/server/routes/logout.d.ts.map +1 -0
  124. package/dist/server/routes/logout.js +2 -0
  125. package/dist/server/routes/me.d.ts +2 -0
  126. package/dist/server/routes/me.d.ts.map +1 -0
  127. package/dist/server/routes/me.js +2 -0
  128. package/dist/server/routes/profile_picture_filename.d.ts +2 -0
  129. package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
  130. package/dist/server/routes/profile_picture_filename.js +3 -0
  131. package/dist/server/routes/register.d.ts +2 -0
  132. package/dist/server/routes/register.d.ts.map +1 -0
  133. package/dist/server/routes/register.js +2 -0
  134. package/dist/server/routes/remove_profile_picture.d.ts +2 -0
  135. package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
  136. package/dist/server/routes/remove_profile_picture.js +2 -0
  137. package/dist/server/routes/resend_verification.d.ts +2 -0
  138. package/dist/server/routes/resend_verification.d.ts.map +1 -0
  139. package/dist/server/routes/resend_verification.js +2 -0
  140. package/dist/server/routes/reset_password.d.ts +2 -0
  141. package/dist/server/routes/reset_password.d.ts.map +1 -0
  142. package/dist/server/routes/reset_password.js +2 -0
  143. package/dist/server/routes/update_user.d.ts +2 -0
  144. package/dist/server/routes/update_user.d.ts.map +1 -0
  145. package/dist/server/routes/update_user.js +2 -0
  146. package/dist/server/routes/upload_profile_picture.d.ts +2 -0
  147. package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
  148. package/dist/server/routes/upload_profile_picture.js +2 -0
  149. package/dist/server/routes/validate_reset_token.d.ts +2 -0
  150. package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
  151. package/dist/server/routes/validate_reset_token.js +2 -0
  152. package/dist/server/routes/verify_email.d.ts +2 -0
  153. package/dist/server/routes/verify_email.d.ts.map +1 -0
  154. package/dist/server/routes/verify_email.js +2 -0
  155. package/package.json +40 -17
  156. package/components.json +0 -22
  157. package/instrumentation.ts +0 -32
  158. package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
  159. package/migrations/002_add_name_to_hazo_users.sql +0 -7
  160. package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
  161. package/next.config.mjs +0 -67
  162. package/postcss.config.mjs +0 -8
  163. package/public/file.svg +0 -1
  164. package/public/globe.svg +0 -1
  165. package/public/next.svg +0 -1
  166. package/public/vercel.svg +0 -1
  167. package/public/window.svg +0 -1
  168. package/scripts/apply_migration.ts +0 -118
  169. package/scripts/init_users.ts +0 -378
  170. package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
  171. package/src/app/api/hazo_auth/change_password/route.ts +0 -132
  172. package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
  173. package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
  174. package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
  175. package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
  176. package/src/app/api/hazo_auth/login/route.ts +0 -181
  177. package/src/app/api/hazo_auth/logout/route.ts +0 -89
  178. package/src/app/api/hazo_auth/me/route.ts +0 -47
  179. package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
  180. package/src/app/api/hazo_auth/register/route.ts +0 -109
  181. package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
  182. package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
  183. package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
  184. package/src/app/api/hazo_auth/update_user/route.ts +0 -126
  185. package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
  186. package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
  187. package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
  188. package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
  189. package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
  190. package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
  191. package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
  192. package/src/app/api/migrations/apply/route.ts +0 -91
  193. package/src/app/favicon.ico +0 -0
  194. package/src/app/fonts/GeistMonoVF.woff +0 -0
  195. package/src/app/fonts/GeistVF.woff +0 -0
  196. package/src/app/globals.css +0 -89
  197. package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
  198. package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
  199. package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
  200. package/src/app/hazo_auth/login/page.tsx +0 -38
  201. package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
  202. package/src/app/hazo_auth/my_settings/page.tsx +0 -40
  203. package/src/app/hazo_auth/register/page.tsx +0 -36
  204. package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
  205. package/src/app/hazo_auth/reset_password/page.tsx +0 -29
  206. package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
  207. package/src/app/hazo_auth/user_management/page.tsx +0 -14
  208. package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
  209. package/src/app/hazo_auth/verify_email/page.tsx +0 -24
  210. package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
  211. package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
  212. package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
  213. package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
  214. package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
  215. package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
  216. package/src/app/layout.tsx +0 -43
  217. package/src/app/page.tsx +0 -170
  218. package/src/components/index.ts +0 -7
  219. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
  220. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
  221. package/src/components/layouts/email_verification/index.tsx +0 -297
  222. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
  223. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
  224. package/src/components/layouts/forgot_password/index.tsx +0 -168
  225. package/src/components/layouts/index.ts +0 -26
  226. package/src/components/layouts/login/config/login_field_config.ts +0 -67
  227. package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
  228. package/src/components/layouts/login/index.tsx +0 -252
  229. package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
  230. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
  231. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
  232. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
  233. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
  234. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
  235. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
  236. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
  237. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
  238. package/src/components/layouts/my_settings/index.tsx +0 -351
  239. package/src/components/layouts/register/config/register_field_config.ts +0 -101
  240. package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
  241. package/src/components/layouts/register/index.tsx +0 -226
  242. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
  243. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
  244. package/src/components/layouts/reset_password/index.tsx +0 -294
  245. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
  246. package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
  247. package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
  248. package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
  249. package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
  250. package/src/components/layouts/shared/components/form_header.tsx +0 -36
  251. package/src/components/layouts/shared/components/logout_button.tsx +0 -76
  252. package/src/components/layouts/shared/components/password_field.tsx +0 -72
  253. package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
  254. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
  255. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
  256. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
  257. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
  258. package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
  259. package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
  260. package/src/components/layouts/shared/config/layout_customization.ts +0 -95
  261. package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
  262. package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
  263. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
  264. package/src/components/layouts/shared/index.ts +0 -34
  265. package/src/components/layouts/shared/utils/ip_address.ts +0 -37
  266. package/src/components/layouts/shared/utils/validation.ts +0 -66
  267. package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
  268. package/src/components/layouts/user_management/index.tsx +0 -1295
  269. package/src/components/ui/alert-dialog.tsx +0 -141
  270. package/src/components/ui/avatar.tsx +0 -50
  271. package/src/components/ui/button.tsx +0 -57
  272. package/src/components/ui/checkbox.tsx +0 -30
  273. package/src/components/ui/dialog.tsx +0 -122
  274. package/src/components/ui/dropdown-menu.tsx +0 -201
  275. package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
  276. package/src/components/ui/index.ts +0 -22
  277. package/src/components/ui/input.tsx +0 -22
  278. package/src/components/ui/label.tsx +0 -26
  279. package/src/components/ui/separator.tsx +0 -31
  280. package/src/components/ui/sheet.tsx +0 -139
  281. package/src/components/ui/sidebar.tsx +0 -773
  282. package/src/components/ui/skeleton.tsx +0 -15
  283. package/src/components/ui/sonner.tsx +0 -31
  284. package/src/components/ui/switch.tsx +0 -29
  285. package/src/components/ui/table.tsx +0 -120
  286. package/src/components/ui/tabs.tsx +0 -55
  287. package/src/components/ui/tooltip.tsx +0 -32
  288. package/src/components/ui/vertical-tabs.tsx +0 -59
  289. package/src/hooks/use-mobile.tsx +0 -19
  290. package/src/index.ts +0 -7
  291. package/src/lib/already_logged_in_config.server.ts +0 -46
  292. package/src/lib/app_logger.ts +0 -24
  293. package/src/lib/auth/auth_cache.ts +0 -220
  294. package/src/lib/auth/auth_rate_limiter.ts +0 -121
  295. package/src/lib/auth/auth_types.ts +0 -65
  296. package/src/lib/auth/auth_utils.server.ts +0 -196
  297. package/src/lib/auth/hazo_get_auth.server.ts +0 -333
  298. package/src/lib/auth/index.ts +0 -23
  299. package/src/lib/auth/server_auth.ts +0 -88
  300. package/src/lib/auth_utility_config.server.ts +0 -136
  301. package/src/lib/config/config_loader.server.ts +0 -164
  302. package/src/lib/email_verification_config.server.ts +0 -32
  303. package/src/lib/file_types_config.server.ts +0 -25
  304. package/src/lib/forgot_password_config.server.ts +0 -32
  305. package/src/lib/hazo_connect_instance.server.ts +0 -101
  306. package/src/lib/hazo_connect_setup.server.ts +0 -194
  307. package/src/lib/hazo_connect_setup.ts +0 -54
  308. package/src/lib/index.ts +0 -44
  309. package/src/lib/login_config.server.ts +0 -71
  310. package/src/lib/messages_config.server.ts +0 -45
  311. package/src/lib/migrations/apply_migration.ts +0 -105
  312. package/src/lib/my_settings_config.server.ts +0 -135
  313. package/src/lib/password_requirements_config.server.ts +0 -39
  314. package/src/lib/profile_pic_menu_config.server.ts +0 -138
  315. package/src/lib/profile_picture_config.server.ts +0 -56
  316. package/src/lib/register_config.server.ts +0 -73
  317. package/src/lib/reset_password_config.server.ts +0 -75
  318. package/src/lib/services/email_service.ts +0 -581
  319. package/src/lib/services/email_verification_service.ts +0 -270
  320. package/src/lib/services/index.ts +0 -15
  321. package/src/lib/services/login_service.ts +0 -134
  322. package/src/lib/services/password_change_service.ts +0 -154
  323. package/src/lib/services/password_reset_service.ts +0 -405
  324. package/src/lib/services/profile_picture_remove_service.ts +0 -120
  325. package/src/lib/services/profile_picture_service.ts +0 -215
  326. package/src/lib/services/profile_picture_source_mapper.ts +0 -62
  327. package/src/lib/services/registration_service.ts +0 -184
  328. package/src/lib/services/token_service.ts +0 -240
  329. package/src/lib/services/user_profiles_service.ts +0 -143
  330. package/src/lib/services/user_update_service.ts +0 -141
  331. package/src/lib/ui_shell_config.server.ts +0 -73
  332. package/src/lib/ui_sizes_config.server.ts +0 -37
  333. package/src/lib/user_fields_config.server.ts +0 -31
  334. package/src/lib/user_management_config.server.ts +0 -39
  335. package/src/lib/utils/api_route_helpers.ts +0 -60
  336. package/src/lib/utils/error_sanitizer.ts +0 -75
  337. package/src/lib/utils.ts +0 -11
  338. package/src/middleware.ts +0 -94
  339. package/src/routes/index.ts +0 -34
  340. package/src/server/config/config_loader.ts +0 -496
  341. package/src/server/index.ts +0 -38
  342. package/src/server/logging/logger_service.ts +0 -56
  343. package/src/server/routes/root_router.ts +0 -16
  344. package/src/server/server.ts +0 -28
  345. package/src/server/types/app_types.ts +0 -74
  346. package/src/server/types/express.d.ts +0 -16
  347. package/src/stories/email_verification_layout.stories.tsx +0 -137
  348. package/src/stories/forgot_password_layout.stories.tsx +0 -85
  349. package/src/stories/login_layout.stories.tsx +0 -85
  350. package/src/stories/project_overview.stories.tsx +0 -33
  351. package/src/stories/register_layout.stories.tsx +0 -107
  352. package/tailwind.config.ts +0 -77
  353. package/tsconfig.build.json +0 -36
  354. package/tsconfig.json +0 -28
@@ -1,442 +0,0 @@
1
- // file_description: API route for roles management operations (list roles with permissions, create role, update role permissions)
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, getSqliteAdminService } 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_auth_cache } from "../../../../../lib/auth/auth_cache";
9
- import { get_auth_utility_config } from "../../../../../lib/auth_utility_config.server";
10
-
11
- // section: route_config
12
- export const dynamic = 'force-dynamic';
13
-
14
- // section: api_handler
15
- /**
16
- * GET - Fetch all roles with their permissions
17
- */
18
- export async function GET(request: NextRequest) {
19
- const logger = create_app_logger();
20
-
21
- try {
22
- const hazoConnect = get_hazo_connect_instance();
23
- const roles_service = createCrudService(hazoConnect, "hazo_roles");
24
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
25
- const role_permissions_service = createCrudService(hazoConnect, "hazo_role_permissions");
26
-
27
- // Fetch all roles (empty object means no filter - get all records)
28
- const roles = await roles_service.findBy({});
29
- const permissions = await permissions_service.findBy({});
30
- const role_permissions = await role_permissions_service.findBy({});
31
-
32
- if (!Array.isArray(roles) || !Array.isArray(permissions) || !Array.isArray(role_permissions)) {
33
- return NextResponse.json(
34
- { error: "Failed to fetch roles data" },
35
- { status: 500 }
36
- );
37
- }
38
-
39
- // Build role-permission mapping
40
- const role_permission_map: Record<number, number[]> = {};
41
- role_permissions.forEach((rp) => {
42
- const role_id = rp.role_id as number;
43
- const permission_id = rp.permission_id as number;
44
- if (!role_permission_map[role_id]) {
45
- role_permission_map[role_id] = [];
46
- }
47
- role_permission_map[role_id].push(permission_id);
48
- });
49
-
50
- // Build permission name map
51
- const permission_name_map: Record<number, string> = {};
52
- permissions.forEach((perm) => {
53
- permission_name_map[perm.id as number] = perm.permission_name as string;
54
- });
55
-
56
- // Format response
57
- const roles_with_permissions = roles.map((role) => {
58
- const role_id = role.id as number;
59
- const permission_ids = role_permission_map[role_id] || [];
60
- const permission_names = permission_ids.map((pid) => permission_name_map[pid]).filter(Boolean);
61
-
62
- return {
63
- role_id: role.id,
64
- role_name: role.role_name,
65
- permissions: permission_names,
66
- };
67
- });
68
-
69
- logger.info("user_management_roles_fetched", {
70
- filename: get_filename(),
71
- line_number: get_line_number(),
72
- role_count: roles.length,
73
- permission_count: permissions.length,
74
- });
75
-
76
- return NextResponse.json(
77
- {
78
- success: true,
79
- roles: roles_with_permissions,
80
- permissions: permissions.map((p) => ({
81
- id: p.id,
82
- permission_name: p.permission_name,
83
- })),
84
- },
85
- { status: 200 }
86
- );
87
- } catch (error) {
88
- const error_message = error instanceof Error ? error.message : "Unknown error";
89
- const error_stack = error instanceof Error ? error.stack : undefined;
90
-
91
- logger.error("user_management_roles_fetch_error", {
92
- filename: get_filename(),
93
- line_number: get_line_number(),
94
- error_message,
95
- error_stack,
96
- });
97
-
98
- return NextResponse.json(
99
- { error: "Failed to fetch roles" },
100
- { status: 500 }
101
- );
102
- }
103
- }
104
-
105
- /**
106
- * POST - Create new role
107
- */
108
- export async function POST(request: NextRequest) {
109
- const logger = create_app_logger();
110
-
111
- try {
112
- const body = await request.json();
113
- const { role_name } = body;
114
-
115
- if (!role_name || typeof role_name !== "string" || role_name.trim().length === 0) {
116
- return NextResponse.json(
117
- { error: "role_name is required and must be a non-empty string" },
118
- { status: 400 }
119
- );
120
- }
121
-
122
- const hazoConnect = get_hazo_connect_instance();
123
- const roles_service = createCrudService(hazoConnect, "hazo_roles");
124
-
125
- // Check if role already exists
126
- const existing_roles = await roles_service.findBy({
127
- role_name: role_name.trim(),
128
- });
129
-
130
- if (Array.isArray(existing_roles) && existing_roles.length > 0) {
131
- return NextResponse.json(
132
- { error: "Role with this name already exists" },
133
- { status: 409 }
134
- );
135
- }
136
-
137
- // Create new role
138
- const now = new Date().toISOString();
139
- const new_role_result = await roles_service.insert({
140
- role_name: role_name.trim(),
141
- created_at: now,
142
- changed_at: now,
143
- });
144
-
145
- // insert() returns an array, get the first element
146
- if (!Array.isArray(new_role_result) || new_role_result.length === 0) {
147
- return NextResponse.json(
148
- { error: "Failed to create role - no record returned" },
149
- { status: 500 }
150
- );
151
- }
152
-
153
- const new_role = new_role_result[0] as { id: number; role_name: string };
154
-
155
- logger.info("user_management_role_created", {
156
- filename: get_filename(),
157
- line_number: get_line_number(),
158
- role_id: new_role.id,
159
- role_name: role_name.trim(),
160
- });
161
-
162
- return NextResponse.json(
163
- {
164
- success: true,
165
- role: {
166
- role_id: new_role.id,
167
- role_name: role_name.trim(),
168
- },
169
- },
170
- { status: 201 }
171
- );
172
- } catch (error) {
173
- const error_message = error instanceof Error ? error.message : "Unknown error";
174
- const error_stack = error instanceof Error ? error.stack : undefined;
175
-
176
- logger.error("user_management_role_create_error", {
177
- filename: get_filename(),
178
- line_number: get_line_number(),
179
- error_message,
180
- error_stack,
181
- });
182
-
183
- return NextResponse.json(
184
- { error: "Failed to create role" },
185
- { status: 500 }
186
- );
187
- }
188
- }
189
-
190
- /**
191
- * PUT - Update role permissions (save role-permission matrix)
192
- */
193
- export async function PUT(request: NextRequest) {
194
- const logger = create_app_logger();
195
-
196
- try {
197
- const body = await request.json();
198
- const { roles } = body;
199
-
200
- if (!Array.isArray(roles)) {
201
- return NextResponse.json(
202
- { error: "roles array is required" },
203
- { status: 400 }
204
- );
205
- }
206
-
207
- const hazoConnect = get_hazo_connect_instance();
208
- const roles_service = createCrudService(hazoConnect, "hazo_roles");
209
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
210
- const role_permissions_service = createCrudService(hazoConnect, "hazo_role_permissions");
211
-
212
- // Get all permissions to build name-to-id map (empty object means no filter - get all records)
213
- const all_permissions = await permissions_service.findBy({});
214
- if (!Array.isArray(all_permissions)) {
215
- return NextResponse.json(
216
- { error: "Failed to fetch permissions" },
217
- { status: 500 }
218
- );
219
- }
220
-
221
- const permission_name_to_id: Record<string, number> = {};
222
- all_permissions.forEach((perm) => {
223
- permission_name_to_id[perm.permission_name as string] = perm.id as number;
224
- });
225
-
226
- const now = new Date().toISOString();
227
- const modified_role_ids: number[] = []; // Track all role IDs that were modified
228
-
229
- // Process each role
230
- for (const role_data of roles) {
231
- const { role_id, role_name, permissions } = role_data;
232
-
233
- if (!role_name || !Array.isArray(permissions)) {
234
- continue; // Skip invalid entries
235
- }
236
-
237
- let current_role_id: number | undefined;
238
-
239
- if (role_id) {
240
- // Update existing role
241
- current_role_id = role_id;
242
- await roles_service.updateById(role_id, {
243
- role_name: role_name.trim(),
244
- changed_at: now,
245
- });
246
- } else {
247
- // Create new role
248
- const existing_roles = await roles_service.findBy({
249
- role_name: role_name.trim(),
250
- });
251
-
252
- if (Array.isArray(existing_roles) && existing_roles.length > 0) {
253
- current_role_id = existing_roles[0].id as number;
254
- } else {
255
- const new_role = await roles_service.insert({
256
- role_name: role_name.trim(),
257
- created_at: now,
258
- changed_at: now,
259
- });
260
-
261
- // Handle both single object and array responses from insert
262
- if (Array.isArray(new_role) && new_role.length > 0) {
263
- current_role_id = (new_role[0] as { id: number }).id;
264
- } else if (!Array.isArray(new_role) && (new_role as { id?: number }).id !== undefined) {
265
- current_role_id = (new_role as { id: number }).id;
266
- } else {
267
- // If insert didn't return an id, try to find the role by name
268
- const inserted_roles = await roles_service.findBy({
269
- role_name: role_name.trim(),
270
- });
271
- if (Array.isArray(inserted_roles) && inserted_roles.length > 0) {
272
- current_role_id = inserted_roles[0].id as number;
273
- }
274
- }
275
- }
276
- }
277
-
278
- // Skip if we couldn't determine the role ID
279
- if (!current_role_id) {
280
- logger.warn("user_management_role_id_not_found", {
281
- filename: get_filename(),
282
- line_number: get_line_number(),
283
- role_name: role_name.trim(),
284
- role_id,
285
- });
286
- continue;
287
- }
288
-
289
- // Track this role ID for cache invalidation
290
- modified_role_ids.push(current_role_id);
291
-
292
- // Get current role-permission mappings
293
- const current_mappings = await role_permissions_service.findBy({
294
- role_id: current_role_id,
295
- });
296
-
297
- const current_permission_ids = Array.isArray(current_mappings)
298
- ? current_mappings.map((m) => m.permission_id as number)
299
- : [];
300
-
301
- // Get target permission IDs
302
- const target_permission_ids = permissions
303
- .map((perm_name: string) => permission_name_to_id[perm_name])
304
- .filter((id: number | undefined) => id !== undefined);
305
-
306
- // Delete removed permissions
307
- // Note: hazo_role_permissions is a junction table without an id column
308
- // We need to use SQLite admin service to delete by composite key (role_id, permission_id)
309
- const to_delete = current_permission_ids.filter(
310
- (id) => !target_permission_ids.includes(id)
311
- );
312
-
313
- if (to_delete.length > 0) {
314
- try {
315
- const admin_service = getSqliteAdminService();
316
-
317
- for (const perm_id of to_delete) {
318
- // Delete using SQLite admin service with criteria (role_id and permission_id)
319
- await admin_service.deleteRows("hazo_role_permissions", {
320
- role_id: current_role_id,
321
- permission_id: perm_id,
322
- });
323
- }
324
- } catch (adminError) {
325
- // Fallback: try using createCrudService deleteById if rowid exists
326
- // SQLite tables have a hidden rowid column that can be used
327
- const error_message = adminError instanceof Error ? adminError.message : "Unknown error";
328
- logger.warn("user_management_role_permission_delete_admin_failed", {
329
- filename: get_filename(),
330
- line_number: get_line_number(),
331
- error: error_message,
332
- note: "Trying fallback method",
333
- });
334
-
335
- // Fallback: try to find and delete using rowid if available
336
- for (const perm_id of to_delete) {
337
- const mappings_to_delete = await role_permissions_service.findBy({
338
- role_id: current_role_id,
339
- permission_id: perm_id,
340
- });
341
-
342
- if (Array.isArray(mappings_to_delete) && mappings_to_delete.length > 0) {
343
- for (const mapping of mappings_to_delete) {
344
- // Try deleteById with rowid (SQLite has hidden rowid)
345
- try {
346
- // Check if mapping has an id field (could be rowid)
347
- if ((mapping as { id?: number; rowid?: number }).id !== undefined) {
348
- await role_permissions_service.deleteById((mapping as { id: number }).id);
349
- } else if ((mapping as { rowid?: number }).rowid !== undefined) {
350
- await role_permissions_service.deleteById((mapping as { rowid: number }).rowid);
351
- } else {
352
- // Last resort: log error
353
- logger.error("user_management_role_permission_delete_no_id", {
354
- filename: get_filename(),
355
- line_number: get_line_number(),
356
- role_id: current_role_id,
357
- permission_id: perm_id,
358
- mapping,
359
- });
360
- }
361
- } catch (deleteError) {
362
- const delete_error_message = deleteError instanceof Error ? deleteError.message : "Unknown error";
363
- logger.error("user_management_role_permission_delete_failed", {
364
- filename: get_filename(),
365
- line_number: get_line_number(),
366
- role_id: current_role_id,
367
- permission_id: perm_id,
368
- error: delete_error_message,
369
- });
370
- }
371
- }
372
- }
373
- }
374
- }
375
- }
376
-
377
- // Add new permissions
378
- const to_add = target_permission_ids.filter(
379
- (id) => !current_permission_ids.includes(id)
380
- );
381
- for (const perm_id of to_add) {
382
- await role_permissions_service.insert({
383
- role_id: current_role_id,
384
- permission_id: perm_id,
385
- created_at: now,
386
- changed_at: now,
387
- });
388
- }
389
- }
390
-
391
- // Invalidate cache for all affected roles
392
- try {
393
- const config = get_auth_utility_config();
394
- const cache = get_auth_cache(
395
- config.cache_max_users,
396
- config.cache_ttl_minutes,
397
- config.cache_max_age_minutes,
398
- );
399
-
400
- // Invalidate by all role IDs that were modified (including newly created ones)
401
- if (modified_role_ids.length > 0) {
402
- cache.invalidate_by_roles(modified_role_ids);
403
- }
404
- } catch (cache_error) {
405
- // Log but don't fail role update if cache invalidation fails
406
- const cache_error_message =
407
- cache_error instanceof Error ? cache_error.message : "Unknown error";
408
- logger.warn("user_management_roles_cache_invalidation_failed", {
409
- filename: get_filename(),
410
- line_number: get_line_number(),
411
- error: cache_error_message,
412
- });
413
- }
414
-
415
- logger.info("user_management_roles_updated", {
416
- filename: get_filename(),
417
- line_number: get_line_number(),
418
- role_count: roles.length,
419
- });
420
-
421
- return NextResponse.json(
422
- { success: true },
423
- { status: 200 }
424
- );
425
- } catch (error) {
426
- const error_message = error instanceof Error ? error.message : "Unknown error";
427
- const error_stack = error instanceof Error ? error.stack : undefined;
428
-
429
- logger.error("user_management_roles_update_error", {
430
- filename: get_filename(),
431
- line_number: get_line_number(),
432
- error_message,
433
- error_stack,
434
- });
435
-
436
- return NextResponse.json(
437
- { error: "Failed to update roles" },
438
- { status: 500 }
439
- );
440
- }
441
- }
442
-