hazo_auth 1.4.2 → 1.6.0

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