hazo_auth 1.4.1 → 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 (478) hide show
  1. package/README.md +25 -38
  2. package/SETUP_CHECKLIST.md +708 -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_photos/route.d.ts +13 -0
  16. package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
  17. package/dist/app/api/hazo_auth/library_photos/route.js +55 -0
  18. package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
  19. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
  20. package/dist/app/api/hazo_auth/login/route.js +140 -0
  21. package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
  22. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
  23. package/dist/app/api/hazo_auth/logout/route.js +71 -0
  24. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  25. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
  26. package/dist/app/api/hazo_auth/me/route.js +34 -0
  27. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
  28. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
  29. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
  30. package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
  31. package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
  32. package/dist/app/api/hazo_auth/register/route.js +80 -0
  33. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
  34. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
  35. package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
  36. package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
  37. package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
  38. package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
  39. package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
  40. package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
  41. package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
  42. package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
  43. package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
  44. package/dist/app/api/hazo_auth/update_user/route.js +95 -0
  45. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
  46. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
  47. package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
  48. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
  49. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
  50. package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
  51. package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
  52. package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
  53. package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
  54. package/dist/cli/generate.d.ts +2 -0
  55. package/dist/cli/generate.d.ts.map +1 -0
  56. package/dist/cli/generate.js +117 -0
  57. package/dist/cli/index.d.ts +3 -0
  58. package/dist/cli/index.d.ts.map +1 -0
  59. package/dist/cli/index.js +120 -0
  60. package/dist/cli/validate.d.ts +15 -0
  61. package/dist/cli/validate.d.ts.map +1 -0
  62. package/dist/cli/validate.js +509 -0
  63. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts +2 -2
  64. package/dist/components/layouts/email_verification/config/email_verification_field_config.d.ts.map +1 -1
  65. package/dist/components/layouts/email_verification/config/email_verification_field_config.js +1 -1
  66. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts +2 -2
  67. package/dist/components/layouts/email_verification/hooks/use_email_verification.d.ts.map +1 -1
  68. package/dist/components/layouts/email_verification/hooks/use_email_verification.js +2 -2
  69. package/dist/components/layouts/email_verification/index.d.ts +3 -3
  70. package/dist/components/layouts/email_verification/index.d.ts.map +1 -1
  71. package/dist/components/layouts/email_verification/index.js +9 -9
  72. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts +2 -2
  73. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.d.ts.map +1 -1
  74. package/dist/components/layouts/forgot_password/config/forgot_password_field_config.js +1 -1
  75. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts +2 -2
  76. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.d.ts.map +1 -1
  77. package/dist/components/layouts/forgot_password/hooks/use_forgot_password_form.js +2 -2
  78. package/dist/components/layouts/forgot_password/index.d.ts +2 -2
  79. package/dist/components/layouts/forgot_password/index.d.ts.map +1 -1
  80. package/dist/components/layouts/forgot_password/index.js +8 -8
  81. package/dist/components/layouts/login/config/login_field_config.d.ts +2 -2
  82. package/dist/components/layouts/login/config/login_field_config.d.ts.map +1 -1
  83. package/dist/components/layouts/login/config/login_field_config.js +1 -1
  84. package/dist/components/layouts/login/hooks/use_login_form.d.ts +2 -2
  85. package/dist/components/layouts/login/hooks/use_login_form.d.ts.map +1 -1
  86. package/dist/components/layouts/login/hooks/use_login_form.js +4 -4
  87. package/dist/components/layouts/login/index.d.ts +2 -2
  88. package/dist/components/layouts/login/index.d.ts.map +1 -1
  89. package/dist/components/layouts/login/index.js +9 -9
  90. package/dist/components/layouts/my_settings/components/editable_field.js +3 -3
  91. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts +1 -1
  92. package/dist/components/layouts/my_settings/components/password_change_dialog.d.ts.map +1 -1
  93. package/dist/components/layouts/my_settings/components/password_change_dialog.js +4 -4
  94. package/dist/components/layouts/my_settings/components/profile_picture_dialog.js +7 -7
  95. package/dist/components/layouts/my_settings/components/profile_picture_display.js +1 -1
  96. package/dist/components/layouts/my_settings/components/profile_picture_gravatar_tab.js +3 -3
  97. package/dist/components/layouts/my_settings/components/profile_picture_library_tab.js +5 -5
  98. package/dist/components/layouts/my_settings/components/profile_picture_upload_tab.js +4 -4
  99. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts +1 -1
  100. package/dist/components/layouts/my_settings/config/my_settings_field_config.d.ts.map +1 -1
  101. package/dist/components/layouts/my_settings/config/my_settings_field_config.js +1 -1
  102. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts +1 -1
  103. package/dist/components/layouts/my_settings/hooks/use_my_settings.d.ts.map +1 -1
  104. package/dist/components/layouts/my_settings/hooks/use_my_settings.js +1 -1
  105. package/dist/components/layouts/my_settings/index.d.ts +2 -2
  106. package/dist/components/layouts/my_settings/index.d.ts.map +1 -1
  107. package/dist/components/layouts/my_settings/index.js +9 -9
  108. package/dist/components/layouts/register/config/register_field_config.d.ts +2 -2
  109. package/dist/components/layouts/register/config/register_field_config.d.ts.map +1 -1
  110. package/dist/components/layouts/register/config/register_field_config.js +1 -1
  111. package/dist/components/layouts/register/hooks/use_register_form.d.ts +3 -3
  112. package/dist/components/layouts/register/hooks/use_register_form.d.ts.map +1 -1
  113. package/dist/components/layouts/register/hooks/use_register_form.js +2 -2
  114. package/dist/components/layouts/register/index.d.ts +2 -2
  115. package/dist/components/layouts/register/index.d.ts.map +1 -1
  116. package/dist/components/layouts/register/index.js +9 -9
  117. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts +2 -2
  118. package/dist/components/layouts/reset_password/config/reset_password_field_config.d.ts.map +1 -1
  119. package/dist/components/layouts/reset_password/config/reset_password_field_config.js +1 -1
  120. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts +3 -3
  121. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.d.ts.map +1 -1
  122. package/dist/components/layouts/reset_password/hooks/use_reset_password_form.js +2 -2
  123. package/dist/components/layouts/reset_password/index.d.ts +2 -2
  124. package/dist/components/layouts/reset_password/index.d.ts.map +1 -1
  125. package/dist/components/layouts/reset_password/index.js +8 -8
  126. package/dist/components/layouts/shared/components/already_logged_in_guard.js +4 -4
  127. package/dist/components/layouts/shared/components/auth_page_shell.js +3 -3
  128. package/dist/components/layouts/shared/components/form_action_buttons.d.ts +1 -1
  129. package/dist/components/layouts/shared/components/form_action_buttons.d.ts.map +1 -1
  130. package/dist/components/layouts/shared/components/form_action_buttons.js +1 -1
  131. package/dist/components/layouts/shared/components/form_field_wrapper.js +2 -2
  132. package/dist/components/layouts/shared/components/logout_button.js +2 -2
  133. package/dist/components/layouts/shared/components/password_field.js +3 -3
  134. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts +1 -1
  135. package/dist/components/layouts/shared/components/profile_pic_menu.d.ts.map +1 -1
  136. package/dist/components/layouts/shared/components/profile_pic_menu.js +4 -4
  137. package/dist/components/layouts/shared/components/profile_pic_menu_wrapper.js +2 -2
  138. package/dist/components/layouts/shared/components/sidebar_layout_wrapper.js +3 -3
  139. package/dist/components/layouts/shared/components/standalone_layout_wrapper.js +1 -1
  140. package/dist/components/layouts/shared/components/two_column_auth_layout.js +1 -1
  141. package/dist/components/layouts/shared/components/unauthorized_guard.js +2 -2
  142. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts +1 -1
  143. package/dist/components/layouts/shared/hooks/use_hazo_auth.d.ts.map +1 -1
  144. package/dist/components/layouts/shared/utils/validation.d.ts +1 -1
  145. package/dist/components/layouts/shared/utils/validation.d.ts.map +1 -1
  146. package/dist/components/layouts/user_management/components/roles_matrix.js +7 -7
  147. package/dist/components/layouts/user_management/index.js +11 -11
  148. package/dist/components/ui/alert-dialog.js +2 -2
  149. package/dist/components/ui/avatar.js +1 -1
  150. package/dist/components/ui/button.js +1 -1
  151. package/dist/components/ui/card.d.ts +9 -0
  152. package/dist/components/ui/card.d.ts.map +1 -0
  153. package/dist/components/ui/card.js +45 -0
  154. package/dist/components/ui/checkbox.js +1 -1
  155. package/dist/components/ui/dialog.js +1 -1
  156. package/dist/components/ui/dropdown-menu.js +1 -1
  157. package/dist/components/ui/hazo_ui_tooltip.js +1 -1
  158. package/dist/components/ui/input.js +1 -1
  159. package/dist/components/ui/label.js +1 -1
  160. package/dist/components/ui/separator.js +1 -1
  161. package/dist/components/ui/sheet.js +1 -1
  162. package/dist/components/ui/sidebar.d.ts +2 -2
  163. package/dist/components/ui/sidebar.d.ts.map +1 -1
  164. package/dist/components/ui/sidebar.js +8 -8
  165. package/dist/components/ui/skeleton.js +1 -1
  166. package/dist/components/ui/switch.js +1 -1
  167. package/dist/components/ui/table.js +1 -1
  168. package/dist/components/ui/tabs.js +1 -1
  169. package/dist/components/ui/tooltip.js +1 -1
  170. package/dist/components/ui/vertical-tabs.js +1 -1
  171. package/dist/hooks/use-mobile.d.ts.map +1 -1
  172. package/dist/hooks/use-mobile.js +17 -3
  173. package/dist/lib/already_logged_in_config.server.js +1 -1
  174. package/dist/lib/app_logger.js +1 -1
  175. package/dist/lib/auth/auth_cache.d.ts +1 -1
  176. package/dist/lib/auth/auth_cache.d.ts.map +1 -1
  177. package/dist/lib/auth/auth_utils.server.js +2 -2
  178. package/dist/lib/auth/hazo_get_auth.server.d.ts +1 -1
  179. package/dist/lib/auth/hazo_get_auth.server.d.ts.map +1 -1
  180. package/dist/lib/auth/hazo_get_auth.server.js +7 -7
  181. package/dist/lib/auth/server_auth.js +2 -2
  182. package/dist/lib/auth_utility_config.server.js +1 -1
  183. package/dist/lib/config/config_loader.server.js +1 -1
  184. package/dist/lib/email_verification_config.server.js +1 -1
  185. package/dist/lib/file_types_config.server.js +1 -1
  186. package/dist/lib/forgot_password_config.server.js +1 -1
  187. package/dist/lib/hazo_connect_instance.server.js +2 -2
  188. package/dist/lib/hazo_connect_setup.server.js +2 -2
  189. package/dist/lib/login_config.server.js +2 -2
  190. package/dist/lib/messages_config.server.js +1 -1
  191. package/dist/lib/my_settings_config.server.js +7 -7
  192. package/dist/lib/password_requirements_config.server.js +1 -1
  193. package/dist/lib/profile_pic_menu_config.server.js +1 -1
  194. package/dist/lib/profile_picture_config.server.js +2 -2
  195. package/dist/lib/register_config.server.js +4 -4
  196. package/dist/lib/reset_password_config.server.js +3 -3
  197. package/dist/lib/services/email_service.js +2 -2
  198. package/dist/lib/services/email_verification_service.js +3 -3
  199. package/dist/lib/services/login_service.js +3 -3
  200. package/dist/lib/services/password_change_service.js +3 -3
  201. package/dist/lib/services/password_reset_service.js +3 -3
  202. package/dist/lib/services/profile_picture_remove_service.js +3 -3
  203. package/dist/lib/services/profile_picture_service.d.ts +1 -1
  204. package/dist/lib/services/profile_picture_service.d.ts.map +1 -1
  205. package/dist/lib/services/profile_picture_service.js +5 -5
  206. package/dist/lib/services/registration_service.js +8 -8
  207. package/dist/lib/services/token_service.js +2 -2
  208. package/dist/lib/services/user_profiles_service.js +2 -2
  209. package/dist/lib/services/user_update_service.d.ts +1 -1
  210. package/dist/lib/services/user_update_service.d.ts.map +1 -1
  211. package/dist/lib/services/user_update_service.js +4 -4
  212. package/dist/lib/ui_shell_config.server.js +1 -1
  213. package/dist/lib/ui_sizes_config.server.js +1 -1
  214. package/dist/lib/user_fields_config.server.js +1 -1
  215. package/dist/lib/user_management_config.server.js +1 -1
  216. package/dist/lib/utils/error_sanitizer.d.ts +1 -1
  217. package/dist/lib/utils/error_sanitizer.d.ts.map +1 -1
  218. package/dist/server/config/config_loader.d.ts +1 -1
  219. package/dist/server/config/config_loader.d.ts.map +1 -1
  220. package/dist/server/config/config_loader.js +1 -1
  221. package/dist/server/index.js +2 -2
  222. package/dist/server/logging/logger_service.d.ts +1 -1
  223. package/dist/server/logging/logger_service.d.ts.map +1 -1
  224. package/dist/server/routes/change_password.d.ts +2 -0
  225. package/dist/server/routes/change_password.d.ts.map +1 -0
  226. package/dist/server/routes/change_password.js +2 -0
  227. package/dist/server/routes/forgot_password.d.ts +2 -0
  228. package/dist/server/routes/forgot_password.d.ts.map +1 -0
  229. package/dist/server/routes/forgot_password.js +2 -0
  230. package/dist/server/routes/get_auth.d.ts +2 -0
  231. package/dist/server/routes/get_auth.d.ts.map +1 -0
  232. package/dist/server/routes/get_auth.js +2 -0
  233. package/dist/server/routes/index.d.ts +18 -0
  234. package/dist/server/routes/index.d.ts.map +1 -0
  235. package/dist/server/routes/index.js +24 -0
  236. package/dist/server/routes/invalidate_cache.d.ts +2 -0
  237. package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
  238. package/dist/server/routes/invalidate_cache.js +2 -0
  239. package/dist/server/routes/library_photos.d.ts +2 -0
  240. package/dist/server/routes/library_photos.d.ts.map +1 -0
  241. package/dist/server/routes/library_photos.js +2 -0
  242. package/dist/server/routes/login.d.ts +2 -0
  243. package/dist/server/routes/login.d.ts.map +1 -0
  244. package/dist/server/routes/login.js +2 -0
  245. package/dist/server/routes/logout.d.ts +2 -0
  246. package/dist/server/routes/logout.d.ts.map +1 -0
  247. package/dist/server/routes/logout.js +2 -0
  248. package/dist/server/routes/me.d.ts +2 -0
  249. package/dist/server/routes/me.d.ts.map +1 -0
  250. package/dist/server/routes/me.js +2 -0
  251. package/dist/server/routes/profile_picture_filename.d.ts +2 -0
  252. package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
  253. package/dist/server/routes/profile_picture_filename.js +3 -0
  254. package/dist/server/routes/register.d.ts +2 -0
  255. package/dist/server/routes/register.d.ts.map +1 -0
  256. package/dist/server/routes/register.js +2 -0
  257. package/dist/server/routes/remove_profile_picture.d.ts +2 -0
  258. package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
  259. package/dist/server/routes/remove_profile_picture.js +2 -0
  260. package/dist/server/routes/resend_verification.d.ts +2 -0
  261. package/dist/server/routes/resend_verification.d.ts.map +1 -0
  262. package/dist/server/routes/resend_verification.js +2 -0
  263. package/dist/server/routes/reset_password.d.ts +2 -0
  264. package/dist/server/routes/reset_password.d.ts.map +1 -0
  265. package/dist/server/routes/reset_password.js +2 -0
  266. package/dist/server/routes/update_user.d.ts +2 -0
  267. package/dist/server/routes/update_user.d.ts.map +1 -0
  268. package/dist/server/routes/update_user.js +2 -0
  269. package/dist/server/routes/upload_profile_picture.d.ts +2 -0
  270. package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
  271. package/dist/server/routes/upload_profile_picture.js +2 -0
  272. package/dist/server/routes/validate_reset_token.d.ts +2 -0
  273. package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
  274. package/dist/server/routes/validate_reset_token.js +2 -0
  275. package/dist/server/routes/verify_email.d.ts +2 -0
  276. package/dist/server/routes/verify_email.d.ts.map +1 -0
  277. package/dist/server/routes/verify_email.js +2 -0
  278. package/dist/server/server.js +2 -2
  279. package/package.json +14 -115
  280. package/components.json +0 -22
  281. package/instrumentation.ts +0 -32
  282. package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
  283. package/migrations/002_add_name_to_hazo_users.sql +0 -7
  284. package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
  285. package/next.config.mjs +0 -67
  286. package/postcss.config.mjs +0 -8
  287. package/public/file.svg +0 -1
  288. package/public/globe.svg +0 -1
  289. package/public/next.svg +0 -1
  290. package/public/vercel.svg +0 -1
  291. package/public/window.svg +0 -1
  292. package/scripts/apply_migration.ts +0 -118
  293. package/scripts/init_users.ts +0 -378
  294. package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
  295. package/src/app/api/hazo_auth/change_password/route.ts +0 -132
  296. package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
  297. package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
  298. package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
  299. package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
  300. package/src/app/api/hazo_auth/login/route.ts +0 -181
  301. package/src/app/api/hazo_auth/logout/route.ts +0 -89
  302. package/src/app/api/hazo_auth/me/route.ts +0 -47
  303. package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
  304. package/src/app/api/hazo_auth/register/route.ts +0 -109
  305. package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
  306. package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
  307. package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
  308. package/src/app/api/hazo_auth/update_user/route.ts +0 -126
  309. package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
  310. package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
  311. package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
  312. package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
  313. package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
  314. package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
  315. package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
  316. package/src/app/api/migrations/apply/route.ts +0 -91
  317. package/src/app/favicon.ico +0 -0
  318. package/src/app/fonts/GeistMonoVF.woff +0 -0
  319. package/src/app/fonts/GeistVF.woff +0 -0
  320. package/src/app/globals.css +0 -89
  321. package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
  322. package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
  323. package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
  324. package/src/app/hazo_auth/login/page.tsx +0 -38
  325. package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
  326. package/src/app/hazo_auth/my_settings/page.tsx +0 -40
  327. package/src/app/hazo_auth/register/page.tsx +0 -36
  328. package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
  329. package/src/app/hazo_auth/reset_password/page.tsx +0 -29
  330. package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
  331. package/src/app/hazo_auth/user_management/page.tsx +0 -14
  332. package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
  333. package/src/app/hazo_auth/verify_email/page.tsx +0 -24
  334. package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
  335. package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
  336. package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
  337. package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
  338. package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
  339. package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
  340. package/src/app/layout.tsx +0 -43
  341. package/src/app/page.tsx +0 -170
  342. package/src/components/index.ts +0 -7
  343. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
  344. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
  345. package/src/components/layouts/email_verification/index.tsx +0 -297
  346. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
  347. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
  348. package/src/components/layouts/forgot_password/index.tsx +0 -168
  349. package/src/components/layouts/index.ts +0 -26
  350. package/src/components/layouts/login/config/login_field_config.ts +0 -67
  351. package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
  352. package/src/components/layouts/login/index.tsx +0 -252
  353. package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
  354. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
  355. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
  356. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
  357. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
  358. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
  359. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
  360. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
  361. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
  362. package/src/components/layouts/my_settings/index.tsx +0 -351
  363. package/src/components/layouts/register/config/register_field_config.ts +0 -101
  364. package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
  365. package/src/components/layouts/register/index.tsx +0 -226
  366. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
  367. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
  368. package/src/components/layouts/reset_password/index.tsx +0 -294
  369. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
  370. package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
  371. package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
  372. package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
  373. package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
  374. package/src/components/layouts/shared/components/form_header.tsx +0 -36
  375. package/src/components/layouts/shared/components/logout_button.tsx +0 -76
  376. package/src/components/layouts/shared/components/password_field.tsx +0 -72
  377. package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
  378. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
  379. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
  380. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
  381. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
  382. package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
  383. package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
  384. package/src/components/layouts/shared/config/layout_customization.ts +0 -95
  385. package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
  386. package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
  387. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
  388. package/src/components/layouts/shared/index.ts +0 -34
  389. package/src/components/layouts/shared/utils/ip_address.ts +0 -37
  390. package/src/components/layouts/shared/utils/validation.ts +0 -66
  391. package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
  392. package/src/components/layouts/user_management/index.tsx +0 -1295
  393. package/src/components/ui/alert-dialog.tsx +0 -141
  394. package/src/components/ui/avatar.tsx +0 -50
  395. package/src/components/ui/button.tsx +0 -57
  396. package/src/components/ui/checkbox.tsx +0 -30
  397. package/src/components/ui/dialog.tsx +0 -122
  398. package/src/components/ui/dropdown-menu.tsx +0 -201
  399. package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
  400. package/src/components/ui/index.ts +0 -22
  401. package/src/components/ui/input.tsx +0 -22
  402. package/src/components/ui/label.tsx +0 -26
  403. package/src/components/ui/separator.tsx +0 -31
  404. package/src/components/ui/sheet.tsx +0 -139
  405. package/src/components/ui/sidebar.tsx +0 -773
  406. package/src/components/ui/skeleton.tsx +0 -15
  407. package/src/components/ui/sonner.tsx +0 -31
  408. package/src/components/ui/switch.tsx +0 -29
  409. package/src/components/ui/table.tsx +0 -120
  410. package/src/components/ui/tabs.tsx +0 -55
  411. package/src/components/ui/tooltip.tsx +0 -32
  412. package/src/components/ui/vertical-tabs.tsx +0 -59
  413. package/src/hooks/use-mobile.tsx +0 -19
  414. package/src/index.ts +0 -7
  415. package/src/lib/already_logged_in_config.server.ts +0 -46
  416. package/src/lib/app_logger.ts +0 -24
  417. package/src/lib/auth/auth_cache.ts +0 -220
  418. package/src/lib/auth/auth_rate_limiter.ts +0 -121
  419. package/src/lib/auth/auth_types.ts +0 -65
  420. package/src/lib/auth/auth_utils.server.ts +0 -196
  421. package/src/lib/auth/hazo_get_auth.server.ts +0 -333
  422. package/src/lib/auth/index.ts +0 -23
  423. package/src/lib/auth/server_auth.ts +0 -88
  424. package/src/lib/auth_utility_config.server.ts +0 -136
  425. package/src/lib/config/config_loader.server.ts +0 -164
  426. package/src/lib/email_verification_config.server.ts +0 -32
  427. package/src/lib/file_types_config.server.ts +0 -25
  428. package/src/lib/forgot_password_config.server.ts +0 -32
  429. package/src/lib/hazo_connect_instance.server.ts +0 -101
  430. package/src/lib/hazo_connect_setup.server.ts +0 -194
  431. package/src/lib/hazo_connect_setup.ts +0 -54
  432. package/src/lib/index.ts +0 -44
  433. package/src/lib/login_config.server.ts +0 -71
  434. package/src/lib/messages_config.server.ts +0 -45
  435. package/src/lib/migrations/apply_migration.ts +0 -105
  436. package/src/lib/my_settings_config.server.ts +0 -135
  437. package/src/lib/password_requirements_config.server.ts +0 -39
  438. package/src/lib/profile_pic_menu_config.server.ts +0 -138
  439. package/src/lib/profile_picture_config.server.ts +0 -56
  440. package/src/lib/register_config.server.ts +0 -73
  441. package/src/lib/reset_password_config.server.ts +0 -75
  442. package/src/lib/services/email_service.ts +0 -581
  443. package/src/lib/services/email_verification_service.ts +0 -270
  444. package/src/lib/services/index.ts +0 -15
  445. package/src/lib/services/login_service.ts +0 -134
  446. package/src/lib/services/password_change_service.ts +0 -154
  447. package/src/lib/services/password_reset_service.ts +0 -405
  448. package/src/lib/services/profile_picture_remove_service.ts +0 -120
  449. package/src/lib/services/profile_picture_service.ts +0 -215
  450. package/src/lib/services/profile_picture_source_mapper.ts +0 -62
  451. package/src/lib/services/registration_service.ts +0 -184
  452. package/src/lib/services/token_service.ts +0 -240
  453. package/src/lib/services/user_profiles_service.ts +0 -143
  454. package/src/lib/services/user_update_service.ts +0 -141
  455. package/src/lib/ui_shell_config.server.ts +0 -73
  456. package/src/lib/ui_sizes_config.server.ts +0 -37
  457. package/src/lib/user_fields_config.server.ts +0 -31
  458. package/src/lib/user_management_config.server.ts +0 -39
  459. package/src/lib/utils/api_route_helpers.ts +0 -60
  460. package/src/lib/utils/error_sanitizer.ts +0 -75
  461. package/src/lib/utils.ts +0 -11
  462. package/src/middleware.ts +0 -94
  463. package/src/routes/index.ts +0 -34
  464. package/src/server/config/config_loader.ts +0 -496
  465. package/src/server/index.ts +0 -38
  466. package/src/server/logging/logger_service.ts +0 -56
  467. package/src/server/routes/root_router.ts +0 -16
  468. package/src/server/server.ts +0 -28
  469. package/src/server/types/app_types.ts +0 -74
  470. package/src/server/types/express.d.ts +0 -16
  471. package/src/stories/email_verification_layout.stories.tsx +0 -137
  472. package/src/stories/forgot_password_layout.stories.tsx +0 -85
  473. package/src/stories/login_layout.stories.tsx +0 -85
  474. package/src/stories/project_overview.stories.tsx +0 -33
  475. package/src/stories/register_layout.stories.tsx +0 -107
  476. package/tailwind.config.ts +0 -77
  477. package/tsconfig.build.json +0 -39
  478. package/tsconfig.json +0 -28
