hazo_auth 1.4.2 → 1.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (354) hide show
  1. package/README.md +65 -19
  2. package/SETUP_CHECKLIST.md +779 -0
  3. package/dist/app/api/hazo_auth/change_password/route.d.ts +8 -0
  4. package/dist/app/api/hazo_auth/change_password/route.d.ts.map +1 -0
  5. package/dist/app/api/hazo_auth/change_password/route.js +98 -0
  6. package/dist/app/api/hazo_auth/forgot_password/route.d.ts +8 -0
  7. package/dist/app/api/hazo_auth/forgot_password/route.d.ts.map +1 -0
  8. package/dist/app/api/hazo_auth/forgot_password/route.js +78 -0
  9. package/dist/app/api/hazo_auth/get_auth/route.d.ts +10 -0
  10. package/dist/app/api/hazo_auth/get_auth/route.d.ts.map +1 -0
  11. package/dist/app/api/hazo_auth/get_auth/route.js +63 -0
  12. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts +14 -0
  13. package/dist/app/api/hazo_auth/invalidate_cache/route.d.ts.map +1 -0
  14. package/dist/app/api/hazo_auth/invalidate_cache/route.js +96 -0
  15. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.d.ts +9 -0
  16. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.d.ts.map +1 -0
  17. package/dist/app/api/hazo_auth/library_photo/[category]/[filename]/route.js +82 -0
  18. package/dist/app/api/hazo_auth/library_photos/route.d.ts +22 -0
  19. package/dist/app/api/hazo_auth/library_photos/route.d.ts.map +1 -0
  20. package/dist/app/api/hazo_auth/library_photos/route.js +80 -0
  21. package/dist/app/api/hazo_auth/login/route.d.ts +12 -0
  22. package/dist/app/api/hazo_auth/login/route.d.ts.map +1 -0
  23. package/dist/app/api/hazo_auth/login/route.js +140 -0
  24. package/dist/app/api/hazo_auth/logout/route.d.ts +8 -0
  25. package/dist/app/api/hazo_auth/logout/route.d.ts.map +1 -0
  26. package/dist/app/api/hazo_auth/logout/route.js +71 -0
  27. package/dist/app/api/hazo_auth/me/route.d.ts +3 -0
  28. package/dist/app/api/hazo_auth/me/route.d.ts.map +1 -0
  29. package/dist/app/api/hazo_auth/me/route.js +34 -0
  30. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts +7 -0
  31. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.d.ts.map +1 -0
  32. package/dist/app/api/hazo_auth/profile_picture/[filename]/route.js +43 -0
  33. package/dist/app/api/hazo_auth/register/route.d.ts +9 -0
  34. package/dist/app/api/hazo_auth/register/route.d.ts.map +1 -0
  35. package/dist/app/api/hazo_auth/register/route.js +80 -0
  36. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts +8 -0
  37. package/dist/app/api/hazo_auth/remove_profile_picture/route.d.ts.map +1 -0
  38. package/dist/app/api/hazo_auth/remove_profile_picture/route.js +64 -0
  39. package/dist/app/api/hazo_auth/resend_verification/route.d.ts +8 -0
  40. package/dist/app/api/hazo_auth/resend_verification/route.d.ts.map +1 -0
  41. package/dist/app/api/hazo_auth/resend_verification/route.js +79 -0
  42. package/dist/app/api/hazo_auth/reset_password/route.d.ts +8 -0
  43. package/dist/app/api/hazo_auth/reset_password/route.d.ts.map +1 -0
  44. package/dist/app/api/hazo_auth/reset_password/route.js +76 -0
  45. package/dist/app/api/hazo_auth/update_user/route.d.ts +9 -0
  46. package/dist/app/api/hazo_auth/update_user/route.d.ts.map +1 -0
  47. package/dist/app/api/hazo_auth/update_user/route.js +95 -0
  48. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts +9 -0
  49. package/dist/app/api/hazo_auth/upload_profile_picture/route.d.ts.map +1 -0
  50. package/dist/app/api/hazo_auth/upload_profile_picture/route.js +204 -0
  51. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts +6 -0
  52. package/dist/app/api/hazo_auth/validate_reset_token/route.d.ts.map +1 -0
  53. package/dist/app/api/hazo_auth/validate_reset_token/route.js +58 -0
  54. package/dist/app/api/hazo_auth/verify_email/route.d.ts +11 -0
  55. package/dist/app/api/hazo_auth/verify_email/route.d.ts.map +1 -0
  56. package/dist/app/api/hazo_auth/verify_email/route.js +63 -0
  57. package/dist/cli/generate.d.ts +7 -0
  58. package/dist/cli/generate.d.ts.map +1 -0
  59. package/dist/cli/generate.js +184 -0
  60. package/dist/cli/index.d.ts +3 -0
  61. package/dist/cli/index.d.ts.map +1 -0
  62. package/dist/cli/index.js +173 -0
  63. package/dist/cli/init.d.ts +2 -0
  64. package/dist/cli/init.d.ts.map +1 -0
  65. package/dist/cli/init.js +201 -0
  66. package/dist/cli/validate.d.ts +15 -0
  67. package/dist/cli/validate.d.ts.map +1 -0
  68. package/dist/cli/validate.js +509 -0
  69. package/dist/components/ui/card.d.ts +9 -0
  70. package/dist/components/ui/card.d.ts.map +1 -0
  71. package/dist/components/ui/card.js +45 -0
  72. package/dist/hooks/use-mobile.d.ts.map +1 -1
  73. package/dist/hooks/use-mobile.js +17 -3
  74. package/dist/lib/services/profile_picture_service.d.ts +34 -2
  75. package/dist/lib/services/profile_picture_service.d.ts.map +1 -1
  76. package/dist/lib/services/profile_picture_service.js +157 -15
  77. package/dist/page_components/forgot_password.d.ts +19 -0
  78. package/dist/page_components/forgot_password.d.ts.map +1 -0
  79. package/dist/page_components/forgot_password.js +36 -0
  80. package/dist/page_components/index.d.ts +7 -0
  81. package/dist/page_components/index.d.ts.map +1 -0
  82. package/dist/page_components/index.js +9 -0
  83. package/dist/page_components/login.d.ts +26 -0
  84. package/dist/page_components/login.d.ts.map +1 -0
  85. package/dist/page_components/login.js +40 -0
  86. package/dist/page_components/my_settings.d.ts +64 -0
  87. package/dist/page_components/my_settings.d.ts.map +1 -0
  88. package/dist/page_components/my_settings.js +67 -0
  89. package/dist/page_components/register.d.ts +25 -0
  90. package/dist/page_components/register.d.ts.map +1 -0
  91. package/dist/page_components/register.js +43 -0
  92. package/dist/page_components/reset_password.d.ts +25 -0
  93. package/dist/page_components/reset_password.d.ts.map +1 -0
  94. package/dist/page_components/reset_password.js +43 -0
  95. package/dist/page_components/verify_email.d.ts +21 -0
  96. package/dist/page_components/verify_email.d.ts.map +1 -0
  97. package/dist/page_components/verify_email.js +36 -0
  98. package/dist/server/routes/change_password.d.ts +2 -0
  99. package/dist/server/routes/change_password.d.ts.map +1 -0
  100. package/dist/server/routes/change_password.js +2 -0
  101. package/dist/server/routes/forgot_password.d.ts +2 -0
  102. package/dist/server/routes/forgot_password.d.ts.map +1 -0
  103. package/dist/server/routes/forgot_password.js +2 -0
  104. package/dist/server/routes/get_auth.d.ts +2 -0
  105. package/dist/server/routes/get_auth.d.ts.map +1 -0
  106. package/dist/server/routes/get_auth.js +2 -0
  107. package/dist/server/routes/index.d.ts +19 -0
  108. package/dist/server/routes/index.d.ts.map +1 -0
  109. package/dist/server/routes/index.js +25 -0
  110. package/dist/server/routes/invalidate_cache.d.ts +2 -0
  111. package/dist/server/routes/invalidate_cache.d.ts.map +1 -0
  112. package/dist/server/routes/invalidate_cache.js +2 -0
  113. package/dist/server/routes/library_photo.d.ts +2 -0
  114. package/dist/server/routes/library_photo.d.ts.map +1 -0
  115. package/dist/server/routes/library_photo.js +3 -0
  116. package/dist/server/routes/library_photos.d.ts +2 -0
  117. package/dist/server/routes/library_photos.d.ts.map +1 -0
  118. package/dist/server/routes/library_photos.js +2 -0
  119. package/dist/server/routes/login.d.ts +2 -0
  120. package/dist/server/routes/login.d.ts.map +1 -0
  121. package/dist/server/routes/login.js +2 -0
  122. package/dist/server/routes/logout.d.ts +2 -0
  123. package/dist/server/routes/logout.d.ts.map +1 -0
  124. package/dist/server/routes/logout.js +2 -0
  125. package/dist/server/routes/me.d.ts +2 -0
  126. package/dist/server/routes/me.d.ts.map +1 -0
  127. package/dist/server/routes/me.js +2 -0
  128. package/dist/server/routes/profile_picture_filename.d.ts +2 -0
  129. package/dist/server/routes/profile_picture_filename.d.ts.map +1 -0
  130. package/dist/server/routes/profile_picture_filename.js +3 -0
  131. package/dist/server/routes/register.d.ts +2 -0
  132. package/dist/server/routes/register.d.ts.map +1 -0
  133. package/dist/server/routes/register.js +2 -0
  134. package/dist/server/routes/remove_profile_picture.d.ts +2 -0
  135. package/dist/server/routes/remove_profile_picture.d.ts.map +1 -0
  136. package/dist/server/routes/remove_profile_picture.js +2 -0
  137. package/dist/server/routes/resend_verification.d.ts +2 -0
  138. package/dist/server/routes/resend_verification.d.ts.map +1 -0
  139. package/dist/server/routes/resend_verification.js +2 -0
  140. package/dist/server/routes/reset_password.d.ts +2 -0
  141. package/dist/server/routes/reset_password.d.ts.map +1 -0
  142. package/dist/server/routes/reset_password.js +2 -0
  143. package/dist/server/routes/update_user.d.ts +2 -0
  144. package/dist/server/routes/update_user.d.ts.map +1 -0
  145. package/dist/server/routes/update_user.js +2 -0
  146. package/dist/server/routes/upload_profile_picture.d.ts +2 -0
  147. package/dist/server/routes/upload_profile_picture.d.ts.map +1 -0
  148. package/dist/server/routes/upload_profile_picture.js +2 -0
  149. package/dist/server/routes/validate_reset_token.d.ts +2 -0
  150. package/dist/server/routes/validate_reset_token.d.ts.map +1 -0
  151. package/dist/server/routes/validate_reset_token.js +2 -0
  152. package/dist/server/routes/verify_email.d.ts +2 -0
  153. package/dist/server/routes/verify_email.d.ts.map +1 -0
  154. package/dist/server/routes/verify_email.js +2 -0
  155. package/package.json +40 -17
  156. package/components.json +0 -22
  157. package/instrumentation.ts +0 -32
  158. package/migrations/001_add_token_type_to_refresh_tokens.sql +0 -14
  159. package/migrations/002_add_name_to_hazo_users.sql +0 -7
  160. package/migrations/003_add_url_on_logon_to_hazo_users.sql +0 -8
  161. package/next.config.mjs +0 -67
  162. package/postcss.config.mjs +0 -8
  163. package/public/file.svg +0 -1
  164. package/public/globe.svg +0 -1
  165. package/public/next.svg +0 -1
  166. package/public/vercel.svg +0 -1
  167. package/public/window.svg +0 -1
  168. package/scripts/apply_migration.ts +0 -118
  169. package/scripts/init_users.ts +0 -378
  170. package/src/app/api/hazo_auth/auth/upload_profile_picture/route.ts +0 -268
  171. package/src/app/api/hazo_auth/change_password/route.ts +0 -132
  172. package/src/app/api/hazo_auth/forgot_password/route.ts +0 -107
  173. package/src/app/api/hazo_auth/get_auth/route.ts +0 -89
  174. package/src/app/api/hazo_auth/invalidate_cache/route.ts +0 -139
  175. package/src/app/api/hazo_auth/library_photos/route.ts +0 -73
  176. package/src/app/api/hazo_auth/login/route.ts +0 -181
  177. package/src/app/api/hazo_auth/logout/route.ts +0 -89
  178. package/src/app/api/hazo_auth/me/route.ts +0 -47
  179. package/src/app/api/hazo_auth/profile_picture/[filename]/route.ts +0 -67
  180. package/src/app/api/hazo_auth/register/route.ts +0 -109
  181. package/src/app/api/hazo_auth/remove_profile_picture/route.ts +0 -86
  182. package/src/app/api/hazo_auth/resend_verification/route.ts +0 -108
  183. package/src/app/api/hazo_auth/reset_password/route.ts +0 -107
  184. package/src/app/api/hazo_auth/update_user/route.ts +0 -126
  185. package/src/app/api/hazo_auth/upload_profile_picture/route.ts +0 -268
  186. package/src/app/api/hazo_auth/user_management/permissions/route.ts +0 -367
  187. package/src/app/api/hazo_auth/user_management/roles/route.ts +0 -442
  188. package/src/app/api/hazo_auth/user_management/users/roles/route.ts +0 -367
  189. package/src/app/api/hazo_auth/user_management/users/route.ts +0 -239
  190. package/src/app/api/hazo_auth/validate_reset_token/route.ts +0 -83
  191. package/src/app/api/hazo_auth/verify_email/route.ts +0 -88
  192. package/src/app/api/migrations/apply/route.ts +0 -91
  193. package/src/app/favicon.ico +0 -0
  194. package/src/app/fonts/GeistMonoVF.woff +0 -0
  195. package/src/app/fonts/GeistVF.woff +0 -0
  196. package/src/app/globals.css +0 -89
  197. package/src/app/hazo_auth/forgot_password/forgot_password_page_client.tsx +0 -60
  198. package/src/app/hazo_auth/forgot_password/page.tsx +0 -24
  199. package/src/app/hazo_auth/login/login_page_client.tsx +0 -86
  200. package/src/app/hazo_auth/login/page.tsx +0 -38
  201. package/src/app/hazo_auth/my_settings/my_settings_page_client.tsx +0 -120
  202. package/src/app/hazo_auth/my_settings/page.tsx +0 -40
  203. package/src/app/hazo_auth/register/page.tsx +0 -36
  204. package/src/app/hazo_auth/register/register_page_client.tsx +0 -81
  205. package/src/app/hazo_auth/reset_password/page.tsx +0 -29
  206. package/src/app/hazo_auth/reset_password/reset_password_page_client.tsx +0 -81
  207. package/src/app/hazo_auth/user_management/page.tsx +0 -14
  208. package/src/app/hazo_auth/user_management/user_management_page_client.tsx +0 -16
  209. package/src/app/hazo_auth/verify_email/page.tsx +0 -24
  210. package/src/app/hazo_auth/verify_email/verify_email_page_client.tsx +0 -60
  211. package/src/app/hazo_connect/api/sqlite/data/route.ts +0 -203
  212. package/src/app/hazo_connect/api/sqlite/schema/route.ts +0 -45
  213. package/src/app/hazo_connect/api/sqlite/tables/route.ts +0 -36
  214. package/src/app/hazo_connect/sqlite_admin/page.tsx +0 -51
  215. package/src/app/hazo_connect/sqlite_admin/sqlite-admin-client.tsx +0 -984
  216. package/src/app/layout.tsx +0 -43
  217. package/src/app/page.tsx +0 -170
  218. package/src/components/index.ts +0 -7
  219. package/src/components/layouts/email_verification/config/email_verification_field_config.ts +0 -86
  220. package/src/components/layouts/email_verification/hooks/use_email_verification.ts +0 -297
  221. package/src/components/layouts/email_verification/index.tsx +0 -297
  222. package/src/components/layouts/forgot_password/config/forgot_password_field_config.ts +0 -58
  223. package/src/components/layouts/forgot_password/hooks/use_forgot_password_form.ts +0 -179
  224. package/src/components/layouts/forgot_password/index.tsx +0 -168
  225. package/src/components/layouts/index.ts +0 -26
  226. package/src/components/layouts/login/config/login_field_config.ts +0 -67
  227. package/src/components/layouts/login/hooks/use_login_form.ts +0 -286
  228. package/src/components/layouts/login/index.tsx +0 -252
  229. package/src/components/layouts/my_settings/components/editable_field.tsx +0 -177
  230. package/src/components/layouts/my_settings/components/password_change_dialog.tsx +0 -301
  231. package/src/components/layouts/my_settings/components/profile_picture_dialog.tsx +0 -385
  232. package/src/components/layouts/my_settings/components/profile_picture_display.tsx +0 -66
  233. package/src/components/layouts/my_settings/components/profile_picture_gravatar_tab.tsx +0 -143
  234. package/src/components/layouts/my_settings/components/profile_picture_library_tab.tsx +0 -311
  235. package/src/components/layouts/my_settings/components/profile_picture_upload_tab.tsx +0 -341
  236. package/src/components/layouts/my_settings/config/my_settings_field_config.ts +0 -61
  237. package/src/components/layouts/my_settings/hooks/use_my_settings.ts +0 -458
  238. package/src/components/layouts/my_settings/index.tsx +0 -351
  239. package/src/components/layouts/register/config/register_field_config.ts +0 -101
  240. package/src/components/layouts/register/hooks/use_register_form.ts +0 -275
  241. package/src/components/layouts/register/index.tsx +0 -226
  242. package/src/components/layouts/reset_password/config/reset_password_field_config.ts +0 -86
  243. package/src/components/layouts/reset_password/hooks/use_reset_password_form.ts +0 -276
  244. package/src/components/layouts/reset_password/index.tsx +0 -294
  245. package/src/components/layouts/shared/components/already_logged_in_guard.tsx +0 -95
  246. package/src/components/layouts/shared/components/auth_page_shell.tsx +0 -36
  247. package/src/components/layouts/shared/components/field_error_message.tsx +0 -29
  248. package/src/components/layouts/shared/components/form_action_buttons.tsx +0 -64
  249. package/src/components/layouts/shared/components/form_field_wrapper.tsx +0 -44
  250. package/src/components/layouts/shared/components/form_header.tsx +0 -36
  251. package/src/components/layouts/shared/components/logout_button.tsx +0 -76
  252. package/src/components/layouts/shared/components/password_field.tsx +0 -72
  253. package/src/components/layouts/shared/components/profile_pic_menu.tsx +0 -321
  254. package/src/components/layouts/shared/components/profile_pic_menu_wrapper.tsx +0 -40
  255. package/src/components/layouts/shared/components/sidebar_layout_wrapper.tsx +0 -214
  256. package/src/components/layouts/shared/components/standalone_layout_wrapper.tsx +0 -53
  257. package/src/components/layouts/shared/components/two_column_auth_layout.tsx +0 -44
  258. package/src/components/layouts/shared/components/unauthorized_guard.tsx +0 -78
  259. package/src/components/layouts/shared/components/visual_panel.tsx +0 -41
  260. package/src/components/layouts/shared/config/layout_customization.ts +0 -95
  261. package/src/components/layouts/shared/data/layout_data_client.ts +0 -19
  262. package/src/components/layouts/shared/hooks/use_auth_status.ts +0 -103
  263. package/src/components/layouts/shared/hooks/use_hazo_auth.ts +0 -158
  264. package/src/components/layouts/shared/index.ts +0 -34
  265. package/src/components/layouts/shared/utils/ip_address.ts +0 -37
  266. package/src/components/layouts/shared/utils/validation.ts +0 -66
  267. package/src/components/layouts/user_management/components/roles_matrix.tsx +0 -607
  268. package/src/components/layouts/user_management/index.tsx +0 -1295
  269. package/src/components/ui/alert-dialog.tsx +0 -141
  270. package/src/components/ui/avatar.tsx +0 -50
  271. package/src/components/ui/button.tsx +0 -57
  272. package/src/components/ui/checkbox.tsx +0 -30
  273. package/src/components/ui/dialog.tsx +0 -122
  274. package/src/components/ui/dropdown-menu.tsx +0 -201
  275. package/src/components/ui/hazo_ui_tooltip.tsx +0 -67
  276. package/src/components/ui/index.ts +0 -22
  277. package/src/components/ui/input.tsx +0 -22
  278. package/src/components/ui/label.tsx +0 -26
  279. package/src/components/ui/separator.tsx +0 -31
  280. package/src/components/ui/sheet.tsx +0 -139
  281. package/src/components/ui/sidebar.tsx +0 -773
  282. package/src/components/ui/skeleton.tsx +0 -15
  283. package/src/components/ui/sonner.tsx +0 -31
  284. package/src/components/ui/switch.tsx +0 -29
  285. package/src/components/ui/table.tsx +0 -120
  286. package/src/components/ui/tabs.tsx +0 -55
  287. package/src/components/ui/tooltip.tsx +0 -32
  288. package/src/components/ui/vertical-tabs.tsx +0 -59
  289. package/src/hooks/use-mobile.tsx +0 -19
  290. package/src/index.ts +0 -7
  291. package/src/lib/already_logged_in_config.server.ts +0 -46
  292. package/src/lib/app_logger.ts +0 -24
  293. package/src/lib/auth/auth_cache.ts +0 -220
  294. package/src/lib/auth/auth_rate_limiter.ts +0 -121
  295. package/src/lib/auth/auth_types.ts +0 -65
  296. package/src/lib/auth/auth_utils.server.ts +0 -196
  297. package/src/lib/auth/hazo_get_auth.server.ts +0 -333
  298. package/src/lib/auth/index.ts +0 -23
  299. package/src/lib/auth/server_auth.ts +0 -88
  300. package/src/lib/auth_utility_config.server.ts +0 -136
  301. package/src/lib/config/config_loader.server.ts +0 -164
  302. package/src/lib/email_verification_config.server.ts +0 -32
  303. package/src/lib/file_types_config.server.ts +0 -25
  304. package/src/lib/forgot_password_config.server.ts +0 -32
  305. package/src/lib/hazo_connect_instance.server.ts +0 -101
  306. package/src/lib/hazo_connect_setup.server.ts +0 -194
  307. package/src/lib/hazo_connect_setup.ts +0 -54
  308. package/src/lib/index.ts +0 -44
  309. package/src/lib/login_config.server.ts +0 -71
  310. package/src/lib/messages_config.server.ts +0 -45
  311. package/src/lib/migrations/apply_migration.ts +0 -105
  312. package/src/lib/my_settings_config.server.ts +0 -135
  313. package/src/lib/password_requirements_config.server.ts +0 -39
  314. package/src/lib/profile_pic_menu_config.server.ts +0 -138
  315. package/src/lib/profile_picture_config.server.ts +0 -56
  316. package/src/lib/register_config.server.ts +0 -73
  317. package/src/lib/reset_password_config.server.ts +0 -75
  318. package/src/lib/services/email_service.ts +0 -581
  319. package/src/lib/services/email_verification_service.ts +0 -270
  320. package/src/lib/services/index.ts +0 -15
  321. package/src/lib/services/login_service.ts +0 -134
  322. package/src/lib/services/password_change_service.ts +0 -154
  323. package/src/lib/services/password_reset_service.ts +0 -405
  324. package/src/lib/services/profile_picture_remove_service.ts +0 -120
  325. package/src/lib/services/profile_picture_service.ts +0 -215
  326. package/src/lib/services/profile_picture_source_mapper.ts +0 -62
  327. package/src/lib/services/registration_service.ts +0 -184
  328. package/src/lib/services/token_service.ts +0 -240
  329. package/src/lib/services/user_profiles_service.ts +0 -143
  330. package/src/lib/services/user_update_service.ts +0 -141
  331. package/src/lib/ui_shell_config.server.ts +0 -73
  332. package/src/lib/ui_sizes_config.server.ts +0 -37
  333. package/src/lib/user_fields_config.server.ts +0 -31
  334. package/src/lib/user_management_config.server.ts +0 -39
  335. package/src/lib/utils/api_route_helpers.ts +0 -60
  336. package/src/lib/utils/error_sanitizer.ts +0 -75
  337. package/src/lib/utils.ts +0 -11
  338. package/src/middleware.ts +0 -94
  339. package/src/routes/index.ts +0 -34
  340. package/src/server/config/config_loader.ts +0 -496
  341. package/src/server/index.ts +0 -38
  342. package/src/server/logging/logger_service.ts +0 -56
  343. package/src/server/routes/root_router.ts +0 -16
  344. package/src/server/server.ts +0 -28
  345. package/src/server/types/app_types.ts +0 -74
  346. package/src/server/types/express.d.ts +0 -16
  347. package/src/stories/email_verification_layout.stories.tsx +0 -137
  348. package/src/stories/forgot_password_layout.stories.tsx +0 -85
  349. package/src/stories/login_layout.stories.tsx +0 -85
  350. package/src/stories/project_overview.stories.tsx +0 -33
  351. package/src/stories/register_layout.stories.tsx +0 -107
  352. package/tailwind.config.ts +0 -77
  353. package/tsconfig.build.json +0 -36
  354. package/tsconfig.json +0 -28
