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,270 +0,0 @@
1
- // file_description: service for email verification 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 { create_token } from "hazo_auth/lib/services/token_service";
7
- import { send_template_email } from "hazo_auth/lib/services/email_service";
8
- import { create_app_logger } from "hazo_auth/lib/app_logger";
9
-
10
- // section: types
11
- export type EmailVerificationTokenData = {
12
- token: string;
13
- };
14
-
15
- export type EmailVerificationResult = {
16
- success: boolean;
17
- user_id?: string;
18
- email?: string;
19
- error?: string;
20
- };
21
-
22
- export type ResendVerificationData = {
23
- email: string;
24
- };
25
-
26
- export type ResendVerificationResult = {
27
- success: boolean;
28
- error?: string;
29
- };
30
-
31
- // section: helpers
32
- /**
33
- * Verifies an email verification token
34
- * Updates email_verified to true in hazo_users and deletes the token
35
- * @param adapter - The hazo_connect adapter instance
36
- * @param data - Email verification token data (token)
37
- * @returns Email verification result with success status, user_id, email, or error
38
- */
39
- export async function verify_email_token(
40
- adapter: HazoConnectAdapter,
41
- data: EmailVerificationTokenData,
42
- ): Promise<EmailVerificationResult> {
43
- try {
44
- const { token } = data;
45
-
46
- // Create CRUD service for hazo_refresh_tokens table
47
- const tokens_service = createCrudService(adapter, "hazo_refresh_tokens");
48
-
49
- // Find all email verification tokens
50
- // If token_type column doesn't exist, query all tokens and filter manually
51
- let all_tokens: unknown[] = [];
52
- try {
53
- all_tokens = (await tokens_service.findBy({
54
- token_type: "email_verification",
55
- })) as unknown[];
56
- } catch (error) {
57
- // If token_type column doesn't exist, get all tokens and we'll verify each one
58
- const logger = create_app_logger();
59
- const error_message = error instanceof Error ? error.message : "Unknown error";
60
- logger.warn("email_verification_service_token_type_column_missing", {
61
- filename: "email_verification_service.ts",
62
- line_number: 0,
63
- error: error_message,
64
- note: "token_type column may not exist, querying all tokens",
65
- });
66
- try {
67
- // Query all tokens (will need to verify each one)
68
- all_tokens = (await tokens_service.findBy({})) as unknown[];
69
- } catch (fallbackError) {
70
- const fallback_error_message = fallbackError instanceof Error ? fallbackError.message : "Unknown error";
71
- logger.error("email_verification_service_query_tokens_failed", {
72
- filename: "email_verification_service.ts",
73
- line_number: 0,
74
- error: fallback_error_message,
75
- });
76
- return {
77
- success: false,
78
- error: "Invalid or expired verification token",
79
- };
80
- }
81
- }
82
-
83
- if (!Array.isArray(all_tokens) || all_tokens.length === 0) {
84
- return {
85
- success: false,
86
- error: "Invalid or expired verification token",
87
- };
88
- }
89
-
90
- // Find the matching token by verifying the hash
91
- let matching_token = null;
92
- let user_id: string | null = null;
93
-
94
- for (const stored_token of all_tokens) {
95
- try {
96
- const token_hash = (stored_token as { token_hash: string }).token_hash;
97
- const is_valid = await argon2.verify(token_hash, token);
98
-
99
- if (is_valid) {
100
- matching_token = stored_token;
101
- user_id = (stored_token as { user_id: string }).user_id;
102
- break;
103
- }
104
- } catch {
105
- // Continue to next token if verification fails
106
- continue;
107
- }
108
- }
109
-
110
- if (!matching_token || !user_id) {
111
- return {
112
- success: false,
113
- error: "Invalid or expired verification token",
114
- };
115
- }
116
-
117
- // Check if token has expired
118
- const expires_at = new Date((matching_token as { expires_at: string }).expires_at);
119
- const now = new Date();
120
-
121
- if (expires_at < now) {
122
- // Delete expired token
123
- await tokens_service.deleteById((matching_token as { id: string }).id);
124
-
125
- return {
126
- success: false,
127
- error: "Verification token has expired",
128
- };
129
- }
130
-
131
- // Get user email before updating
132
- const users_service = createCrudService(adapter, "hazo_users");
133
- const users = await users_service.findBy({
134
- id: user_id,
135
- });
136
-
137
- if (!Array.isArray(users) || users.length === 0) {
138
- return {
139
- success: false,
140
- error: "User not found",
141
- };
142
- }
143
-
144
- const user = users[0];
145
- const email = user.email_address as string;
146
-
147
- // Update user's email_verified status
148
- const now_iso = new Date().toISOString();
149
- await users_service.updateById(
150
- user_id,
151
- {
152
- email_verified: true,
153
- changed_at: now_iso,
154
- },
155
- );
156
-
157
- // Delete the used token
158
- await tokens_service.deleteById((matching_token as { id: string }).id);
159
-
160
- return {
161
- success: true,
162
- user_id,
163
- email,
164
- };
165
- } catch (error) {
166
- const error_message =
167
- error instanceof Error ? error.message : "Unknown error";
168
-
169
- return {
170
- success: false,
171
- error: error_message,
172
- };
173
- }
174
- }
175
-
176
- /**
177
- * Resends an email verification token for a user
178
- * Creates a new email verification token and stores it in hazo_refresh_tokens
179
- * Invalidates any existing email verification tokens for the user before creating a new one
180
- * @param adapter - The hazo_connect adapter instance
181
- * @param data - Resend verification data (email)
182
- * @returns Resend verification result with success status or error
183
- */
184
- export async function resend_verification_email(
185
- adapter: HazoConnectAdapter,
186
- data: ResendVerificationData,
187
- ): Promise<ResendVerificationResult> {
188
- try {
189
- const { email } = data;
190
-
191
- // Create CRUD service for hazo_users table
192
- const users_service = createCrudService(adapter, "hazo_users");
193
-
194
- // Find user by email
195
- const users = await users_service.findBy({
196
- email_address: email,
197
- });
198
-
199
- // If user not found, return success anyway (to prevent email enumeration)
200
- if (!Array.isArray(users) || users.length === 0) {
201
- return {
202
- success: true,
203
- };
204
- }
205
-
206
- const user = users[0];
207
- const user_id = user.id as string;
208
-
209
- // Check if email is already verified
210
- if (user.email_verified === true) {
211
- return {
212
- success: true,
213
- };
214
- }
215
-
216
- // Create email verification token using shared token service
217
- const token_result = await create_token({
218
- adapter,
219
- user_id,
220
- token_type: "email_verification",
221
- });
222
-
223
- if (!token_result.success) {
224
- return {
225
- success: false,
226
- error: token_result.error || "Failed to create email verification token",
227
- };
228
- }
229
-
230
- // Send verification email if token was created successfully
231
- if (token_result.raw_token) {
232
- const email_result = await send_template_email("email_verification", email, {
233
- token: token_result.raw_token,
234
- user_email: email,
235
- user_name: user.name as string | undefined,
236
- });
237
-
238
- if (!email_result.success) {
239
- const logger = create_app_logger();
240
- logger.error("email_verification_service_email_send_failed", {
241
- filename: "email_verification_service.ts",
242
- line_number: 0,
243
- user_id,
244
- email,
245
- error: email_result.error,
246
- note: "Verification token created but email failed to send",
247
- });
248
-
249
- // Return error if email sending failed (this is a technical error, not a security issue)
250
- return {
251
- success: false,
252
- error: email_result.error || "Failed to send verification email",
253
- };
254
- }
255
- }
256
-
257
- return {
258
- success: true,
259
- };
260
- } catch (error) {
261
- const error_message =
262
- error instanceof Error ? error.message : "Unknown error";
263
-
264
- return {
265
- success: false,
266
- error: error_message,
267
- };
268
- }
269
- }
270
-
@@ -1,15 +0,0 @@
1
- // file_description: barrel export for all services
2
- // section: service_exports
3
- export * from "./email_service";
4
- export * from "./email_verification_service";
5
- export * from "./login_service";
6
- export * from "./password_change_service";
7
- export * from "./password_reset_service";
8
- export * from "./profile_picture_remove_service";
9
- export * from "./profile_picture_service";
10
- export * from "./profile_picture_source_mapper";
11
- export * from "./registration_service";
12
- export * from "./token_service";
13
- export * from "./user_profiles_service";
14
- export * from "./user_update_service";
15
-
@@ -1,134 +0,0 @@
1
- // file_description: service for user login 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 { create_app_logger } from "hazo_auth/lib/app_logger";
7
- import { sanitize_error_for_user } from "hazo_auth/lib/utils/error_sanitizer";
8
- import { get_filename, get_line_number } from "hazo_auth/lib/utils/api_route_helpers";
9
-
10
- // section: types
11
- export type LoginData = {
12
- email: string;
13
- password: string;
14
- };
15
-
16
- export type LoginResult = {
17
- success: boolean;
18
- user_id?: string;
19
- error?: string;
20
- email_not_verified?: boolean;
21
- stored_url_on_logon?: string | null;
22
- };
23
-
24
- // section: helpers
25
- /**
26
- * Authenticates a user by verifying email and password against hazo_users table
27
- * @param adapter - The hazo_connect adapter instance
28
- * @param data - Login data (email, password)
29
- * @returns Login result with success status and user_id or error
30
- */
31
- export async function authenticate_user(
32
- adapter: HazoConnectAdapter,
33
- data: LoginData,
34
- ): Promise<LoginResult> {
35
- try {
36
- const { email, password } = data;
37
-
38
- // Create CRUD service for hazo_users table
39
- const users_service = createCrudService(adapter, "hazo_users");
40
-
41
- // Find user by email
42
- const users = await users_service.findBy({
43
- email_address: email,
44
- });
45
-
46
- // Check if user exists
47
- if (!Array.isArray(users) || users.length === 0) {
48
- return {
49
- success: false,
50
- error: "Invalid email or password",
51
- };
52
- }
53
-
54
- const user = users[0];
55
-
56
- // Check if user is active
57
- if (user.is_active === false) {
58
- return {
59
- success: false,
60
- error: "Account is inactive. Please contact support.",
61
- };
62
- }
63
-
64
- // Verify password using argon2
65
- const password_hash = user.password_hash as string;
66
- const is_password_valid = await argon2.verify(password_hash, password);
67
-
68
- if (!is_password_valid) {
69
- // Increment login attempts on failed password
70
- const current_attempts = (user.login_attempts as number) || 0;
71
- const now = new Date().toISOString();
72
-
73
- await users_service.updateById(
74
- user.id,
75
- {
76
- login_attempts: current_attempts + 1,
77
- changed_at: now,
78
- }
79
- );
80
-
81
- return {
82
- success: false,
83
- error: "Invalid email or password",
84
- };
85
- }
86
-
87
- // Check if email is verified
88
- const email_verified = user.email_verified as boolean;
89
- if (!email_verified) {
90
- return {
91
- success: false,
92
- error: "Email address not verified. Please verify your email before logging in.",
93
- email_not_verified: true,
94
- };
95
- }
96
-
97
- // Password is valid and email is verified - update last_logon and reset login_attempts
98
- const now = new Date().toISOString();
99
- await users_service.updateById(
100
- user.id,
101
- {
102
- last_logon: now,
103
- login_attempts: 0,
104
- changed_at: now,
105
- url_on_logon: null, // Clear the stored redirect URL after successful login
106
- }
107
- );
108
-
109
- return {
110
- success: true,
111
- user_id: user.id as string,
112
- stored_url_on_logon: user.url_on_logon as string | null | undefined,
113
- };
114
- } catch (error) {
115
- const logger = create_app_logger();
116
- const user_friendly_error = sanitize_error_for_user(error, {
117
- logToConsole: true,
118
- logToLogger: true,
119
- logger,
120
- context: {
121
- filename: "login_service.ts",
122
- line_number: get_line_number(),
123
- email: data.email,
124
- operation: "authenticate_user",
125
- },
126
- });
127
-
128
- return {
129
- success: false,
130
- error: user_friendly_error,
131
- };
132
- }
133
- }
134
-
@@ -1,154 +0,0 @@
1
- // file_description: service for changing user password 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 { get_password_requirements_config } from "hazo_auth/lib/password_requirements_config.server";
7
- import { send_template_email } from "hazo_auth/lib/services/email_service";
8
- import { create_app_logger } from "hazo_auth/lib/app_logger";
9
-
10
- // section: types
11
- export type PasswordChangeData = {
12
- current_password: string;
13
- new_password: string;
14
- };
15
-
16
- export type PasswordChangeResult = {
17
- success: boolean;
18
- error?: string;
19
- };
20
-
21
- // section: helpers
22
- /**
23
- * Changes a user's password
24
- * Verifies the current password, validates the new password, and updates the password hash
25
- * @param adapter - The hazo_connect adapter instance
26
- * @param user_id - The user ID to update
27
- * @param data - Password change data (current_password, new_password)
28
- * @returns Password change result with success status or error
29
- */
30
- export async function change_password(
31
- adapter: HazoConnectAdapter,
32
- user_id: string,
33
- data: PasswordChangeData,
34
- ): Promise<PasswordChangeResult> {
35
- try {
36
- const { current_password, new_password } = data;
37
-
38
- // Create CRUD service for hazo_users table
39
- const users_service = createCrudService(adapter, "hazo_users");
40
-
41
- // Get current user data
42
- const users = await users_service.findBy({
43
- id: user_id,
44
- });
45
-
46
- if (!Array.isArray(users) || users.length === 0) {
47
- return {
48
- success: false,
49
- error: "User not found",
50
- };
51
- }
52
-
53
- const user = users[0];
54
- const password_hash = user.password_hash as string;
55
- const email = user.email_address as string;
56
- const user_name = user.name as string | undefined;
57
-
58
- // Verify current password
59
- try {
60
- const is_valid = await argon2.verify(password_hash, current_password);
61
- if (!is_valid) {
62
- return {
63
- success: false,
64
- error: "Current password is incorrect",
65
- };
66
- }
67
- } catch (error) {
68
- return {
69
- success: false,
70
- error: "Failed to verify current password",
71
- };
72
- }
73
-
74
- // Get password requirements from config
75
- const password_requirements = get_password_requirements_config();
76
-
77
- // Validate new password
78
- if (!new_password || new_password.length < password_requirements.minimum_length) {
79
- return {
80
- success: false,
81
- error: `Password must be at least ${password_requirements.minimum_length} characters long`,
82
- };
83
- }
84
-
85
- if (password_requirements.require_uppercase && !/[A-Z]/.test(new_password)) {
86
- return {
87
- success: false,
88
- error: "Password must contain at least one uppercase letter",
89
- };
90
- }
91
-
92
- if (password_requirements.require_lowercase && !/[a-z]/.test(new_password)) {
93
- return {
94
- success: false,
95
- error: "Password must contain at least one lowercase letter",
96
- };
97
- }
98
-
99
- if (password_requirements.require_number && !/[0-9]/.test(new_password)) {
100
- return {
101
- success: false,
102
- error: "Password must contain at least one number",
103
- };
104
- }
105
-
106
- if (password_requirements.require_special && !/[^A-Za-z0-9]/.test(new_password)) {
107
- return {
108
- success: false,
109
- error: "Password must contain at least one special character",
110
- };
111
- }
112
-
113
- // Hash the new password
114
- const new_password_hash = await argon2.hash(new_password);
115
-
116
- // Update password hash in database
117
- const now = new Date().toISOString();
118
- await users_service.updateById(user_id, {
119
- password_hash: new_password_hash,
120
- changed_at: now,
121
- });
122
-
123
- // Send password changed notification email
124
- const email_result = await send_template_email("password_changed", email, {
125
- user_email: email,
126
- user_name: user_name,
127
- });
128
-
129
- if (!email_result.success) {
130
- const logger = create_app_logger();
131
- logger.error("password_change_service_email_failed", {
132
- filename: "password_change_service.ts",
133
- line_number: 0,
134
- user_id,
135
- email,
136
- error: email_result.error,
137
- note: "Password was changed successfully but notification email failed to send",
138
- });
139
- }
140
-
141
- return {
142
- success: true,
143
- };
144
- } catch (error) {
145
- const error_message =
146
- error instanceof Error ? error.message : "Unknown error";
147
-
148
- return {
149
- success: false,
150
- error: error_message,
151
- };
152
- }
153
- }
154
-