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,405 +0,0 @@
1
- // file_description: service for password reset operations using hazo_connect
2
- // section: imports
3
- import type { HazoConnectAdapter } from "hazo_connect";
4
- import { createCrudService } from "hazo_connect/server";
5
- import { create_token } from "hazo_auth/lib/services/token_service";
6
- import argon2 from "argon2";
7
- import { create_app_logger } from "hazo_auth/lib/app_logger";
8
- import { send_template_email } from "hazo_auth/lib/services/email_service";
9
-
10
- // section: types
11
- export type PasswordResetRequestData = {
12
- email: string;
13
- };
14
-
15
- export type PasswordResetRequestResult = {
16
- success: boolean;
17
- error?: string;
18
- };
19
-
20
- export type PasswordResetData = {
21
- token: string;
22
- new_password: string;
23
- minimum_length?: number; // Optional: if not provided, defaults to 8
24
- };
25
-
26
- export type PasswordResetResult = {
27
- success: boolean;
28
- user_id?: string;
29
- email?: string;
30
- error?: string;
31
- };
32
-
33
- export type PasswordResetTokenValidationData = {
34
- token: string;
35
- };
36
-
37
- export type PasswordResetTokenValidationResult = {
38
- success: boolean;
39
- error?: string;
40
- };
41
-
42
- // section: helpers
43
- /**
44
- * Requests a password reset for a user by email
45
- * Generates a secure token, hashes it, and stores it in hazo_refresh_tokens with token_type = 'password_reset'
46
- * Invalidates any existing password reset tokens for the user before creating a new one
47
- * @param adapter - The hazo_connect adapter instance
48
- * @param data - Password reset request data (email)
49
- * @returns Password reset request result with success status or error
50
- */
51
- export async function request_password_reset(
52
- adapter: HazoConnectAdapter,
53
- data: PasswordResetRequestData,
54
- ): Promise<PasswordResetRequestResult> {
55
- try {
56
- const { email } = data;
57
-
58
- // Create CRUD service for hazo_users table
59
- const users_service = createCrudService(adapter, "hazo_users");
60
-
61
- // Find user by email
62
- const users = await users_service.findBy({
63
- email_address: email,
64
- });
65
-
66
- // If user not found, return success anyway (to prevent email enumeration)
67
- if (!Array.isArray(users) || users.length === 0) {
68
- return {
69
- success: true,
70
- };
71
- }
72
-
73
- const user = users[0];
74
- const user_id = user.id as string;
75
-
76
- // Create password reset token using shared token service
77
- const token_result = await create_token({
78
- adapter,
79
- user_id,
80
- token_type: "password_reset",
81
- });
82
-
83
- if (!token_result.success) {
84
- return {
85
- success: false,
86
- error: token_result.error || "Failed to create password reset token",
87
- };
88
- }
89
-
90
- // Send password reset email if token was created successfully
91
- if (token_result.raw_token) {
92
- const email_result = await send_template_email("forgot_password", email, {
93
- token: token_result.raw_token,
94
- user_email: email,
95
- user_name: user.name as string | undefined,
96
- });
97
-
98
- if (!email_result.success) {
99
- const logger = create_app_logger();
100
- logger.error("password_reset_service_email_send_failed", {
101
- filename: "password_reset_service.ts",
102
- line_number: 0,
103
- user_id,
104
- email,
105
- error: email_result.error,
106
- note: "Password reset token created but email failed to send",
107
- });
108
- }
109
- }
110
-
111
- return {
112
- success: true,
113
- };
114
- } catch (error) {
115
- const error_message =
116
- error instanceof Error ? error.message : "Unknown error";
117
-
118
- return {
119
- success: false,
120
- error: error_message,
121
- };
122
- }
123
- }
124
-
125
- /**
126
- * Validates a password reset token without resetting the password
127
- * Verifies the token exists and checks if it has expired
128
- * @param adapter - The hazo_connect adapter instance
129
- * @param data - Token validation data (token)
130
- * @returns Token validation result with success status or error
131
- */
132
- export async function validate_password_reset_token(
133
- adapter: HazoConnectAdapter,
134
- data: PasswordResetTokenValidationData,
135
- ): Promise<PasswordResetTokenValidationResult> {
136
- try {
137
- const { token } = data;
138
-
139
- // Create CRUD service for hazo_refresh_tokens table
140
- const tokens_service = createCrudService(adapter, "hazo_refresh_tokens");
141
-
142
- // Find all password reset tokens
143
- // If token_type column doesn't exist, query all tokens and filter manually
144
- let all_tokens: unknown[] = [];
145
- try {
146
- all_tokens = (await tokens_service.findBy({
147
- token_type: "password_reset",
148
- })) as unknown[];
149
- } catch (error) {
150
- // If token_type column doesn't exist, get all tokens and we'll verify each one
151
- const logger = create_app_logger();
152
- const error_message = error instanceof Error ? error.message : "Unknown error";
153
- logger.warn("password_reset_service_token_type_column_missing", {
154
- filename: "password_reset_service.ts",
155
- line_number: 0,
156
- error: error_message,
157
- note: "token_type column may not exist, querying all tokens",
158
- });
159
- try {
160
- // Query all tokens (will need to verify each one)
161
- all_tokens = (await tokens_service.findBy({})) as unknown[];
162
- } catch (fallbackError) {
163
- const fallback_error_message = fallbackError instanceof Error ? fallbackError.message : "Unknown error";
164
- logger.error("password_reset_service_query_tokens_failed", {
165
- filename: "password_reset_service.ts",
166
- line_number: 0,
167
- error: fallback_error_message,
168
- });
169
- return {
170
- success: false,
171
- error: "Invalid or expired reset token",
172
- };
173
- }
174
- }
175
-
176
- if (!Array.isArray(all_tokens) || all_tokens.length === 0) {
177
- return {
178
- success: false,
179
- error: "Invalid or expired reset token",
180
- };
181
- }
182
-
183
- // Find the matching token by verifying the hash
184
- let matching_token = null;
185
-
186
- for (const stored_token of all_tokens) {
187
- try {
188
- const token_hash = (stored_token as { token_hash: string }).token_hash;
189
- const is_valid = await argon2.verify(token_hash, token);
190
-
191
- if (is_valid) {
192
- matching_token = stored_token;
193
- break;
194
- }
195
- } catch {
196
- // Continue to next token if verification fails
197
- continue;
198
- }
199
- }
200
-
201
- if (!matching_token) {
202
- return {
203
- success: false,
204
- error: "Invalid or expired reset token",
205
- };
206
- }
207
-
208
- // Check if token has expired
209
- const expires_at = new Date((matching_token as { expires_at: string }).expires_at);
210
- const now = new Date();
211
-
212
- if (expires_at < now) {
213
- return {
214
- success: false,
215
- error: "Reset token has expired",
216
- };
217
- }
218
-
219
- return {
220
- success: true,
221
- };
222
- } catch (error) {
223
- const error_message =
224
- error instanceof Error ? error.message : "Unknown error";
225
-
226
- return {
227
- success: false,
228
- error: error_message,
229
- };
230
- }
231
- }
232
-
233
- /**
234
- * Resets a user's password using a password reset token
235
- * Verifies the token, checks expiration, updates password, and deletes the token
236
- * @param adapter - The hazo_connect adapter instance
237
- * @param data - Password reset data (token, new_password)
238
- * @returns Password reset result with success status, user_id, email, or error
239
- */
240
- export async function reset_password(
241
- adapter: HazoConnectAdapter,
242
- data: PasswordResetData,
243
- ): Promise<PasswordResetResult> {
244
- try {
245
- const { token, new_password, minimum_length = 8 } = data;
246
-
247
- // Validate password
248
- if (!new_password || new_password.length < minimum_length) {
249
- return {
250
- success: false,
251
- error: `Password must be at least ${minimum_length} character${minimum_length === 1 ? "" : "s"} long`,
252
- };
253
- }
254
-
255
- // Create CRUD service for hazo_refresh_tokens table
256
- const tokens_service = createCrudService(adapter, "hazo_refresh_tokens");
257
-
258
- // Find all password reset tokens
259
- // If token_type column doesn't exist, query all tokens and filter manually
260
- let all_tokens: unknown[] = [];
261
- try {
262
- all_tokens = (await tokens_service.findBy({
263
- token_type: "password_reset",
264
- })) as unknown[];
265
- } catch (error) {
266
- // If token_type column doesn't exist, get all tokens and we'll verify each one
267
- const logger = create_app_logger();
268
- const error_message = error instanceof Error ? error.message : "Unknown error";
269
- logger.warn("password_reset_service_token_type_column_missing", {
270
- filename: "password_reset_service.ts",
271
- line_number: 0,
272
- error: error_message,
273
- note: "token_type column may not exist, querying all tokens",
274
- });
275
- try {
276
- // Query all tokens (will need to verify each one)
277
- all_tokens = (await tokens_service.findBy({})) as unknown[];
278
- } catch (fallbackError) {
279
- const fallback_error_message = fallbackError instanceof Error ? fallbackError.message : "Unknown error";
280
- logger.error("password_reset_service_query_tokens_failed", {
281
- filename: "password_reset_service.ts",
282
- line_number: 0,
283
- error: fallback_error_message,
284
- });
285
- return {
286
- success: false,
287
- error: "Invalid or expired reset token",
288
- };
289
- }
290
- }
291
-
292
- if (!Array.isArray(all_tokens) || all_tokens.length === 0) {
293
- return {
294
- success: false,
295
- error: "Invalid or expired reset token",
296
- };
297
- }
298
-
299
- // Find the matching token by verifying the hash
300
- let matching_token = null;
301
- let user_id: string | null = null;
302
-
303
- for (const stored_token of all_tokens) {
304
- try {
305
- const token_hash = (stored_token as { token_hash: string }).token_hash;
306
- const is_valid = await argon2.verify(token_hash, token);
307
-
308
- if (is_valid) {
309
- matching_token = stored_token;
310
- user_id = (stored_token as { user_id: string }).user_id;
311
- break;
312
- }
313
- } catch {
314
- // Continue to next token if verification fails
315
- continue;
316
- }
317
- }
318
-
319
- if (!matching_token || !user_id) {
320
- return {
321
- success: false,
322
- error: "Invalid or expired reset token",
323
- };
324
- }
325
-
326
- // Check if token has expired
327
- const expires_at = new Date((matching_token as { expires_at: string }).expires_at);
328
- const now = new Date();
329
-
330
- if (expires_at < now) {
331
- // Delete expired token
332
- await tokens_service.deleteById((matching_token as { id: unknown }).id);
333
-
334
- return {
335
- success: false,
336
- error: "Reset token has expired",
337
- };
338
- }
339
-
340
- // Get user email before updating
341
- const users_service = createCrudService(adapter, "hazo_users");
342
- const users = await users_service.findBy({
343
- id: user_id,
344
- });
345
-
346
- if (!Array.isArray(users) || users.length === 0) {
347
- return {
348
- success: false,
349
- error: "User not found",
350
- };
351
- }
352
-
353
- const user = users[0];
354
- const email = user.email_address as string;
355
-
356
- // Hash the new password
357
- const password_hash = await argon2.hash(new_password);
358
-
359
- // Update user's password
360
- const now_iso = new Date().toISOString();
361
- await users_service.updateById(
362
- user_id,
363
- {
364
- password_hash: password_hash,
365
- changed_at: now_iso,
366
- },
367
- );
368
-
369
- // Delete the used token
370
- await tokens_service.deleteById((matching_token as { id: unknown }).id);
371
-
372
- // Send password changed notification email
373
- const email_result = await send_template_email("password_changed", email, {
374
- user_email: email,
375
- user_name: user.name as string | undefined,
376
- });
377
-
378
- if (!email_result.success) {
379
- const logger = create_app_logger();
380
- logger.error("password_reset_service_password_changed_email_failed", {
381
- filename: "password_reset_service.ts",
382
- line_number: 0,
383
- user_id,
384
- email,
385
- error: email_result.error,
386
- note: "Password was reset successfully but notification email failed to send",
387
- });
388
- }
389
-
390
- return {
391
- success: true,
392
- user_id,
393
- email,
394
- };
395
- } catch (error) {
396
- const error_message =
397
- error instanceof Error ? error.message : "Unknown error";
398
-
399
- return {
400
- success: false,
401
- error: error_message,
402
- };
403
- }
404
- }
405
-
@@ -1,120 +0,0 @@
1
- // file_description: service for removing profile pictures (deleting files and clearing database)
2
- // section: imports
3
- import type { HazoConnectAdapter } from "hazo_connect";
4
- import { createCrudService } from "hazo_connect/server";
5
- import { map_db_source_to_ui } from "hazo_auth/lib/services/profile_picture_source_mapper";
6
- import { get_profile_picture_config } from "hazo_auth/lib/profile_picture_config.server";
7
- import { create_app_logger } from "hazo_auth/lib/app_logger";
8
- import fs from "fs";
9
- import path from "path";
10
-
11
- // section: types
12
- export type RemoveProfilePictureResult = {
13
- success: boolean;
14
- error?: string;
15
- };
16
-
17
- // section: helpers
18
- /**
19
- * Removes user profile picture
20
- * - If source is "upload": deletes the uploaded file and clears profile_picture_url and profile_source
21
- * - If source is "gravatar" or "library": clears profile_picture_url and profile_source
22
- * @param adapter - The hazo_connect adapter instance
23
- * @param user_id - User ID
24
- * @returns Remove result with success status or error
25
- */
26
- export async function remove_user_profile_picture(
27
- adapter: HazoConnectAdapter,
28
- user_id: string,
29
- ): Promise<RemoveProfilePictureResult> {
30
- try {
31
- const users_service = createCrudService(adapter, "hazo_users");
32
-
33
- // Get current user data
34
- const users = await users_service.findBy({
35
- id: user_id,
36
- });
37
-
38
- if (!Array.isArray(users) || users.length === 0) {
39
- return {
40
- success: false,
41
- error: "User not found",
42
- };
43
- }
44
-
45
- const current_user = users[0];
46
- const profile_picture_url = (current_user.profile_picture_url as string) || null;
47
- const profile_source_db = (current_user.profile_source as string) || null;
48
-
49
- if (!profile_picture_url || !profile_source_db) {
50
- // No profile picture to remove
51
- return {
52
- success: true,
53
- };
54
- }
55
-
56
- // Map database source to UI source
57
- const profile_source_ui = map_db_source_to_ui(profile_source_db);
58
-
59
- // If source is "upload", delete the file
60
- if (profile_source_ui === "upload") {
61
- try {
62
- const config = get_profile_picture_config();
63
-
64
- if (config.upload_photo_path) {
65
- // Extract filename from URL (e.g., /api/hazo_auth/profile_picture/user_id.jpg)
66
- const fileName = profile_picture_url.split("/").pop();
67
-
68
- if (fileName && fileName.startsWith(user_id)) {
69
- // Resolve upload path
70
- const uploadPath = path.isAbsolute(config.upload_photo_path)
71
- ? config.upload_photo_path
72
- : path.resolve(process.cwd(), config.upload_photo_path);
73
-
74
- const filePath = path.join(uploadPath, fileName);
75
-
76
- // Delete file if it exists
77
- if (fs.existsSync(filePath)) {
78
- fs.unlinkSync(filePath);
79
- }
80
- }
81
- }
82
- } catch (error) {
83
- // Log error but continue with database update
84
- const logger = create_app_logger();
85
- const error_message = error instanceof Error ? error.message : "Unknown error";
86
- logger.warn("profile_picture_remove_file_delete_failed", {
87
- filename: "profile_picture_remove_service.ts",
88
- line_number: 0,
89
- user_id,
90
- profile_picture_url,
91
- error: error_message,
92
- });
93
- // Don't fail the request if file deletion fails - still clear the database
94
- }
95
- }
96
-
97
- // Clear profile picture URL and source in database
98
- // Note: profile_source has a CHECK constraint, so we'll set it to null
99
- // If the database doesn't allow null, we may need to handle it differently
100
- const update_data: Record<string, unknown> = {
101
- changed_at: new Date().toISOString(),
102
- profile_picture_url: null,
103
- profile_source: null,
104
- };
105
-
106
- await users_service.updateById(user_id, update_data);
107
-
108
- return {
109
- success: true,
110
- };
111
- } catch (error) {
112
- const error_message = error instanceof Error ? error.message : "Unknown error";
113
-
114
- return {
115
- success: false,
116
- error: error_message,
117
- };
118
- }
119
- }
120
-