@@ -0,0 +1,140 @@
1
+ // file_description: API route for user login authentication using hazo_connect
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
5
+ import { create_app_logger } from "../../../../lib/app_logger";
6
+ import { authenticate_user } from "../../../../lib/services/login_service";
7
+ import { createCrudService } from "hazo_connect/server";
8
+ import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
9
+ import { get_login_config } from "../../../../lib/login_config.server";
10
+ // section: api_handler
11
+ export async function POST(request) {
12
+ const logger = create_app_logger();
13
+ try {
14
+ const body = await request.json();
15
+ const { email, password, url_on_logon } = body;
16
+ // Validate input
17
+ if (!email || !password) {
18
+ logger.warn("login_validation_failed", {
19
+ filename: get_filename(),
20
+ line_number: get_line_number(),
21
+ email: email || "missing",
22
+ has_password: !!password,
23
+ });
24
+ return NextResponse.json({ error: "Email and password are required" }, { status: 400 });
25
+ }
26
+ // Validate email format
27
+ const email_pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
28
+ if (!email_pattern.test(email)) {
29
+ logger.warn("login_invalid_email", {
30
+ filename: get_filename(),
31
+ line_number: get_line_number(),
32
+ email,
33
+ });
34
+ return NextResponse.json({ error: "Invalid email address format" }, { status: 400 });
35
+ }
36
+ // Get singleton hazo_connect instance (reuses same connection across all routes)
37
+ const hazoConnect = get_hazo_connect_instance();
38
+ // Authenticate user using the login service
39
+ const result = await authenticate_user(hazoConnect, {
40
+ email,
41
+ password,
42
+ });
43
+ if (!result.success) {
44
+ const status_code = result.error === "Invalid email or password" ? 401 : 500;
45
+ logger.warn("login_failed", {
46
+ filename: get_filename(),
47
+ line_number: get_line_number(),
48
+ email,
49
+ error: result.error,
50
+ email_not_verified: result.email_not_verified || false,
51
+ });
52
+ return NextResponse.json({
53
+ error: result.error || "Login failed",
54
+ email_not_verified: result.email_not_verified || false,
55
+ }, { status: status_code });
56
+ }
57
+ // TypeScript assertion: user_id is guaranteed to be present when success is true
58
+ // However, we need to check it to satisfy TypeScript's type checking
59
+ if (!result.user_id) {
60
+ logger.error("login_user_id_missing", {
61
+ filename: get_filename(),
62
+ line_number: get_line_number(),
63
+ email,
64
+ note: "Login succeeded but user_id is missing - this should not happen",
65
+ });
66
+ return NextResponse.json({ error: "Login failed - user ID not found" }, { status: 500 });
67
+ }
68
+ const user_id = result.user_id;
69
+ logger.info("login_successful", {
70
+ filename: get_filename(),
71
+ line_number: get_line_number(),
72
+ user_id: user_id,
73
+ email,
74
+ });
75
+ // Reuse the existing hazoConnect instance from above
76
+ const users_service = createCrudService(hazoConnect, "hazo_users");
77
+ const users = await users_service.findBy({
78
+ id: user_id,
79
+ });
80
+ const user = users && users.length > 0 ? users[0] : null;
81
+ const user_name = user === null || user === void 0 ? void 0 : user.name;
82
+ // Determine redirect URL priority:
83
+ // 1. url_on_logon from request body (if valid)
84
+ // 2. stored_url_on_logon from database (if available)
85
+ // 3. redirect_route_on_successful_login from config
86
+ // 4. Default to "/"
87
+ let redirectUrl = "/";
88
+ // Check priority 1: Request body
89
+ if (url_on_logon && typeof url_on_logon === "string" && url_on_logon.startsWith("/") && !url_on_logon.startsWith("//")) {
90
+ redirectUrl = url_on_logon;
91
+ }
92
+ // Check priority 2: Stored URL from DB
93
+ else if (result.stored_url_on_logon && typeof result.stored_url_on_logon === "string") {
94
+ redirectUrl = result.stored_url_on_logon;
95
+ }
96
+ // Check priority 3: Config
97
+ else {
98
+ const loginConfig = get_login_config();
99
+ if (loginConfig.redirectRoute) {
100
+ redirectUrl = loginConfig.redirectRoute;
101
+ }
102
+ }
103
+ // Create response with cookies
104
+ const response = NextResponse.json({
105
+ success: true,
106
+ message: "Login successful",
107
+ user_id: user_id,
108
+ email,
109
+ name: user_name,
110
+ redirectUrl,
111
+ }, { status: 200 });
112
+ // Set authentication cookies
113
+ response.cookies.set("hazo_auth_user_id", user_id, {
114
+ httpOnly: true,
115
+ secure: process.env.NODE_ENV === "production",
116
+ sameSite: "lax",
117
+ path: "/",
118
+ maxAge: 60 * 60 * 24 * 30, // 30 days
119
+ });
120
+ response.cookies.set("hazo_auth_user_email", email, {
121
+ httpOnly: true,
122
+ secure: process.env.NODE_ENV === "production",
123
+ sameSite: "lax",
124
+ path: "/",
125
+ maxAge: 60 * 60 * 24 * 30, // 30 days
126
+ });
127
+ return response;
128
+ }
129
+ catch (error) {
130
+ const error_message = error instanceof Error ? error.message : "Unknown error";
131
+ const error_stack = error instanceof Error ? error.stack : undefined;
132
+ logger.error("login_error", {
133
+ filename: get_filename(),
134
+ line_number: get_line_number(),
135
+ error_message,
136
+ error_stack,
137
+ });
138
+ return NextResponse.json({ error: "Login failed. Please try again." }, { status: 500 });
139
+ }
140
+ }
@@ -0,0 +1,8 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
3
+ success: boolean;
4
+ message: string;
5
+ }> | NextResponse<{
6
+ error: string;
7
+ }>>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/logout/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IA8E9C"}
@@ -0,0 +1,71 @@
1
+ // file_description: API route for user logout
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { create_app_logger } from "../../../../lib/app_logger";
5
+ import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
6
+ import { get_auth_cache } from "../../../../lib/auth/auth_cache";
7
+ import { get_auth_utility_config } from "../../../../lib/auth_utility_config.server";
8
+ // section: api_handler
9
+ export async function POST(request) {
10
+ var _a, _b;
11
+ const logger = create_app_logger();
12
+ try {
13
+ // Get user info from cookie before clearing
14
+ const user_email = (_a = request.cookies.get("hazo_auth_user_email")) === null || _a === void 0 ? void 0 : _a.value;
15
+ const user_id = (_b = request.cookies.get("hazo_auth_user_id")) === null || _b === void 0 ? void 0 : _b.value;
16
+ // Clear authentication cookies
17
+ const response = NextResponse.json({
18
+ success: true,
19
+ message: "Logout successful",
20
+ }, { status: 200 });
21
+ // Clear cookies by setting them to expire in the past
22
+ response.cookies.set("hazo_auth_user_email", "", {
23
+ expires: new Date(0),
24
+ path: "/",
25
+ });
26
+ response.cookies.set("hazo_auth_user_id", "", {
27
+ expires: new Date(0),
28
+ path: "/",
29
+ });
30
+ // Invalidate user cache
31
+ if (user_id) {
32
+ try {
33
+ const config = get_auth_utility_config();
34
+ const cache = get_auth_cache(config.cache_max_users, config.cache_ttl_minutes, config.cache_max_age_minutes);
35
+ cache.invalidate_user(user_id);
36
+ }
37
+ catch (cache_error) {
38
+ // Log but don't fail logout if cache invalidation fails
39
+ const cache_error_message = cache_error instanceof Error
40
+ ? cache_error.message
41
+ : "Unknown error";
42
+ logger.warn("logout_cache_invalidation_failed", {
43
+ filename: get_filename(),
44
+ line_number: get_line_number(),
45
+ user_id,
46
+ error: cache_error_message,
47
+ });
48
+ }
49
+ }
50
+ if (user_email || user_id) {
51
+ logger.info("logout_successful", {
52
+ filename: get_filename(),
53
+ line_number: get_line_number(),
54
+ user_id: user_id || "unknown",
55
+ email: user_email || "unknown",
56
+ });
57
+ }
58
+ return response;
59
+ }
60
+ catch (error) {
61
+ const error_message = error instanceof Error ? error.message : "Unknown error";
62
+ const error_stack = error instanceof Error ? error.stack : undefined;
63
+ logger.error("logout_error", {
64
+ filename: get_filename(),
65
+ line_number: get_line_number(),
66
+ error_message,
67
+ error_stack,
68
+ });
69
+ return NextResponse.json({ error: "Logout failed. Please try again." }, { status: 500 });
70
+ }
71
+ }
@@ -0,0 +1,3 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function GET(request: NextRequest): Promise<NextResponse<unknown>>;
3
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/me/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAIxD,wBAAsB,GAAG,CAAC,OAAO,EAAE,WAAW,kCAuC7C"}
@@ -0,0 +1,34 @@
1
+ // file_description: API route to get current authenticated user information
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_authenticated_user_with_response } from "../../../../lib/auth/auth_utils.server";
5
+ // section: api_handler
6
+ export async function GET(request) {
7
+ try {
8
+ // Use centralized auth utility
9
+ const { auth_result, response } = await get_authenticated_user_with_response(request);
10
+ // If response is provided, it means cookies were cleared (invalid auth)
11
+ if (response) {
12
+ return response;
13
+ }
14
+ // If not authenticated, return false
15
+ if (!auth_result.authenticated) {
16
+ return NextResponse.json({ authenticated: false }, { status: 200 });
17
+ }
18
+ // Return user info
19
+ return NextResponse.json({
20
+ authenticated: true,
21
+ user_id: auth_result.user_id,
22
+ email: auth_result.email,
23
+ name: auth_result.name,
24
+ email_verified: auth_result.email_verified,
25
+ last_logon: auth_result.last_logon,
26
+ profile_picture_url: auth_result.profile_picture_url,
27
+ profile_source: auth_result.profile_source,
28
+ }, { status: 200 });
29
+ }
30
+ catch (error) {
31
+ // On error, assume not authenticated
32
+ return NextResponse.json({ authenticated: false }, { status: 200 });
33
+ }
34
+ }
@@ -0,0 +1,7 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function GET(request: NextRequest, { params }: {
3
+ params: {
4
+ filename: string;
5
+ };
6
+ }): Promise<NextResponse<unknown>>;
7
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../../src/app/api/hazo_auth/profile_picture/[filename]/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAMxD,wBAAsB,GAAG,CACvB,OAAO,EAAE,WAAW,EACpB,EAAE,MAAM,EAAE,EAAE;IAAE,MAAM,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAA;CAAE,kCAuD7C"}
@@ -0,0 +1,43 @@
1
+ // file_description: API route to serve uploaded profile pictures
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_profile_picture_config } from "../../../../../lib/profile_picture_config.server";
5
+ import fs from "fs";
6
+ import path from "path";
7
+ // section: api_handler
8
+ export async function GET(request, { params }) {
9
+ try {
10
+ const config = get_profile_picture_config();
11
+ if (!config.allow_photo_upload || !config.upload_photo_path) {
12
+ return NextResponse.json({ error: "Profile picture upload is not enabled" }, { status: 404 });
13
+ }
14
+ const filename = params.filename;
15
+ // Validate filename (prevent path traversal)
16
+ if (filename.includes("..") || filename.includes("/") || filename.includes("\\")) {
17
+ return NextResponse.json({ error: "Invalid filename" }, { status: 400 });
18
+ }
19
+ // Resolve upload path
20
+ const uploadPath = path.isAbsolute(config.upload_photo_path)
21
+ ? config.upload_photo_path
22
+ : path.resolve(process.cwd(), config.upload_photo_path);
23
+ const filePath = path.join(uploadPath, filename);
24
+ // Check if file exists
25
+ if (!fs.existsSync(filePath)) {
26
+ return NextResponse.json({ error: "File not found" }, { status: 404 });
27
+ }
28
+ // Read file
29
+ const fileBuffer = fs.readFileSync(filePath);
30
+ const fileExt = path.extname(filename).toLowerCase();
31
+ const contentType = fileExt === ".png" ? "image/png" : "image/jpeg";
32
+ // Return file with appropriate content type
33
+ return new NextResponse(fileBuffer, {
34
+ headers: {
35
+ "Content-Type": contentType,
36
+ "Cache-Control": "public, max-age=31536000, immutable",
37
+ },
38
+ });
39
+ }
40
+ catch (error) {
41
+ return NextResponse.json({ error: "Failed to serve profile picture" }, { status: 500 });
42
+ }
43
+ }
@@ -0,0 +1,9 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
3
+ error: string;
4
+ }> | NextResponse<{
5
+ success: boolean;
6
+ message: string;
7
+ user_id: string | undefined;
8
+ }>>;
9
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/register/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;;IAiG9C"}
@@ -0,0 +1,80 @@
1
+ // file_description: API route for user registration using hazo_connect to insert into hazo_users table
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
5
+ import { create_app_logger } from "../../../../lib/app_logger";
6
+ import { register_user } from "../../../../lib/services/registration_service";
7
+ import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
8
+ import { sanitize_error_for_user } from "../../../../lib/utils/error_sanitizer";
9
+ // section: api_handler
10
+ export async function POST(request) {
11
+ const logger = create_app_logger();
12
+ try {
13
+ const body = await request.json();
14
+ const { name, email, password, url_on_logon } = body;
15
+ // Validate input
16
+ if (!email || !password) {
17
+ logger.warn("registration_validation_failed", {
18
+ filename: get_filename(),
19
+ line_number: get_line_number(),
20
+ email: email || "missing",
21
+ has_password: !!password,
22
+ });
23
+ return NextResponse.json({ error: "Email and password are required" }, { status: 400 });
24
+ }
25
+ // Validate email format
26
+ const email_pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
27
+ if (!email_pattern.test(email)) {
28
+ logger.warn("registration_invalid_email", {
29
+ filename: get_filename(),
30
+ line_number: get_line_number(),
31
+ email,
32
+ });
33
+ return NextResponse.json({ error: "Invalid email address format" }, { status: 400 });
34
+ }
35
+ // Get singleton hazo_connect instance (reuses same connection across all routes)
36
+ const hazoConnect = get_hazo_connect_instance();
37
+ // Register user using the registration service
38
+ const result = await register_user(hazoConnect, {
39
+ email,
40
+ password,
41
+ name,
42
+ url_on_logon,
43
+ });
44
+ if (!result.success) {
45
+ const status_code = result.error === "Email address already registered" ? 409 : 500;
46
+ logger.warn("registration_failed", {
47
+ filename: get_filename(),
48
+ line_number: get_line_number(),
49
+ email,
50
+ error: result.error,
51
+ });
52
+ return NextResponse.json({ error: result.error || "Registration failed" }, { status: status_code });
53
+ }
54
+ logger.info("registration_successful", {
55
+ filename: get_filename(),
56
+ line_number: get_line_number(),
57
+ user_id: result.user_id,
58
+ email,
59
+ has_name: !!name,
60
+ });
61
+ return NextResponse.json({
62
+ success: true,
63
+ message: "Registration successful",
64
+ user_id: result.user_id,
65
+ }, { status: 201 });
66
+ }
67
+ catch (error) {
68
+ const user_friendly_error = sanitize_error_for_user(error, {
69
+ logToConsole: true,
70
+ logToLogger: true,
71
+ logger,
72
+ context: {
73
+ filename: get_filename(),
74
+ line_number: get_line_number(),
75
+ operation: "register_api_route",
76
+ },
77
+ });
78
+ return NextResponse.json({ error: user_friendly_error }, { status: 500 });
79
+ }
80
+ }
@@ -0,0 +1,8 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function DELETE(request: NextRequest): Promise<NextResponse<{
3
+ error: string;
4
+ }> | NextResponse<{
5
+ success: boolean;
6
+ message: string;
7
+ }>>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/remove_profile_picture/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD,wBAAsB,MAAM,CAAC,OAAO,EAAE,WAAW;;;;;IA2EhD"}
@@ -0,0 +1,64 @@
1
+ // file_description: API route for removing profile pictures
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
5
+ import { create_app_logger } from "../../../../lib/app_logger";
6
+ import { remove_user_profile_picture } from "../../../../lib/services/profile_picture_remove_service";
7
+ import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
8
+ // section: api_handler
9
+ export async function DELETE(request) {
10
+ const logger = create_app_logger();
11
+ try {
12
+ // Use centralized auth check
13
+ let user_id;
14
+ try {
15
+ const { require_auth } = await import("../../../../lib/auth/auth_utils.server");
16
+ const user = await require_auth(request);
17
+ user_id = user.user_id;
18
+ }
19
+ catch (error) {
20
+ if (error instanceof Error && error.message === "Authentication required") {
21
+ logger.warn("profile_picture_remove_authentication_failed", {
22
+ filename: get_filename(),
23
+ line_number: get_line_number(),
24
+ error: "User not authenticated",
25
+ });
26
+ return NextResponse.json({ error: "Authentication required" }, { status: 401 });
27
+ }
28
+ throw error;
29
+ }
30
+ // Get singleton hazo_connect instance
31
+ const hazoConnect = get_hazo_connect_instance();
32
+ // Remove profile picture
33
+ const result = await remove_user_profile_picture(hazoConnect, user_id);
34
+ if (!result.success) {
35
+ logger.warn("profile_picture_remove_failed", {
36
+ filename: get_filename(),
37
+ line_number: get_line_number(),
38
+ user_id,
39
+ error: result.error,
40
+ });
41
+ return NextResponse.json({ error: result.error || "Failed to remove profile picture" }, { status: 400 });
42
+ }
43
+ logger.info("profile_picture_remove_successful", {
44
+ filename: get_filename(),
45
+ line_number: get_line_number(),
46
+ user_id,
47
+ });
48
+ return NextResponse.json({
49
+ success: true,
50
+ message: "Profile picture removed successfully",
51
+ }, { status: 200 });
52
+ }
53
+ catch (error) {
54
+ const error_message = error instanceof Error ? error.message : "Unknown error";
55
+ const error_stack = error instanceof Error ? error.stack : undefined;
56
+ logger.error("profile_picture_remove_error", {
57
+ filename: get_filename(),
58
+ line_number: get_line_number(),
59
+ error_message,
60
+ error_stack,
61
+ });
62
+ return NextResponse.json({ error: "Failed to remove profile picture. Please try again." }, { status: 500 });
63
+ }
64
+ }
@@ -0,0 +1,8 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
3
+ error: string;
4
+ }> | NextResponse<{
5
+ success: boolean;
6
+ message: string;
7
+ }>>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/resend_verification/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAOxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IAiG9C"}
@@ -0,0 +1,79 @@
1
+ // file_description: API route for resending email verification using hazo_connect
2
+ // section: imports
3
+ import { NextResponse } from "next/server";
4
+ import { get_hazo_connect_instance } from "../../../../lib/hazo_connect_instance.server";
5
+ import { create_app_logger } from "../../../../lib/app_logger";
6
+ import { resend_verification_email } from "../../../../lib/services/email_verification_service";
7
+ import { get_filename, get_line_number } from "../../../../lib/utils/api_route_helpers";
8
+ // section: api_handler
9
+ export async function POST(request) {
10
+ const logger = create_app_logger();
11
+ try {
12
+ const body = await request.json();
13
+ const { email } = body;
14
+ // Validate input
15
+ if (!email) {
16
+ logger.warn("resend_verification_validation_failed", {
17
+ filename: get_filename(),
18
+ line_number: get_line_number(),
19
+ email: email || "missing",
20
+ });
21
+ return NextResponse.json({ error: "Email is required" }, { status: 400 });
22
+ }
23
+ // Validate email format
24
+ const email_pattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
25
+ if (!email_pattern.test(email)) {
26
+ logger.warn("resend_verification_invalid_email", {
27
+ filename: get_filename(),
28
+ line_number: get_line_number(),
29
+ email,
30
+ });
31
+ return NextResponse.json({ error: "Invalid email address format" }, { status: 400 });
32
+ }
33
+ // Get singleton hazo_connect instance (reuses same connection across all routes)
34
+ const hazoConnect = get_hazo_connect_instance();
35
+ // Resend verification email using the email verification service
36
+ const result = await resend_verification_email(hazoConnect, {
37
+ email,
38
+ });
39
+ if (!result.success) {
40
+ logger.error("resend_verification_failed", {
41
+ filename: get_filename(),
42
+ line_number: get_line_number(),
43
+ email,
44
+ error: result.error,
45
+ });
46
+ // Return error response (500) when email sending fails
47
+ // This is a technical error, not a security issue, so we can reveal it
48
+ return NextResponse.json({
49
+ success: false,
50
+ error: result.error || "Failed to resend verification email",
51
+ }, { status: 500 });
52
+ }
53
+ logger.info("resend_verification_requested", {
54
+ filename: get_filename(),
55
+ line_number: get_line_number(),
56
+ email,
57
+ });
58
+ // Always return success to prevent email enumeration attacks
59
+ return NextResponse.json({
60
+ success: true,
61
+ message: "If an account with that email exists and is not verified, a verification link has been sent.",
62
+ }, { status: 200 });
63
+ }
64
+ catch (error) {
65
+ const error_message = error instanceof Error ? error.message : "Unknown error";
66
+ const error_stack = error instanceof Error ? error.stack : undefined;
67
+ logger.error("resend_verification_error", {
68
+ filename: get_filename(),
69
+ line_number: get_line_number(),
70
+ error_message,
71
+ error_stack,
72
+ });
73
+ // Still return 200 OK to prevent email enumeration attacks
74
+ return NextResponse.json({
75
+ success: true,
76
+ message: "If an account with that email exists and is not verified, a verification link has been sent.",
77
+ }, { status: 200 });
78
+ }
79
+ }
@@ -0,0 +1,8 @@
1
+ import { NextRequest, NextResponse } from "next/server";
2
+ export declare function POST(request: NextRequest): Promise<NextResponse<{
3
+ error: string;
4
+ }> | NextResponse<{
5
+ success: boolean;
6
+ message: string;
7
+ }>>;
8
+ //# sourceMappingURL=route.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route.d.ts","sourceRoot":"","sources":["../../../../../src/app/api/hazo_auth/reset_password/route.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQxD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW;;;;;IA+F9C"}