@@ -1,215 +0,0 @@
1
- // file_description: service for profile picture management including default photo logic, Gravatar, and library photos
2
- // section: imports
3
- import type { HazoConnectAdapter } from "hazo_connect";
4
- import { createCrudService } from "hazo_connect/server";
5
- import gravatarUrl from "gravatar-url";
6
- import { get_profile_picture_config } from "hazo_auth/lib/profile_picture_config.server";
7
- import { get_ui_sizes_config } from "hazo_auth/lib/ui_sizes_config.server";
8
- import { get_file_types_config } from "hazo_auth/lib/file_types_config.server";
9
- import { create_app_logger } from "hazo_auth/lib/app_logger";
10
- import path from "path";
11
- import fs from "fs";
12
- import { map_ui_source_to_db, type ProfilePictureSourceUI } from "hazo_auth/lib/services/profile_picture_source_mapper";
13
-
14
- // section: types
15
- export type ProfilePictureSource = ProfilePictureSourceUI;
16
-
17
- export type DefaultProfilePictureResult = {
18
- profile_picture_url: string;
19
- profile_source: ProfilePictureSource;
20
- };
21
-
22
- // section: helpers
23
- /**
24
- * Generates Gravatar URL from email address
25
- * @param email - User's email address
26
- * @param size - Image size in pixels (defaults to config value)
27
- * @returns Gravatar URL
28
- */
29
- export function get_gravatar_url(email: string, size?: number): string {
30
- const uiSizes = get_ui_sizes_config();
31
- const gravatarSize = size || uiSizes.gravatar_size;
32
- return gravatarUrl(email, {
33
- size: gravatarSize,
34
- default: "identicon",
35
- });
36
- }
37
-
38
- /**
39
- * Gets library photo categories by reading subdirectories
40
- * @returns Array of category names
41
- */
42
- export function get_library_categories(): string[] {
43
- const config = get_profile_picture_config();
44
- const library_path = path.resolve(process.cwd(), "public", config.library_photo_path.replace(/^\//, ""));
45
-
46
- if (!fs.existsSync(library_path)) {
47
- return [];
48
- }
49
-
50
- try {
51
- const entries = fs.readdirSync(library_path, { withFileTypes: true });
52
- return entries
53
- .filter((entry) => entry.isDirectory())
54
- .map((entry) => entry.name)
55
- .sort();
56
- } catch (error) {
57
- const logger = create_app_logger();
58
- const error_message = error instanceof Error ? error.message : "Unknown error";
59
- logger.warn("profile_picture_service_read_categories_failed", {
60
- filename: "profile_picture_service.ts",
61
- line_number: 0,
62
- library_path,
63
- error: error_message,
64
- });
65
- return [];
66
- }
67
- }
68
-
69
- /**
70
- * Gets photos in a specific library category
71
- * @param category - Category name
72
- * @returns Array of photo URLs (relative to public directory)
73
- */
74
- export function get_library_photos(category: string): string[] {
75
- const config = get_profile_picture_config();
76
- const category_path = path.resolve(process.cwd(), "public", config.library_photo_path.replace(/^\//, ""), category);
77
-
78
- if (!fs.existsSync(category_path)) {
79
- return [];
80
- }
81
-
82
- try {
83
- const fileTypes = get_file_types_config();
84
- const allowedExtensions = fileTypes.allowed_image_extensions.map(ext => `.${ext.toLowerCase()}`);
85
- const entries = fs.readdirSync(category_path, { withFileTypes: true });
86
- const photos = entries
87
- .filter((entry) => {
88
- if (!entry.isFile()) return false;
89
- const ext = path.extname(entry.name).toLowerCase();
90
- return allowedExtensions.includes(ext);
91
- })
92
- .map((entry) => `${config.library_photo_path}/${category}/${entry.name}`)
93
- .sort();
94
- return photos;
95
- } catch (error) {
96
- const logger = create_app_logger();
97
- const error_message = error instanceof Error ? error.message : "Unknown error";
98
- logger.warn("profile_picture_service_read_photos_failed", {
99
- filename: "profile_picture_service.ts",
100
- line_number: 0,
101
- category,
102
- category_path,
103
- error: error_message,
104
- });
105
- return [];
106
- }
107
- }
108
-
109
- /**
110
- * Gets default profile picture based on configuration priority
111
- * @param user_email - User's email address
112
- * @param user_name - User's name (optional)
113
- * @returns Default profile picture URL and source, or null if no default available
114
- */
115
- export function get_default_profile_picture(
116
- user_email: string,
117
- user_name?: string,
118
- ): DefaultProfilePictureResult | null {
119
- const config = get_profile_picture_config();
120
-
121
- if (!config.user_photo_default) {
122
- return null;
123
- }
124
-
125
- const uiSizes = get_ui_sizes_config();
126
-
127
- // Try priority 1
128
- if (config.user_photo_default_priority1 === "gravatar") {
129
- const gravatar_url = get_gravatar_url(user_email, uiSizes.gravatar_size);
130
- // Note: We can't check if Gravatar actually exists without making a request
131
- // For now, we'll always return Gravatar URL and let the browser handle 404
132
- return {
133
- profile_picture_url: gravatar_url,
134
- profile_source: "gravatar",
135
- };
136
- } else if (config.user_photo_default_priority1 === "library") {
137
- const categories = get_library_categories();
138
- if (categories.length > 0) {
139
- // Use first category, first photo as default
140
- const photos = get_library_photos(categories[0]);
141
- if (photos.length > 0) {
142
- return {
143
- profile_picture_url: photos[0],
144
- profile_source: "library",
145
- };
146
- }
147
- }
148
- }
149
-
150
- // Try priority 2 if priority 1 didn't work (only if priority2 is different from priority1)
151
- const priority1 = config.user_photo_default_priority1;
152
- const priority2 = config.user_photo_default_priority2;
153
-
154
- if (priority2 && priority2 !== priority1) {
155
- if (priority2 === "gravatar") {
156
- const gravatar_url = get_gravatar_url(user_email, uiSizes.gravatar_size);
157
- return {
158
- profile_picture_url: gravatar_url,
159
- profile_source: "gravatar",
160
- };
161
- } else if (priority2 === "library") {
162
- const categories = get_library_categories();
163
- if (categories.length > 0) {
164
- const photos = get_library_photos(categories[0]);
165
- if (photos.length > 0) {
166
- return {
167
- profile_picture_url: photos[0],
168
- profile_source: "library",
169
- };
170
- }
171
- }
172
- }
173
- }
174
-
175
- // No default photo available
176
- return null;
177
- }
178
-
179
- /**
180
- * Updates user profile picture in database
181
- * @param adapter - The hazo_connect adapter instance
182
- * @param user_id - User ID
183
- * @param profile_picture_url - Profile picture URL
184
- * @param profile_source - Profile picture source type
185
- * @returns Success status
186
- */
187
- export async function update_user_profile_picture(
188
- adapter: HazoConnectAdapter,
189
- user_id: string,
190
- profile_picture_url: string,
191
- profile_source: ProfilePictureSource,
192
- ): Promise<{ success: boolean; error?: string }> {
193
- try {
194
- const users_service = createCrudService(adapter, "hazo_users");
195
- const now = new Date().toISOString();
196
-
197
- // Map UI source value to database enum value
198
- const db_profile_source = map_ui_source_to_db(profile_source);
199
-
200
- await users_service.updateById(user_id, {
201
- profile_picture_url,
202
- profile_source: db_profile_source,
203
- changed_at: now,
204
- });
205
-
206
- return { success: true };
207
- } catch (error) {
208
- const error_message = error instanceof Error ? error.message : "Unknown error";
209
- return {
210
- success: false,
211
- error: error_message,
212
- };
213
- }
214
- }
215
-
@@ -1,62 +0,0 @@
1
- // file_description: helper to map between UI profile picture source values and database enum values
2
- // section: types
3
- /**
4
- * UI representation of profile picture source
5
- * Used in components and API interfaces
6
- */
7
- export type ProfilePictureSourceUI = "upload" | "library" | "gravatar" | "custom";
8
-
9
- /**
10
- * Database enum values for profile_source
11
- * Must match the CHECK constraint in the database
12
- */
13
- export type ProfilePictureSourceDB = "gravatar" | "custom" | "predefined";
14
-
15
- // section: helpers
16
- /**
17
- * Maps UI profile picture source to database enum value
18
- * @param uiSource - UI representation of source ("upload", "library", "gravatar", "custom")
19
- * @returns Database enum value ("gravatar", "custom", "predefined")
20
- */
21
- export function map_ui_source_to_db(uiSource: ProfilePictureSourceUI): ProfilePictureSourceDB {
22
- switch (uiSource) {
23
- case "upload":
24
- return "custom"; // User uploaded their own photo
25
- case "library":
26
- return "predefined"; // User selected from predefined library
27
- case "gravatar":
28
- return "gravatar"; // User's Gravatar
29
- case "custom":
30
- return "custom"; // Already in database format
31
- default:
32
- // Fallback to custom for unknown values
33
- return "custom";
34
- }
35
- }
36
-
37
- /**
38
- * Maps database enum value to UI representation
39
- * @param dbSource - Database enum value ("gravatar", "custom", "predefined")
40
- * @returns UI representation ("upload", "library", "gravatar", "custom")
41
- */
42
- export function map_db_source_to_ui(dbSource: ProfilePictureSourceDB | string | null | undefined): ProfilePictureSourceUI {
43
- if (!dbSource) {
44
- return "custom"; // Default fallback
45
- }
46
-
47
- switch (dbSource) {
48
- case "gravatar":
49
- return "gravatar";
50
- case "custom":
51
- return "upload"; // Map custom to upload in UI (user uploaded their own)
52
- case "predefined":
53
- return "library"; // Map predefined to library in UI (user selected from library)
54
- default:
55
- // For unknown values, try to return as-is if it matches UI format
56
- if (dbSource === "upload" || dbSource === "library") {
57
- return dbSource as ProfilePictureSourceUI;
58
- }
59
- return "custom"; // Fallback
60
- }
61
- }
62
-
@@ -1,184 +0,0 @@
1
- // file_description: service for user registration operations using hazo_connect
2
- // section: imports
3
- import type { HazoConnectAdapter } from "hazo_connect";
4
- import { createCrudService } from "hazo_connect/server";
5
- import argon2 from "argon2";
6
- import { randomUUID } from "crypto";
7
- import { create_token } from "hazo_auth/lib/services/token_service";
8
- import { get_default_profile_picture } from "hazo_auth/lib/services/profile_picture_service";
9
- import { get_profile_picture_config } from "hazo_auth/lib/profile_picture_config.server";
10
- import { map_ui_source_to_db } from "hazo_auth/lib/services/profile_picture_source_mapper";
11
- import { create_app_logger } from "hazo_auth/lib/app_logger";
12
- import { send_template_email } from "hazo_auth/lib/services/email_service";
13
- import { sanitize_error_for_user } from "hazo_auth/lib/utils/error_sanitizer";
14
- import { get_filename, get_line_number } from "hazo_auth/lib/utils/api_route_helpers";
15
-
16
- // section: types
17
- export type RegistrationData = {
18
- email: string;
19
- password: string;
20
- name?: string;
21
- url_on_logon?: string;
22
- };
23
-
24
- export type RegistrationResult = {
25
- success: boolean;
26
- user_id?: string;
27
- error?: string;
28
- };
29
-
30
- // section: helpers
31
- /**
32
- * Registers a new user in the database using hazo_connect
33
- * @param adapter - The hazo_connect adapter instance
34
- * @param data - Registration data (email, password, optional name)
35
- * @returns Registration result with success status and user_id or error
36
- */
37
- export async function register_user(
38
- adapter: HazoConnectAdapter,
39
- data: RegistrationData,
40
- ): Promise<RegistrationResult> {
41
- try {
42
- const { email, password, name, url_on_logon } = data;
43
-
44
- // Create CRUD service for hazo_users table
45
- const users_service = createCrudService(adapter, "hazo_users");
46
-
47
- // Check if user already exists
48
- const existing_users = await users_service.findBy({
49
- email_address: email,
50
- });
51
-
52
- if (Array.isArray(existing_users) && existing_users.length > 0) {
53
- return {
54
- success: false,
55
- error: "Email address already registered",
56
- };
57
- }
58
-
59
- // Hash password using argon2
60
- const password_hash = await argon2.hash(password);
61
-
62
- // Generate user ID
63
- const user_id = randomUUID();
64
- const now = new Date().toISOString();
65
-
66
- // Insert user into database using CRUD service
67
- const insert_data: Record<string, unknown> = {
68
- id: user_id,
69
- email_address: email,
70
- password_hash: password_hash,
71
- email_verified: false,
72
- is_active: true,
73
- login_attempts: 0,
74
- created_at: now,
75
- changed_at: now,
76
- };
77
-
78
- // Include name if provided
79
- if (name) {
80
- insert_data.name = name;
81
- }
82
-
83
- // Validate and include url_on_logon if provided
84
- if (url_on_logon) {
85
- // Ensure it's a relative path starting with / but not //
86
- if (url_on_logon.startsWith("/") && !url_on_logon.startsWith("//")) {
87
- insert_data.url_on_logon = url_on_logon;
88
- }
89
- }
90
-
91
- // Set default profile picture if enabled
92
- const profile_picture_config = get_profile_picture_config();
93
- if (profile_picture_config.user_photo_default) {
94
- const default_photo = get_default_profile_picture(email, name);
95
- if (default_photo) {
96
- insert_data.profile_picture_url = default_photo.profile_picture_url;
97
- // Map UI source value to database enum value
98
- insert_data.profile_source = map_ui_source_to_db(default_photo.profile_source);
99
- }
100
- }
101
-
102
- const inserted_users = await users_service.insert(insert_data);
103
-
104
- // Verify insertion was successful
105
- if (!Array.isArray(inserted_users) || inserted_users.length === 0) {
106
- return {
107
- success: false,
108
- error: "Failed to create user account",
109
- };
110
- }
111
-
112
- // Create email verification token for the new user
113
- const token_result = await create_token({
114
- adapter,
115
- user_id,
116
- token_type: "email_verification",
117
- });
118
-
119
- if (!token_result.success) {
120
- // Log error but don't fail registration - token can be resent later
121
- const logger = create_app_logger();
122
- const error_message = token_result.error || "Unknown error";
123
- logger.error("registration_service_token_creation_failed", {
124
- filename: "registration_service.ts",
125
- line_number: 0,
126
- user_id,
127
- error: error_message,
128
- note: "This may be due to missing token_type column in hazo_refresh_tokens table. Please ensure migration 001_add_token_type_to_refresh_tokens.sql has been applied.",
129
- });
130
- } else {
131
- const logger = create_app_logger();
132
- logger.info("registration_service_token_created", {
133
- filename: "registration_service.ts",
134
- line_number: 0,
135
- user_id,
136
- });
137
- }
138
-
139
- // Send verification email if token was created successfully
140
- if (token_result.success && token_result.raw_token) {
141
- const email_result = await send_template_email("email_verification", email, {
142
- token: token_result.raw_token,
143
- user_email: email,
144
- user_name: name,
145
- });
146
-
147
- if (!email_result.success) {
148
- const logger = create_app_logger();
149
- logger.error("registration_service_email_send_failed", {
150
- filename: "registration_service.ts",
151
- line_number: 0,
152
- user_id,
153
- email,
154
- error: email_result.error,
155
- note: "User registration succeeded but verification email failed to send",
156
- });
157
- }
158
- }
159
-
160
- return {
161
- success: true,
162
- user_id,
163
- };
164
- } catch (error) {
165
- const logger = create_app_logger();
166
- const user_friendly_error = sanitize_error_for_user(error, {
167
- logToConsole: true,
168
- logToLogger: true,
169
- logger,
170
- context: {
171
- filename: "registration_service.ts",
172
- line_number: get_line_number(),
173
- email: data.email,
174
- operation: "register_user",
175
- },
176
- });
177
-
178
- return {
179
- success: false,
180
- error: user_friendly_error,
181
- };
182
- }
183
- }
184
-
@@ -1,240 +0,0 @@
1
- // file_description: shared service for creating and managing tokens in hazo_refresh_tokens table
2
- // section: imports
3
- import type { HazoConnectAdapter } from "hazo_connect";
4
- import { createCrudService } from "hazo_connect/server";
5
- import { randomBytes, randomUUID } from "crypto";
6
- import argon2 from "argon2";
7
- import { read_config_section } from "hazo_auth/lib/config/config_loader.server";
8
- import { create_app_logger } from "hazo_auth/lib/app_logger";
9
-
10
- // section: types
11
- export type TokenType = "refresh" | "password_reset" | "email_verification";
12
-
13
- export type CreateTokenParams = {
14
- adapter: HazoConnectAdapter;
15
- user_id: string;
16
- token_type: TokenType;
17
- };
18
-
19
- export type CreateTokenResult = {
20
- success: boolean;
21
- raw_token?: string;
22
- error?: string;
23
- };
24
-
25
- // section: helpers
26
- /**
27
- * Gets token expiry hours from hazo_auth_config.ini for a specific token type
28
- * Falls back to defaults if config is not found
29
- * @param token_type - The type of token (refresh, password_reset, email_verification)
30
- * @returns Number of hours until token expires
31
- */
32
- function get_token_expiry_hours(token_type: TokenType): number {
33
- const default_expiries: Record<TokenType, number> = {
34
- refresh: 720, // 30 days
35
- password_reset: 0.167, // 10 minutes
36
- email_verification: 48, // 48 hours
37
- };
38
-
39
- const logger = create_app_logger();
40
- const token_config_section = read_config_section("hazo_auth__tokens");
41
-
42
- // Get expiry from config or environment variable or default
43
- const config_key = `${token_type}_expiry_hours`;
44
- const env_key = `HAZO_AUTH_${token_type.toUpperCase()}_TOKEN_EXPIRY_HOURS`;
45
-
46
- const expiry_hours =
47
- token_config_section?.[config_key] ||
48
- process.env[env_key] ||
49
- default_expiries[token_type];
50
-
51
- return parseFloat(String(expiry_hours)) || default_expiries[token_type];
52
- }
53
-
54
- /**
55
- * Creates a token for a user and stores it in hazo_refresh_tokens table
56
- * Invalidates any existing tokens of the same type for the user before creating a new one
57
- * @param params - Token creation parameters (adapter, user_id, token_type)
58
- * @returns Token creation result with raw_token (for sending to user) or error
59
- */
60
- export async function create_token(
61
- params: CreateTokenParams,
62
- ): Promise<CreateTokenResult> {
63
- try {
64
- const { adapter, user_id, token_type } = params;
65
-
66
- // Create CRUD service for hazo_refresh_tokens table
67
- const tokens_service = createCrudService(adapter, "hazo_refresh_tokens");
68
-
69
- // Invalidate any existing tokens of this type for this user
70
- // If token_type column doesn't exist, this will fail - catch and continue
71
- let existing_tokens: unknown[] = [];
72
- try {
73
- existing_tokens = (await tokens_service.findBy({
74
- user_id: user_id,
75
- token_type: token_type,
76
- })) as unknown[];
77
- } catch (error) {
78
- // If token_type column doesn't exist, try without it
79
- // This is a fallback for databases that haven't had the migration applied
80
- const logger = create_app_logger();
81
- const error_message = error instanceof Error ? error.message : "Unknown error";
82
- logger.warn("token_service_token_type_column_missing", {
83
- filename: "token_service.ts",
84
- line_number: 0,
85
- user_id,
86
- token_type,
87
- error: error_message,
88
- note: "token_type column may not exist, trying without filter",
89
- });
90
- // Try to find tokens by user_id only (less precise but works without migration)
91
- try {
92
- existing_tokens = (await tokens_service.findBy({
93
- user_id: user_id,
94
- })) as unknown[];
95
- } catch (fallbackError) {
96
- // If that also fails, log and continue (will just create new token)
97
- const fallback_error_message = fallbackError instanceof Error ? fallbackError.message : "Unknown error";
98
- logger.warn("token_service_query_existing_tokens_failed", {
99
- filename: "token_service.ts",
100
- line_number: 0,
101
- user_id,
102
- error: fallback_error_message,
103
- note: "Could not query existing tokens, will create new token anyway",
104
- });
105
- }
106
- }
107
-
108
- if (Array.isArray(existing_tokens) && existing_tokens.length > 0) {
109
- // Delete existing tokens (of this type if token_type exists, or all for user if not)
110
- for (const token of existing_tokens) {
111
- try {
112
- await tokens_service.deleteById((token as { id: unknown }).id);
113
- } catch (deleteError) {
114
- const logger = create_app_logger();
115
- const error_message = deleteError instanceof Error ? deleteError.message : "Unknown error";
116
- logger.warn("token_service_delete_existing_token_failed", {
117
- filename: "token_service.ts",
118
- line_number: 0,
119
- user_id,
120
- token_id: (token as { id: unknown }).id,
121
- error: error_message,
122
- });
123
- }
124
- }
125
- }
126
-
127
- // Generate a secure random token
128
- const raw_token = randomBytes(32).toString("hex");
129
-
130
- // Hash the token before storing
131
- const token_hash = await argon2.hash(raw_token);
132
-
133
- // Get expiry hours from config
134
- const expiry_hours = get_token_expiry_hours(token_type);
135
-
136
- // Calculate expiration time (convert hours to milliseconds)
137
- const expires_at = new Date();
138
- expires_at.setTime(expires_at.getTime() + expiry_hours * 60 * 60 * 1000);
139
-
140
- const now = new Date().toISOString();
141
-
142
- // Insert the token into the database
143
- // Try with token_type first, fallback to without if column doesn't exist
144
- let inserted_tokens: unknown[];
145
- try {
146
- inserted_tokens = (await tokens_service.insert({
147
- id: randomUUID(),
148
- user_id: user_id,
149
- token_hash: token_hash,
150
- token_type: token_type,
151
- expires_at: expires_at.toISOString(),
152
- created_at: now,
153
- })) as unknown[];
154
- } catch (error) {
155
- // If token_type column doesn't exist, try without it
156
- const logger = create_app_logger();
157
- const error_message = error instanceof Error ? error.message : "Unknown error";
158
- logger.warn("token_service_insert_with_token_type_failed", {
159
- filename: "token_service.ts",
160
- line_number: 0,
161
- user_id,
162
- token_type,
163
- error: error_message,
164
- note: "token_type column may not exist, inserting without it",
165
- });
166
- // Fallback: insert without token_type (will use default if column exists with default)
167
- inserted_tokens = (await tokens_service.insert({
168
- id: randomUUID(),
169
- user_id: user_id,
170
- token_hash: token_hash,
171
- expires_at: expires_at.toISOString(),
172
- created_at: now,
173
- })) as unknown[];
174
- }
175
-
176
- // Verify insertion was successful
177
- if (!Array.isArray(inserted_tokens) || inserted_tokens.length === 0) {
178
- const logger = create_app_logger();
179
- const error_msg = `Failed to create ${token_type} token - no rows inserted`;
180
- logger.error("token_service_insertion_failed", {
181
- filename: "token_service.ts",
182
- line_number: 0,
183
- user_id,
184
- token_type,
185
- error: error_msg,
186
- });
187
- return {
188
- success: false,
189
- error: error_msg,
190
- };
191
- }
192
-
193
- const logger = create_app_logger();
194
- logger.info("token_service_token_created", {
195
- filename: "token_service.ts",
196
- line_number: 0,
197
- user_id,
198
- token_type,
199
- });
200
-
201
- // Log raw token and test URLs in debug mode (logger handles dev mode)
202
- logger.debug("token_service_raw_token", {
203
- filename: "token_service.ts",
204
- line_number: 0,
205
- user_id,
206
- token_type,
207
- raw_token,
208
- test_url: token_type === "email_verification"
209
- ? `/hazo_auth/verify_email?token=${raw_token}`
210
- : token_type === "password_reset"
211
- ? `/hazo_auth/reset_password?token=${raw_token}`
212
- : undefined,
213
- });
214
-
215
- return {
216
- success: true,
217
- raw_token,
218
- };
219
- } catch (error) {
220
- const logger = create_app_logger();
221
- const error_message =
222
- error instanceof Error ? error.message : "Unknown error";
223
- const error_stack = error instanceof Error ? error.stack : undefined;
224
-
225
- logger.error("token_service_create_token_error", {
226
- filename: "token_service.ts",
227
- line_number: 0,
228
- user_id: params.user_id,
229
- token_type: params.token_type,
230
- error: error_message,
231
- error_stack,
232
- });
233
-
234
- return {
235
- success: false,
236
- error: error_message,
237
- };
238
- }
239
- }
240
-