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,378 +0,0 @@
1
- // file_description: script to initialize users, roles, and permissions from configuration
2
- // Run with: npx tsx scripts/init_users.ts init_users
3
- // section: imports
4
- import { get_hazo_connect_instance } from "../src/lib/hazo_connect_instance.server";
5
- import { createCrudService } from "hazo_connect/server";
6
- import { get_user_management_config } from "../src/lib/user_management_config.server";
7
- import { get_config_value } from "../src/lib/config/config_loader.server";
8
- import { create_app_logger } from "../src/lib/app_logger";
9
-
10
- // section: types
11
- type InitSummary = {
12
- permissions: {
13
- inserted: string[];
14
- existing: string[];
15
- };
16
- role: {
17
- inserted: boolean;
18
- existing: boolean;
19
- role_id: string | null;
20
- };
21
- role_permissions: {
22
- inserted: number;
23
- existing: number;
24
- };
25
- user_role: {
26
- inserted: boolean;
27
- existing: boolean;
28
- };
29
- };
30
-
31
- // section: helpers
32
- /**
33
- * Displays help information for available commands
34
- */
35
- function show_help(): void {
36
- console.log(`
37
- hazo_auth CLI - User and Permission Management
38
-
39
- Usage: npx tsx scripts/init_users.ts <command>
40
-
41
- Available Commands:
42
- init_users Initialize users, roles, and permissions from configuration
43
- - Reads permissions from hazo_auth_config.ini [hazo_auth__user_management] application_permission_list_defaults
44
- - Creates default_super_user_role in hazo_roles
45
- - Assigns all permissions to the super user role
46
- - Finds user by email from hazo_auth_config.ini [hazo_auth__initial_setup] default_super_user_email
47
- - Assigns super user role to the user
48
- - Provides summary of what was inserted vs what already existed
49
-
50
- help Show this help message
51
-
52
- Configuration:
53
- Add the following to hazo_auth_config.ini:
54
-
55
- [hazo_auth__user_management]
56
- application_permission_list_defaults = admin_user_management,admin_role_management,admin_permission_management
57
-
58
- [hazo_auth__initial_setup]
59
- default_super_user_email = admin@example.com
60
-
61
- Examples:
62
- npx tsx scripts/init_users.ts init_users
63
- npx tsx scripts/init_users.ts help
64
- `);
65
- }
66
-
67
- /**
68
- * Initializes users, roles, and permissions from configuration
69
- */
70
- async function init_users(): Promise<void> {
71
- const logger = create_app_logger();
72
- const summary: InitSummary = {
73
- permissions: {
74
- inserted: [],
75
- existing: [],
76
- },
77
- role: {
78
- inserted: false,
79
- existing: false,
80
- role_id: null,
81
- },
82
- role_permissions: {
83
- inserted: 0,
84
- existing: 0,
85
- },
86
- user_role: {
87
- inserted: false,
88
- existing: false,
89
- },
90
- };
91
-
92
- try {
93
- console.log("Initializing users, roles, and permissions from configuration...\n");
94
-
95
- // Get hazo_connect instance
96
- const hazoConnect = get_hazo_connect_instance();
97
- const permissions_service = createCrudService(hazoConnect, "hazo_permissions");
98
- const roles_service = createCrudService(hazoConnect, "hazo_roles");
99
- const role_permissions_service = createCrudService(hazoConnect, "hazo_role_permissions");
100
- const users_service = createCrudService(hazoConnect, "hazo_users");
101
- const user_roles_service = createCrudService(hazoConnect, "hazo_user_roles");
102
-
103
- // 1. Get permissions from config
104
- const config = get_user_management_config();
105
- const permission_names = config.application_permission_list_defaults || [];
106
-
107
- if (permission_names.length === 0) {
108
- console.log("⚠ No permissions found in configuration.");
109
- console.log(" Add permissions to [hazo_auth__user_management] application_permission_list_defaults\n");
110
- return;
111
- }
112
-
113
- console.log(`Found ${permission_names.length} permission(s) in configuration:`);
114
- permission_names.forEach((name) => console.log(` - ${name}`));
115
- console.log();
116
-
117
- // 2. Add permissions to hazo_permissions table
118
- const permission_id_map: Record<string, string> = {};
119
- const now = new Date().toISOString();
120
-
121
- for (const permission_name of permission_names) {
122
- const trimmed_name = permission_name.trim();
123
- if (!trimmed_name) continue;
124
-
125
- // Check if permission already exists
126
- const existing_permissions = await permissions_service.findBy({
127
- permission_name: trimmed_name,
128
- });
129
-
130
- if (Array.isArray(existing_permissions) && existing_permissions.length > 0) {
131
- const existing_permission = existing_permissions[0];
132
- const perm_id = existing_permission.id as string;
133
- permission_id_map[trimmed_name] = perm_id;
134
- summary.permissions.existing.push(trimmed_name);
135
- console.log(`✓ Permission already exists: ${trimmed_name} (ID: ${perm_id})`);
136
- } else {
137
- // Insert new permission
138
- const new_permission = await permissions_service.insert({
139
- permission_name: trimmed_name,
140
- description: `Permission for ${trimmed_name}`,
141
- created_at: now,
142
- changed_at: now,
143
- });
144
-
145
- const perm_id = Array.isArray(new_permission)
146
- ? (new_permission[0] as { id: string }).id
147
- : (new_permission as { id: string }).id;
148
- permission_id_map[trimmed_name] = perm_id;
149
- summary.permissions.inserted.push(trimmed_name);
150
- console.log(`✓ Inserted permission: ${trimmed_name} (ID: ${perm_id})`);
151
- }
152
- }
153
-
154
- console.log();
155
-
156
- // 3. Create or get default_super_user_role
157
- const role_name = "default_super_user_role";
158
- const existing_roles = await roles_service.findBy({
159
- role_name,
160
- });
161
-
162
- let role_id: string;
163
- if (Array.isArray(existing_roles) && existing_roles.length > 0) {
164
- role_id = existing_roles[0].id as string;
165
- summary.role.existing = true;
166
- summary.role.role_id = role_id;
167
- console.log(`✓ Role already exists: ${role_name} (ID: ${role_id})`);
168
- } else {
169
- const new_role = await roles_service.insert({
170
- role_name,
171
- created_at: now,
172
- changed_at: now,
173
- });
174
-
175
- role_id = Array.isArray(new_role)
176
- ? (new_role[0] as { id: string }).id
177
- : (new_role as { id: string }).id;
178
- summary.role.inserted = true;
179
- summary.role.role_id = role_id;
180
- console.log(`✓ Created role: ${role_name} (ID: ${role_id})`);
181
- }
182
-
183
- console.log();
184
-
185
- // 4. Assign all permissions to the role
186
- const permission_ids = Object.values(permission_id_map);
187
-
188
- for (const permission_id of permission_ids) {
189
- // Check if role-permission assignment already exists
190
- const existing_assignments = await role_permissions_service.findBy({
191
- role_id,
192
- permission_id,
193
- });
194
-
195
- if (Array.isArray(existing_assignments) && existing_assignments.length > 0) {
196
- summary.role_permissions.existing++;
197
- const perm_name = Object.keys(permission_id_map).find(
198
- (key) => permission_id_map[key] === permission_id,
199
- );
200
- console.log(`✓ Role-permission already exists: ${role_name} -> ${perm_name}`);
201
- } else {
202
- await role_permissions_service.insert({
203
- role_id,
204
- permission_id,
205
- created_at: now,
206
- changed_at: now,
207
- });
208
- summary.role_permissions.inserted++;
209
- const perm_name = Object.keys(permission_id_map).find(
210
- (key) => permission_id_map[key] === permission_id,
211
- );
212
- console.log(`✓ Assigned permission to role: ${role_name} -> ${perm_name}`);
213
- }
214
- }
215
-
216
- console.log();
217
-
218
- // 5. Get super user email from config
219
- const super_user_email = get_config_value(
220
- "hazo_auth__initial_setup",
221
- "default_super_user_email",
222
- "",
223
- ).trim();
224
-
225
- if (!super_user_email) {
226
- console.log("⚠ No super user email found in configuration.");
227
- console.log(" Add [hazo_auth__initial_setup] default_super_user_email to config\n");
228
- print_summary(summary);
229
- return;
230
- }
231
-
232
- console.log(`Looking up user with email: ${super_user_email}`);
233
-
234
- // 6. Find user by email
235
- const users = await users_service.findBy({
236
- email_address: super_user_email,
237
- });
238
-
239
- if (!Array.isArray(users) || users.length === 0) {
240
- console.log(`✗ User not found with email: ${super_user_email}`);
241
- console.log(" Please ensure the user exists in the database before running this script.\n");
242
- print_summary(summary);
243
- return;
244
- }
245
-
246
- const user = users[0];
247
- const user_id = user.id as string;
248
- console.log(`✓ Found user: ${super_user_email} (ID: ${user_id})`);
249
- console.log();
250
-
251
- // 7. Assign role to user
252
- const existing_user_roles = await user_roles_service.findBy({
253
- user_id,
254
- role_id,
255
- });
256
-
257
- if (Array.isArray(existing_user_roles) && existing_user_roles.length > 0) {
258
- summary.user_role.existing = true;
259
- console.log(`✓ User already has role assigned: ${user_id} -> ${role_name}`);
260
- } else {
261
- await user_roles_service.insert({
262
- user_id,
263
- role_id,
264
- created_at: now,
265
- changed_at: now,
266
- });
267
- summary.user_role.inserted = true;
268
- console.log(`✓ Assigned role to user: ${user_id} -> ${role_name}`);
269
- }
270
-
271
- console.log();
272
-
273
- // 8. Print summary
274
- print_summary(summary);
275
-
276
- logger.info("init_users_completed", {
277
- filename: "init_users.ts",
278
- line_number: 0,
279
- summary,
280
- });
281
- } catch (error) {
282
- const error_message = error instanceof Error ? error.message : "Unknown error";
283
- const error_stack = error instanceof Error ? error.stack : undefined;
284
-
285
- console.error("\n✗ Error initializing users:");
286
- console.error(` ${error_message}`);
287
- if (error_stack) {
288
- console.error("\nStack trace:");
289
- console.error(error_stack);
290
- }
291
-
292
- const logger = create_app_logger();
293
- logger.error("init_users_failed", {
294
- filename: "init_users.ts",
295
- line_number: 0,
296
- error_message,
297
- error_stack,
298
- });
299
-
300
- process.exit(1);
301
- }
302
- }
303
-
304
- /**
305
- * Prints a summary of what was inserted vs what already existed
306
- */
307
- function print_summary(summary: InitSummary): void {
308
- console.log("=".repeat(60));
309
- console.log("INITIALIZATION SUMMARY");
310
- console.log("=".repeat(60));
311
- console.log();
312
-
313
- // Permissions summary
314
- console.log("Permissions:");
315
- if (summary.permissions.inserted.length > 0) {
316
- console.log(` ✓ Inserted (${summary.permissions.inserted.length}):`);
317
- summary.permissions.inserted.forEach((name) => console.log(` - ${name}`));
318
- }
319
- if (summary.permissions.existing.length > 0) {
320
- console.log(` ⊙ Already existed (${summary.permissions.existing.length}):`);
321
- summary.permissions.existing.forEach((name) => console.log(` - ${name}`));
322
- }
323
- console.log();
324
-
325
- // Role summary
326
- console.log("Role:");
327
- if (summary.role.inserted) {
328
- console.log(` ✓ Inserted: default_super_user_role (ID: ${summary.role.role_id})`);
329
- }
330
- if (summary.role.existing) {
331
- console.log(` ⊙ Already existed: default_super_user_role (ID: ${summary.role.role_id})`);
332
- }
333
- console.log();
334
-
335
- // Role permissions summary
336
- console.log("Role-Permission Assignments:");
337
- if (summary.role_permissions.inserted > 0) {
338
- console.log(` ✓ Inserted: ${summary.role_permissions.inserted} assignment(s)`);
339
- }
340
- if (summary.role_permissions.existing > 0) {
341
- console.log(` ⊙ Already existed: ${summary.role_permissions.existing} assignment(s)`);
342
- }
343
- console.log();
344
-
345
- // User role summary
346
- console.log("User-Role Assignment:");
347
- if (summary.user_role.inserted) {
348
- console.log(` ✓ Inserted: Super user role assigned to user`);
349
- }
350
- if (summary.user_role.existing) {
351
- console.log(` ⊙ Already existed: User already has super user role`);
352
- }
353
- console.log();
354
-
355
- console.log("=".repeat(60));
356
- }
357
-
358
- // section: main
359
- function main(): void {
360
- const command = process.argv[2];
361
-
362
- if (!command || command === "help" || command === "--help" || command === "-h") {
363
- show_help();
364
- return;
365
- }
366
-
367
- if (command === "init_users") {
368
- void init_users();
369
- } else {
370
- console.error(`Unknown command: ${command}\n`);
371
- show_help();
372
- process.exit(1);
373
- }
374
- }
375
-
376
- main();
377
-
378
-
@@ -1,268 +0,0 @@
1
- // file_description: API route for uploading profile pictures
2
- // section: imports
3
- import { NextRequest, NextResponse } from "next/server";
4
- import { get_hazo_connect_instance } from "../../../../../lib/hazo_connect_instance.server";
5
- import { create_app_logger } from "../../../../../lib/app_logger";
6
- import { get_profile_picture_config } from "../../../../../lib/profile_picture_config.server";
7
- import { get_file_types_config } from "../../../../../lib/file_types_config.server";
8
- import { update_user_profile_picture } from "../../../../../lib/services/profile_picture_service";
9
- import { createCrudService } from "hazo_connect/server";
10
- import { map_db_source_to_ui } from "../../../../../lib/services/profile_picture_source_mapper";
11
- import { get_filename, get_line_number } from "../../../../../lib/utils/api_route_helpers";
12
- import fs from "fs";
13
- import path from "path";
14
-
15
- // section: api_handler
16
- export async function POST(request: NextRequest) {
17
- const logger = create_app_logger();
18
-
19
- try {
20
- // Use centralized auth check
21
- let user_id: string;
22
- try {
23
- const { require_auth } = await import("../../../../../lib/auth/auth_utils.server");
24
- const user = await require_auth(request);
25
- user_id = user.user_id;
26
- } catch (error) {
27
- if (error instanceof Error && error.message === "Authentication required") {
28
- logger.warn("profile_picture_upload_authentication_failed", {
29
- filename: get_filename(),
30
- line_number: get_line_number(),
31
- error: "User not authenticated",
32
- });
33
-
34
- return NextResponse.json(
35
- { error: "Authentication required" },
36
- { status: 401 }
37
- );
38
- }
39
- throw error;
40
- }
41
-
42
- // Check if upload is enabled
43
- const config = get_profile_picture_config();
44
- if (!config.allow_photo_upload) {
45
- logger.warn("profile_picture_upload_disabled", {
46
- filename: get_filename(),
47
- line_number: get_line_number(),
48
- user_id,
49
- });
50
-
51
- return NextResponse.json(
52
- { error: "Photo upload is not enabled" },
53
- { status: 403 }
54
- );
55
- }
56
-
57
- if (!config.upload_photo_path) {
58
- logger.warn("profile_picture_upload_path_not_configured", {
59
- filename: get_filename(),
60
- line_number: get_line_number(),
61
- user_id,
62
- });
63
-
64
- return NextResponse.json(
65
- { error: "Upload path is not configured" },
66
- { status: 500 }
67
- );
68
- }
69
-
70
- // Get FormData
71
- const formData = await request.formData();
72
- const file = formData.get("file") as File | null;
73
-
74
- if (!file) {
75
- logger.warn("profile_picture_upload_no_file", {
76
- filename: get_filename(),
77
- line_number: get_line_number(),
78
- user_id,
79
- });
80
-
81
- return NextResponse.json(
82
- { error: "No file provided" },
83
- { status: 400 }
84
- );
85
- }
86
-
87
- // Validate file type
88
- const fileTypes = get_file_types_config();
89
- const fileType = file.type;
90
- if (!fileTypes.allowed_image_mime_types.includes(fileType)) {
91
- logger.warn("profile_picture_upload_invalid_type", {
92
- filename: get_filename(),
93
- line_number: get_line_number(),
94
- user_id,
95
- fileType,
96
- });
97
-
98
- return NextResponse.json(
99
- { error: "Invalid file type. Only JPG and PNG files are allowed." },
100
- { status: 400 }
101
- );
102
- }
103
-
104
- // Validate file size (should already be compressed client-side, but check server-side too)
105
- const fileSize = file.size;
106
- if (fileSize > config.max_photo_size) {
107
- logger.warn("profile_picture_upload_too_large", {
108
- filename: get_filename(),
109
- line_number: get_line_number(),
110
- user_id,
111
- fileSize,
112
- maxSize: config.max_photo_size,
113
- });
114
-
115
- return NextResponse.json(
116
- { error: `File size exceeds maximum allowed size of ${config.max_photo_size} bytes` },
117
- { status: 400 }
118
- );
119
- }
120
-
121
- // Get current user profile picture info before updating
122
- const hazoConnect = get_hazo_connect_instance();
123
- const users_service = createCrudService(hazoConnect, "hazo_users");
124
- const current_users = await users_service.findBy({ id: user_id });
125
-
126
- let oldProfilePictureUrl: string | null = null;
127
- let oldProfileSource: string | null = null;
128
-
129
- if (Array.isArray(current_users) && current_users.length > 0) {
130
- const current_user = current_users[0];
131
- oldProfilePictureUrl = (current_user.profile_picture_url as string) || null;
132
- oldProfileSource = (current_user.profile_source as string) || null;
133
- }
134
-
135
- // Determine file extension from MIME type
136
- const mimeToExt: Record<string, string> = {
137
- "image/jpeg": "jpg",
138
- "image/jpg": "jpg",
139
- "image/png": "png",
140
- };
141
- const fileExtension = mimeToExt[fileType] || "jpg";
142
- const fileName = `${user_id}.${fileExtension}`;
143
-
144
- // Resolve upload path
145
- const uploadPath = path.isAbsolute(config.upload_photo_path)
146
- ? config.upload_photo_path
147
- : path.resolve(process.cwd(), config.upload_photo_path);
148
-
149
- // Create upload directory if it doesn't exist
150
- if (!fs.existsSync(uploadPath)) {
151
- fs.mkdirSync(uploadPath, { recursive: true });
152
- }
153
-
154
- // Save file
155
- const filePath = path.join(uploadPath, fileName);
156
- const arrayBuffer = await file.arrayBuffer();
157
- const buffer = Buffer.from(arrayBuffer);
158
- fs.writeFileSync(filePath, buffer);
159
-
160
- // Generate URL (relative to public or absolute)
161
- // For Next.js, we'll serve from a public route or use absolute path
162
- // For now, use a relative path that can be served via API or static file serving
163
- const profilePictureUrl = `/api/hazo_auth/profile_picture/${fileName}`;
164
-
165
- // Update user record
166
- const updateResult = await update_user_profile_picture(
167
- hazoConnect,
168
- user_id,
169
- profilePictureUrl,
170
- "upload",
171
- );
172
-
173
- if (!updateResult.success) {
174
- // Clean up uploaded file
175
- try {
176
- fs.unlinkSync(filePath);
177
- } catch (error) {
178
- // Ignore cleanup errors
179
- }
180
-
181
- logger.warn("profile_picture_upload_update_failed", {
182
- filename: get_filename(),
183
- line_number: get_line_number(),
184
- user_id,
185
- error: updateResult.error,
186
- });
187
-
188
- return NextResponse.json(
189
- { error: updateResult.error || "Failed to update profile picture" },
190
- { status: 500 }
191
- );
192
- }
193
-
194
- // Delete old profile picture file if it exists and was an uploaded file
195
- if (oldProfilePictureUrl && oldProfileSource) {
196
- const oldSourceUI = map_db_source_to_ui(oldProfileSource);
197
-
198
- // Only delete if the old profile picture was an uploaded file
199
- if (oldSourceUI === "upload") {
200
- try {
201
- // Extract filename from URL (e.g., /api/hazo_auth/profile_picture/user_id.jpg)
202
- const oldFileName = oldProfilePictureUrl.split("/").pop();
203
-
204
- if (oldFileName) {
205
- // Check if it's a user-specific file (starts with user_id)
206
- if (oldFileName.startsWith(user_id)) {
207
- const oldFilePath = path.join(uploadPath, oldFileName);
208
-
209
- // Only delete if it's a different file (different extension)
210
- if (oldFilePath !== filePath && fs.existsSync(oldFilePath)) {
211
- fs.unlinkSync(oldFilePath);
212
-
213
- logger.info("profile_picture_old_file_deleted", {
214
- filename: get_filename(),
215
- line_number: get_line_number(),
216
- user_id,
217
- oldFileName,
218
- });
219
- }
220
- }
221
- }
222
- } catch (error) {
223
- // Log error but don't fail the request
224
- logger.warn("profile_picture_old_file_delete_failed", {
225
- filename: get_filename(),
226
- line_number: get_line_number(),
227
- user_id,
228
- oldProfilePictureUrl,
229
- error: error instanceof Error ? error.message : "Unknown error",
230
- });
231
- }
232
- }
233
- }
234
-
235
- logger.info("profile_picture_upload_successful", {
236
- filename: get_filename(),
237
- line_number: get_line_number(),
238
- user_id,
239
- fileName,
240
- fileSize,
241
- });
242
-
243
- return NextResponse.json(
244
- {
245
- success: true,
246
- profile_picture_url: profilePictureUrl,
247
- message: "Profile picture uploaded successfully",
248
- },
249
- { status: 200 }
250
- );
251
- } catch (error) {
252
- const error_message = error instanceof Error ? error.message : "Unknown error";
253
- const error_stack = error instanceof Error ? error.stack : undefined;
254
-
255
- logger.error("profile_picture_upload_error", {
256
- filename: get_filename(),
257
- line_number: get_line_number(),
258
- error_message,
259
- error_stack,
260
- });
261
-
262
- return NextResponse.json(
263
- { error: "Failed to upload profile picture. Please try again." },
264
- { status: 500 }
265
- );
266
- }
267
- }
268
-