@mdguggenbichler/slugbase-core 0.0.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 (381) hide show
  1. package/backend/dist/app-factory.d.ts +17 -0
  2. package/backend/dist/app-factory.d.ts.map +1 -0
  3. package/backend/dist/app-factory.js +106 -0
  4. package/backend/dist/app-factory.js.map +1 -0
  5. package/backend/dist/auth/authorization.d.ts +25 -0
  6. package/backend/dist/auth/authorization.d.ts.map +1 -0
  7. package/backend/dist/auth/authorization.js +100 -0
  8. package/backend/dist/auth/authorization.js.map +1 -0
  9. package/backend/dist/auth/jwt.d.ts +5 -0
  10. package/backend/dist/auth/jwt.d.ts.map +1 -0
  11. package/backend/dist/auth/jwt.js +34 -0
  12. package/backend/dist/auth/jwt.js.map +1 -0
  13. package/backend/dist/auth/oidc.d.ts +4 -0
  14. package/backend/dist/auth/oidc.d.ts.map +1 -0
  15. package/backend/dist/auth/oidc.js +201 -0
  16. package/backend/dist/auth/oidc.js.map +1 -0
  17. package/backend/dist/config/cloud-providers.d.ts +18 -0
  18. package/backend/dist/config/cloud-providers.d.ts.map +1 -0
  19. package/backend/dist/config/cloud-providers.js +60 -0
  20. package/backend/dist/config/cloud-providers.js.map +1 -0
  21. package/backend/dist/config/cookies.d.ts +17 -0
  22. package/backend/dist/config/cookies.d.ts.map +1 -0
  23. package/backend/dist/config/cookies.js +26 -0
  24. package/backend/dist/config/cookies.js.map +1 -0
  25. package/backend/dist/config/mode.d.ts +7 -0
  26. package/backend/dist/config/mode.d.ts.map +1 -0
  27. package/backend/dist/config/mode.js +7 -0
  28. package/backend/dist/config/mode.js.map +1 -0
  29. package/backend/dist/config/swagger.d.ts +2 -0
  30. package/backend/dist/config/swagger.d.ts.map +1 -0
  31. package/backend/dist/config/swagger.js +76 -0
  32. package/backend/dist/config/swagger.js.map +1 -0
  33. package/backend/dist/config.d.ts +29 -0
  34. package/backend/dist/config.d.ts.map +1 -0
  35. package/backend/dist/config.js +41 -0
  36. package/backend/dist/config.js.map +1 -0
  37. package/backend/dist/db/index.d.ts +14 -0
  38. package/backend/dist/db/index.d.ts.map +1 -0
  39. package/backend/dist/db/index.js +114 -0
  40. package/backend/dist/db/index.js.map +1 -0
  41. package/backend/dist/db/migrate-slug-nullable.d.ts +10 -0
  42. package/backend/dist/db/migrate-slug-nullable.d.ts.map +1 -0
  43. package/backend/dist/db/migrate-slug-nullable.js +87 -0
  44. package/backend/dist/db/migrate-slug-nullable.js.map +1 -0
  45. package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts +10 -0
  46. package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts.map +1 -0
  47. package/backend/dist/db/migrations/001_migrate_slug_nullable.js +103 -0
  48. package/backend/dist/db/migrations/001_migrate_slug_nullable.js.map +1 -0
  49. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts +11 -0
  50. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts.map +1 -0
  51. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js +92 -0
  52. package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js.map +1 -0
  53. package/backend/dist/db/migrations/003_add_bookmark_features.d.ts +5 -0
  54. package/backend/dist/db/migrations/003_add_bookmark_features.d.ts.map +1 -0
  55. package/backend/dist/db/migrations/003_add_bookmark_features.js +98 -0
  56. package/backend/dist/db/migrations/003_add_bookmark_features.js.map +1 -0
  57. package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts +12 -0
  58. package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts.map +1 -0
  59. package/backend/dist/db/migrations/004_make_slug_globally_unique.js +152 -0
  60. package/backend/dist/db/migrations/004_make_slug_globally_unique.js.map +1 -0
  61. package/backend/dist/db/migrations/005_add_email_verification.d.ts +5 -0
  62. package/backend/dist/db/migrations/005_add_email_verification.d.ts.map +1 -0
  63. package/backend/dist/db/migrations/005_add_email_verification.js +102 -0
  64. package/backend/dist/db/migrations/005_add_email_verification.js.map +1 -0
  65. package/backend/dist/db/migrations/006_refresh_tokens.d.ts +9 -0
  66. package/backend/dist/db/migrations/006_refresh_tokens.d.ts.map +1 -0
  67. package/backend/dist/db/migrations/006_refresh_tokens.js +61 -0
  68. package/backend/dist/db/migrations/006_refresh_tokens.js.map +1 -0
  69. package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts +10 -0
  70. package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts.map +1 -0
  71. package/backend/dist/db/migrations/007_password_reset_token_hash.js +40 -0
  72. package/backend/dist/db/migrations/007_password_reset_token_hash.js.map +1 -0
  73. package/backend/dist/db/migrations/008_slug_preferences.d.ts +8 -0
  74. package/backend/dist/db/migrations/008_slug_preferences.d.ts.map +1 -0
  75. package/backend/dist/db/migrations/008_slug_preferences.js +24 -0
  76. package/backend/dist/db/migrations/008_slug_preferences.js.map +1 -0
  77. package/backend/dist/db/migrations/009_signup_email_verified.d.ts +5 -0
  78. package/backend/dist/db/migrations/009_signup_email_verified.d.ts.map +1 -0
  79. package/backend/dist/db/migrations/009_signup_email_verified.js +79 -0
  80. package/backend/dist/db/migrations/009_signup_email_verified.js.map +1 -0
  81. package/backend/dist/db/migrations/010_organizations.d.ts +5 -0
  82. package/backend/dist/db/migrations/010_organizations.d.ts.map +1 -0
  83. package/backend/dist/db/migrations/010_organizations.js +113 -0
  84. package/backend/dist/db/migrations/010_organizations.js.map +1 -0
  85. package/backend/dist/db/migrations/011_org_scoped_teams.d.ts +11 -0
  86. package/backend/dist/db/migrations/011_org_scoped_teams.d.ts.map +1 -0
  87. package/backend/dist/db/migrations/011_org_scoped_teams.js +59 -0
  88. package/backend/dist/db/migrations/011_org_scoped_teams.js.map +1 -0
  89. package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts +10 -0
  90. package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts.map +1 -0
  91. package/backend/dist/db/migrations/012_org_invitations_token_hash.js +40 -0
  92. package/backend/dist/db/migrations/012_org_invitations_token_hash.js.map +1 -0
  93. package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts +10 -0
  94. package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts.map +1 -0
  95. package/backend/dist/db/migrations/013_signup_verification_token_hash.js +39 -0
  96. package/backend/dist/db/migrations/013_signup_verification_token_hash.js.map +1 -0
  97. package/backend/dist/db/migrations/014_stats_indexes.d.ts +8 -0
  98. package/backend/dist/db/migrations/014_stats_indexes.d.ts.map +1 -0
  99. package/backend/dist/db/migrations/014_stats_indexes.js +19 -0
  100. package/backend/dist/db/migrations/014_stats_indexes.js.map +1 -0
  101. package/backend/dist/db/migrations/015_api_tokens.d.ts +9 -0
  102. package/backend/dist/db/migrations/015_api_tokens.d.ts.map +1 -0
  103. package/backend/dist/db/migrations/015_api_tokens.js +48 -0
  104. package/backend/dist/db/migrations/015_api_tokens.js.map +1 -0
  105. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts +9 -0
  106. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts.map +1 -0
  107. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js +50 -0
  108. package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js.map +1 -0
  109. package/backend/dist/db/migrations/017_ai_suggestions.d.ts +11 -0
  110. package/backend/dist/db/migrations/017_ai_suggestions.d.ts.map +1 -0
  111. package/backend/dist/db/migrations/017_ai_suggestions.js +78 -0
  112. package/backend/dist/db/migrations/017_ai_suggestions.js.map +1 -0
  113. package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts +10 -0
  114. package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts.map +1 -0
  115. package/backend/dist/db/migrations/018_ai_cache_output_language.js +89 -0
  116. package/backend/dist/db/migrations/018_ai_cache_output_language.js.map +1 -0
  117. package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts +10 -0
  118. package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts.map +1 -0
  119. package/backend/dist/db/migrations/019_ai_suggestion_usage.js +47 -0
  120. package/backend/dist/db/migrations/019_ai_suggestion_usage.js.map +1 -0
  121. package/backend/dist/db/migrations/020_tenant_scope.d.ts +5 -0
  122. package/backend/dist/db/migrations/020_tenant_scope.d.ts.map +1 -0
  123. package/backend/dist/db/migrations/020_tenant_scope.js +105 -0
  124. package/backend/dist/db/migrations/020_tenant_scope.js.map +1 -0
  125. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts +5 -0
  126. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts.map +1 -0
  127. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js +113 -0
  128. package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js.map +1 -0
  129. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts +11 -0
  130. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts.map +1 -0
  131. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js +59 -0
  132. package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js.map +1 -0
  133. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts +10 -0
  134. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts.map +1 -0
  135. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js +40 -0
  136. package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js.map +1 -0
  137. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts +9 -0
  138. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts.map +1 -0
  139. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js +50 -0
  140. package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js.map +1 -0
  141. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts +11 -0
  142. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts.map +1 -0
  143. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js +78 -0
  144. package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js.map +1 -0
  145. package/backend/dist/db/migrations/index.d.ts +22 -0
  146. package/backend/dist/db/migrations/index.d.ts.map +1 -0
  147. package/backend/dist/db/migrations/index.js +194 -0
  148. package/backend/dist/db/migrations/index.js.map +1 -0
  149. package/backend/dist/db/pool.d.ts +13 -0
  150. package/backend/dist/db/pool.d.ts.map +1 -0
  151. package/backend/dist/db/pool.js +41 -0
  152. package/backend/dist/db/pool.js.map +1 -0
  153. package/backend/dist/db/seed-data.d.ts +66 -0
  154. package/backend/dist/db/seed-data.d.ts.map +1 -0
  155. package/backend/dist/db/seed-data.js +394 -0
  156. package/backend/dist/db/seed-data.js.map +1 -0
  157. package/backend/dist/db/seed.d.ts +19 -0
  158. package/backend/dist/db/seed.d.ts.map +1 -0
  159. package/backend/dist/db/seed.js +406 -0
  160. package/backend/dist/db/seed.js.map +1 -0
  161. package/backend/dist/index.d.ts +3 -0
  162. package/backend/dist/index.d.ts.map +1 -0
  163. package/backend/dist/index.js +64 -0
  164. package/backend/dist/index.js.map +1 -0
  165. package/backend/dist/instrument.d.ts +2 -0
  166. package/backend/dist/instrument.d.ts.map +1 -0
  167. package/backend/dist/instrument.js +16 -0
  168. package/backend/dist/instrument.js.map +1 -0
  169. package/backend/dist/load-env.d.ts +2 -0
  170. package/backend/dist/load-env.d.ts.map +1 -0
  171. package/backend/dist/load-env.js +33 -0
  172. package/backend/dist/load-env.js.map +1 -0
  173. package/backend/dist/middleware/auth.d.ts +23 -0
  174. package/backend/dist/middleware/auth.d.ts.map +1 -0
  175. package/backend/dist/middleware/auth.js +69 -0
  176. package/backend/dist/middleware/auth.js.map +1 -0
  177. package/backend/dist/middleware/error-handler.d.ts +11 -0
  178. package/backend/dist/middleware/error-handler.d.ts.map +1 -0
  179. package/backend/dist/middleware/error-handler.js +40 -0
  180. package/backend/dist/middleware/error-handler.js.map +1 -0
  181. package/backend/dist/middleware/security.d.ts +26 -0
  182. package/backend/dist/middleware/security.d.ts.map +1 -0
  183. package/backend/dist/middleware/security.js +162 -0
  184. package/backend/dist/middleware/security.js.map +1 -0
  185. package/backend/dist/middleware/stats-auth.d.ts +7 -0
  186. package/backend/dist/middleware/stats-auth.d.ts.map +1 -0
  187. package/backend/dist/middleware/stats-auth.js +20 -0
  188. package/backend/dist/middleware/stats-auth.js.map +1 -0
  189. package/backend/dist/middleware/tenant.d.ts +3 -0
  190. package/backend/dist/middleware/tenant.d.ts.map +1 -0
  191. package/backend/dist/middleware/tenant.js +13 -0
  192. package/backend/dist/middleware/tenant.js.map +1 -0
  193. package/backend/dist/register-routes.d.ts +12 -0
  194. package/backend/dist/register-routes.d.ts.map +1 -0
  195. package/backend/dist/register-routes.js +59 -0
  196. package/backend/dist/register-routes.js.map +1 -0
  197. package/backend/dist/routes/admin/demo-reset.d.ts +8 -0
  198. package/backend/dist/routes/admin/demo-reset.d.ts.map +1 -0
  199. package/backend/dist/routes/admin/demo-reset.js +66 -0
  200. package/backend/dist/routes/admin/demo-reset.js.map +1 -0
  201. package/backend/dist/routes/admin/settings.d.ts +3 -0
  202. package/backend/dist/routes/admin/settings.d.ts.map +1 -0
  203. package/backend/dist/routes/admin/settings.js +452 -0
  204. package/backend/dist/routes/admin/settings.js.map +1 -0
  205. package/backend/dist/routes/admin/stats.d.ts +7 -0
  206. package/backend/dist/routes/admin/stats.d.ts.map +1 -0
  207. package/backend/dist/routes/admin/stats.js +66 -0
  208. package/backend/dist/routes/admin/stats.js.map +1 -0
  209. package/backend/dist/routes/admin/teams.d.ts +3 -0
  210. package/backend/dist/routes/admin/teams.d.ts.map +1 -0
  211. package/backend/dist/routes/admin/teams.js +509 -0
  212. package/backend/dist/routes/admin/teams.js.map +1 -0
  213. package/backend/dist/routes/admin/users.d.ts +3 -0
  214. package/backend/dist/routes/admin/users.d.ts.map +1 -0
  215. package/backend/dist/routes/admin/users.js +525 -0
  216. package/backend/dist/routes/admin/users.js.map +1 -0
  217. package/backend/dist/routes/auth.d.ts +3 -0
  218. package/backend/dist/routes/auth.d.ts.map +1 -0
  219. package/backend/dist/routes/auth.js +992 -0
  220. package/backend/dist/routes/auth.js.map +1 -0
  221. package/backend/dist/routes/billing.d.ts +8 -0
  222. package/backend/dist/routes/billing.d.ts.map +1 -0
  223. package/backend/dist/routes/billing.js +481 -0
  224. package/backend/dist/routes/billing.js.map +1 -0
  225. package/backend/dist/routes/bookmarks.d.ts +3 -0
  226. package/backend/dist/routes/bookmarks.d.ts.map +1 -0
  227. package/backend/dist/routes/bookmarks.js +1593 -0
  228. package/backend/dist/routes/bookmarks.js.map +1 -0
  229. package/backend/dist/routes/config.d.ts +7 -0
  230. package/backend/dist/routes/config.d.ts.map +1 -0
  231. package/backend/dist/routes/config.js +52 -0
  232. package/backend/dist/routes/config.js.map +1 -0
  233. package/backend/dist/routes/contact.d.ts +9 -0
  234. package/backend/dist/routes/contact.d.ts.map +1 -0
  235. package/backend/dist/routes/contact.js +99 -0
  236. package/backend/dist/routes/contact.js.map +1 -0
  237. package/backend/dist/routes/csrf.d.ts +3 -0
  238. package/backend/dist/routes/csrf.d.ts.map +1 -0
  239. package/backend/dist/routes/csrf.js +39 -0
  240. package/backend/dist/routes/csrf.js.map +1 -0
  241. package/backend/dist/routes/dashboard.d.ts +3 -0
  242. package/backend/dist/routes/dashboard.d.ts.map +1 -0
  243. package/backend/dist/routes/dashboard.js +212 -0
  244. package/backend/dist/routes/dashboard.js.map +1 -0
  245. package/backend/dist/routes/email-verification.d.ts +3 -0
  246. package/backend/dist/routes/email-verification.d.ts.map +1 -0
  247. package/backend/dist/routes/email-verification.js +124 -0
  248. package/backend/dist/routes/email-verification.js.map +1 -0
  249. package/backend/dist/routes/folders.d.ts +3 -0
  250. package/backend/dist/routes/folders.d.ts.map +1 -0
  251. package/backend/dist/routes/folders.js +524 -0
  252. package/backend/dist/routes/folders.js.map +1 -0
  253. package/backend/dist/routes/go-helpers.d.ts +18 -0
  254. package/backend/dist/routes/go-helpers.d.ts.map +1 -0
  255. package/backend/dist/routes/go-helpers.js +64 -0
  256. package/backend/dist/routes/go-helpers.js.map +1 -0
  257. package/backend/dist/routes/go.d.ts +23 -0
  258. package/backend/dist/routes/go.d.ts.map +1 -0
  259. package/backend/dist/routes/go.js +361 -0
  260. package/backend/dist/routes/go.js.map +1 -0
  261. package/backend/dist/routes/health.d.ts +6 -0
  262. package/backend/dist/routes/health.d.ts.map +1 -0
  263. package/backend/dist/routes/health.js +79 -0
  264. package/backend/dist/routes/health.js.map +1 -0
  265. package/backend/dist/routes/invitations.d.ts +3 -0
  266. package/backend/dist/routes/invitations.d.ts.map +1 -0
  267. package/backend/dist/routes/invitations.js +172 -0
  268. package/backend/dist/routes/invitations.js.map +1 -0
  269. package/backend/dist/routes/oidc-providers.d.ts +3 -0
  270. package/backend/dist/routes/oidc-providers.d.ts.map +1 -0
  271. package/backend/dist/routes/oidc-providers.js +495 -0
  272. package/backend/dist/routes/oidc-providers.js.map +1 -0
  273. package/backend/dist/routes/organizations.d.ts +3 -0
  274. package/backend/dist/routes/organizations.d.ts.map +1 -0
  275. package/backend/dist/routes/organizations.js +538 -0
  276. package/backend/dist/routes/organizations.js.map +1 -0
  277. package/backend/dist/routes/password-reset.d.ts +3 -0
  278. package/backend/dist/routes/password-reset.d.ts.map +1 -0
  279. package/backend/dist/routes/password-reset.js +212 -0
  280. package/backend/dist/routes/password-reset.js.map +1 -0
  281. package/backend/dist/routes/redirect.d.ts +3 -0
  282. package/backend/dist/routes/redirect.d.ts.map +1 -0
  283. package/backend/dist/routes/redirect.js +124 -0
  284. package/backend/dist/routes/redirect.js.map +1 -0
  285. package/backend/dist/routes/tags.d.ts +3 -0
  286. package/backend/dist/routes/tags.d.ts.map +1 -0
  287. package/backend/dist/routes/tags.js +302 -0
  288. package/backend/dist/routes/tags.js.map +1 -0
  289. package/backend/dist/routes/teams.d.ts +3 -0
  290. package/backend/dist/routes/teams.d.ts.map +1 -0
  291. package/backend/dist/routes/teams.js +60 -0
  292. package/backend/dist/routes/teams.js.map +1 -0
  293. package/backend/dist/routes/tokens.d.ts +3 -0
  294. package/backend/dist/routes/tokens.d.ts.map +1 -0
  295. package/backend/dist/routes/tokens.js +157 -0
  296. package/backend/dist/routes/tokens.js.map +1 -0
  297. package/backend/dist/routes/users.d.ts +3 -0
  298. package/backend/dist/routes/users.d.ts.map +1 -0
  299. package/backend/dist/routes/users.js +199 -0
  300. package/backend/dist/routes/users.js.map +1 -0
  301. package/backend/dist/services/ai-suggestions.d.ts +29 -0
  302. package/backend/dist/services/ai-suggestions.d.ts.map +1 -0
  303. package/backend/dist/services/ai-suggestions.js +163 -0
  304. package/backend/dist/services/ai-suggestions.js.map +1 -0
  305. package/backend/dist/services/api-tokens.d.ts +66 -0
  306. package/backend/dist/services/api-tokens.d.ts.map +1 -0
  307. package/backend/dist/services/api-tokens.js +129 -0
  308. package/backend/dist/services/api-tokens.js.map +1 -0
  309. package/backend/dist/services/fetch-page-metadata.d.ts +15 -0
  310. package/backend/dist/services/fetch-page-metadata.d.ts.map +1 -0
  311. package/backend/dist/services/fetch-page-metadata.js +205 -0
  312. package/backend/dist/services/fetch-page-metadata.js.map +1 -0
  313. package/backend/dist/services/stats.d.ts +73 -0
  314. package/backend/dist/services/stats.d.ts.map +1 -0
  315. package/backend/dist/services/stats.js +145 -0
  316. package/backend/dist/services/stats.js.map +1 -0
  317. package/backend/dist/types/oidc-provider.d.ts +17 -0
  318. package/backend/dist/types/oidc-provider.d.ts.map +1 -0
  319. package/backend/dist/types/oidc-provider.js +2 -0
  320. package/backend/dist/types/oidc-provider.js.map +1 -0
  321. package/backend/dist/types.d.ts +86 -0
  322. package/backend/dist/types.d.ts.map +1 -0
  323. package/backend/dist/types.js +2 -0
  324. package/backend/dist/types.js.map +1 -0
  325. package/backend/dist/utils/ai-feature.d.ts +23 -0
  326. package/backend/dist/utils/ai-feature.d.ts.map +1 -0
  327. package/backend/dist/utils/ai-feature.js +62 -0
  328. package/backend/dist/utils/ai-feature.js.map +1 -0
  329. package/backend/dist/utils/email.d.ts +40 -0
  330. package/backend/dist/utils/email.d.ts.map +1 -0
  331. package/backend/dist/utils/email.js +456 -0
  332. package/backend/dist/utils/email.js.map +1 -0
  333. package/backend/dist/utils/encryption.d.ts +18 -0
  334. package/backend/dist/utils/encryption.d.ts.map +1 -0
  335. package/backend/dist/utils/encryption.js +95 -0
  336. package/backend/dist/utils/encryption.js.map +1 -0
  337. package/backend/dist/utils/env-validation.d.ts +6 -0
  338. package/backend/dist/utils/env-validation.d.ts.map +1 -0
  339. package/backend/dist/utils/env-validation.js +51 -0
  340. package/backend/dist/utils/env-validation.js.map +1 -0
  341. package/backend/dist/utils/jwt.d.ts +20 -0
  342. package/backend/dist/utils/jwt.d.ts.map +1 -0
  343. package/backend/dist/utils/jwt.js +48 -0
  344. package/backend/dist/utils/jwt.js.map +1 -0
  345. package/backend/dist/utils/org-cleanup.d.ts +6 -0
  346. package/backend/dist/utils/org-cleanup.d.ts.map +1 -0
  347. package/backend/dist/utils/org-cleanup.js +37 -0
  348. package/backend/dist/utils/org-cleanup.js.map +1 -0
  349. package/backend/dist/utils/organizations.d.ts +12 -0
  350. package/backend/dist/utils/organizations.d.ts.map +1 -0
  351. package/backend/dist/utils/organizations.js +24 -0
  352. package/backend/dist/utils/organizations.js.map +1 -0
  353. package/backend/dist/utils/plan-errors.d.ts +18 -0
  354. package/backend/dist/utils/plan-errors.d.ts.map +1 -0
  355. package/backend/dist/utils/plan-errors.js +21 -0
  356. package/backend/dist/utils/plan-errors.js.map +1 -0
  357. package/backend/dist/utils/refresh-token.d.ts +31 -0
  358. package/backend/dist/utils/refresh-token.d.ts.map +1 -0
  359. package/backend/dist/utils/refresh-token.js +63 -0
  360. package/backend/dist/utils/refresh-token.js.map +1 -0
  361. package/backend/dist/utils/session-store.d.ts +46 -0
  362. package/backend/dist/utils/session-store.d.ts.map +1 -0
  363. package/backend/dist/utils/session-store.js +222 -0
  364. package/backend/dist/utils/session-store.js.map +1 -0
  365. package/backend/dist/utils/tenant.d.ts +5 -0
  366. package/backend/dist/utils/tenant.d.ts.map +1 -0
  367. package/backend/dist/utils/tenant.js +12 -0
  368. package/backend/dist/utils/tenant.js.map +1 -0
  369. package/backend/dist/utils/user-key.d.ts +24 -0
  370. package/backend/dist/utils/user-key.d.ts.map +1 -0
  371. package/backend/dist/utils/user-key.js +116 -0
  372. package/backend/dist/utils/user-key.js.map +1 -0
  373. package/backend/dist/utils/validation.d.ts +91 -0
  374. package/backend/dist/utils/validation.d.ts.map +1 -0
  375. package/backend/dist/utils/validation.js +337 -0
  376. package/backend/dist/utils/validation.js.map +1 -0
  377. package/backend/index.js +15 -0
  378. package/frontend/index.js +5 -0
  379. package/frontend/index.tsx +7 -0
  380. package/package.json +16 -0
  381. package/types/index.js +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"folders.js","sourceRoot":"","sources":["../../src/routes/folders.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Helpers for /go slug resolution and bookmark lookup
3
+ */
4
+ export interface BookmarkCandidate {
5
+ id: string;
6
+ title: string;
7
+ url: string;
8
+ slug: string;
9
+ user_id: string;
10
+ workspace: string;
11
+ }
12
+ /**
13
+ * Get all bookmarks accessible to the user that match the slug and have forwarding enabled.
14
+ * Returns candidates with workspace labels for collision UI.
15
+ * @param orgId - Legacy arg kept for compatibility.
16
+ */
17
+ export declare function getAccessibleBookmarksBySlug(userId: string, slug: string, orgId?: string | null, tenantId?: string): Promise<BookmarkCandidate[]>;
18
+ //# sourceMappingURL=go-helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-helpers.d.ts","sourceRoot":"","sources":["../../src/routes/go-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAiBH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;GAIG;AACH,wBAAsB,4BAA4B,CAChD,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,EACrB,QAAQ,GAAE,MAAkB,GAC3B,OAAO,CAAC,iBAAiB,EAAE,CAAC,CA6C9B"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Helpers for /go slug resolution and bookmark lookup
3
+ */
4
+ import { query } from '../db/index.js';
5
+ import { getTeamIdsForUser, getTeamIdsForUserInOrg } from '../auth/authorization.js';
6
+ const DB_TYPE = process.env.DB_TYPE || 'sqlite';
7
+ /** Convert ? placeholders to $1, $2 for PostgreSQL */
8
+ function toPg(sql) {
9
+ let n = 0;
10
+ return sql.replace(/\?/g, () => `$${++n}`);
11
+ }
12
+ function runSql(sql, params) {
13
+ return DB_TYPE === 'postgresql' ? [toPg(sql), params] : [sql, params];
14
+ }
15
+ /**
16
+ * Get all bookmarks accessible to the user that match the slug and have forwarding enabled.
17
+ * Returns candidates with workspace labels for collision UI.
18
+ * @param orgId - Legacy arg kept for compatibility.
19
+ */
20
+ export async function getAccessibleBookmarksBySlug(userId, slug, orgId, tenantId = 'default') {
21
+ const teamIds = orgId
22
+ ? await getTeamIdsForUserInOrg(userId, orgId, tenantId)
23
+ : await getTeamIdsForUser(userId, tenantId);
24
+ const teamPlaceholders = teamIds.length > 0 ? teamIds.map(() => '?').join(',') : 'NULL';
25
+ const busCond = 'bus.user_id = ?';
26
+ const fusCond = 'fus.user_id = ?';
27
+ const sql = `
28
+ SELECT DISTINCT b.id, b.title, b.url, b.slug, b.user_id,
29
+ CASE WHEN b.user_id = ? THEN 'Personal' ELSE COALESCE(u.name, u.email, 'Shared') END as workspace
30
+ FROM bookmarks b
31
+ LEFT JOIN bookmark_user_shares bus ON b.id = bus.bookmark_id
32
+ LEFT JOIN bookmark_team_shares bts ON b.id = bts.bookmark_id
33
+ LEFT JOIN bookmark_folders bf ON b.id = bf.bookmark_id
34
+ LEFT JOIN folder_user_shares fus ON bf.folder_id = fus.folder_id
35
+ LEFT JOIN folder_team_shares fts ON bf.folder_id = fts.folder_id
36
+ LEFT JOIN users u ON b.user_id = u.id
37
+ WHERE b.tenant_id = ?
38
+ AND (b.user_id = ?
39
+ OR ${busCond}
40
+ OR (bts.team_id IN (${teamPlaceholders}) AND bts.team_id IS NOT NULL)
41
+ OR ${fusCond}
42
+ OR (fts.team_id IN (${teamPlaceholders}) AND fts.team_id IS NOT NULL AND bf.folder_id IS NOT NULL))
43
+ AND b.slug = ? AND b.forwarding_enabled = TRUE
44
+ `;
45
+ const params = [userId, tenantId, userId];
46
+ params.push(userId, userId);
47
+ if (teamIds.length > 0) {
48
+ params.push(...teamIds);
49
+ params.push(...teamIds);
50
+ }
51
+ params.push(slug);
52
+ const [q, p] = runSql(sql, params);
53
+ const rows = await query(q, p);
54
+ const list = Array.isArray(rows) ? rows : rows ? [rows] : [];
55
+ return list.map((r) => ({
56
+ id: r.id,
57
+ title: r.title,
58
+ url: r.url,
59
+ slug: r.slug,
60
+ user_id: r.user_id,
61
+ workspace: r.workspace || 'Shared',
62
+ }));
63
+ }
64
+ //# sourceMappingURL=go-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go-helpers.js","sourceRoot":"","sources":["../../src/routes/go-helpers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAY,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAErF,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,QAAQ,CAAC;AAEhD,sDAAsD;AACtD,SAAS,IAAI,CAAC,GAAW;IACvB,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,MAAM,CAAC,GAAW,EAAE,MAAa;IACxC,OAAO,OAAO,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AACxE,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,MAAc,EACd,IAAY,EACZ,KAAqB,EACrB,WAAmB,SAAS;IAE5B,MAAM,OAAO,GAAG,KAAK;QACnB,CAAC,CAAC,MAAM,sBAAsB,CAAC,MAAM,EAAE,KAAK,EAAE,QAAQ,CAAC;QACvD,CAAC,CAAC,MAAM,iBAAiB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC9C,MAAM,gBAAgB,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IACxF,MAAM,OAAO,GAAG,iBAAiB,CAAC;IAClC,MAAM,OAAO,GAAG,iBAAiB,CAAC;IAElC,MAAM,GAAG,GAAG;;;;;;;;;;;;WAYH,OAAO;4BACU,gBAAgB;WACjC,OAAO;4BACU,gBAAgB;;GAEzC,CAAC;IACF,MAAM,MAAM,GAAU,CAAC,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;IACjD,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;IAC1B,CAAC;IACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAElB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC;QAC3B,EAAE,EAAE,CAAC,CAAC,EAAE;QACR,KAAK,EAAE,CAAC,CAAC,KAAK;QACd,GAAG,EAAE,CAAC,CAAC,GAAG;QACV,IAAI,EAAE,CAAC,CAAC,IAAI;QACZ,OAAO,EAAE,CAAC,CAAC,OAAO;QAClB,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ;KACnC,CAAC,CAAC,CAAC;AACN,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * /go slug forwarding and slug preferences API
3
+ * Single canonical forwarding: GET /go/:slug
4
+ * Preferences API: GET/POST/DELETE /api/go/preferences
5
+ */
6
+ import { Request, Response } from 'express';
7
+ declare const router: import("express-serve-static-core").Router;
8
+ /** Optional auth: try JWT; if no user, redirect to login */
9
+ export declare function optionalAuthForGo(req: Request, res: Response, next: () => void): void;
10
+ /**
11
+ * GET /go/:slug - Main forwarding endpoint
12
+ * 1. Check remembered preference
13
+ * 2. Search accessible bookmarks
14
+ * 3. 0 → not-found, 1 → redirect, 2+ → collision UI
15
+ */
16
+ export declare function handleGoSlug(req: Request, res: Response): Response<any, Record<string, any>> | undefined;
17
+ /**
18
+ * GET /go/:slug/remember/:bookmarkId - Create preference and redirect to bookmark
19
+ * Used from collision page "Always use this" links
20
+ */
21
+ export declare function handleGoRemember(req: Request, res: Response): Promise<void | Response<any, Record<string, any>>>;
22
+ export default router;
23
+ //# sourceMappingURL=go.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.d.ts","sourceRoot":"","sources":["../../src/routes/go.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAU,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AASpD,QAAA,MAAM,MAAM,4CAAW,CAAC;AAWxB,4DAA4D;AAC5D,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,IAAI,QAW9E;AAgED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,kDAwEvD;AAED;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,sDAuCd;AA6MD,eAAe,MAAM,CAAC"}
@@ -0,0 +1,361 @@
1
+ /**
2
+ * /go slug forwarding and slug preferences API
3
+ * Single canonical forwarding: GET /go/:slug
4
+ * Preferences API: GET/POST/DELETE /api/go/preferences
5
+ */
6
+ import { Router } from 'express';
7
+ import passport from 'passport';
8
+ import { query, queryOne, execute } from '../db/index.js';
9
+ import { requireAuth } from '../middleware/auth.js';
10
+ import { canAccessBookmark } from '../auth/authorization.js';
11
+ import { getAccessibleBookmarksBySlug } from './go-helpers.js';
12
+ import { validateUrl, validateSlug } from '../utils/validation.js';
13
+ import { getTenantId } from '../utils/tenant.js';
14
+ const router = Router();
15
+ const frontendUrl = process.env.FRONTEND_URL || 'http://localhost:3000';
16
+ const baseUrl = process.env.BASE_URL || 'http://localhost:5000';
17
+ /** Login path for redirect (unauthenticated users) - use frontend URL for SPA login page */
18
+ function loginPath(redirectPath) {
19
+ const path = '/login';
20
+ const encoded = encodeURIComponent(redirectPath);
21
+ return `${frontendUrl}${path}?redirect=${encoded}`;
22
+ }
23
+ /** Optional auth: try JWT; if no user, redirect to login */
24
+ export function optionalAuthForGo(req, res, next) {
25
+ passport.authenticate('jwt', { session: false }, (err, user) => {
26
+ if (err) {
27
+ return res.redirect(302, loginPath(req.path));
28
+ }
29
+ if (!user) {
30
+ return res.redirect(302, loginPath(req.path));
31
+ }
32
+ req.user = user;
33
+ next();
34
+ })(req, res, next);
35
+ }
36
+ /**
37
+ * Escape HTML for safe inclusion in server-rendered pages
38
+ */
39
+ function escapeHtml(s) {
40
+ return s
41
+ .replace(/&/g, '&amp;')
42
+ .replace(/</g, '&lt;')
43
+ .replace(/>/g, '&gt;')
44
+ .replace(/"/g, '&quot;')
45
+ .replace(/'/g, '&#039;');
46
+ }
47
+ /**
48
+ * Friendly not-found HTML page
49
+ */
50
+ function notFoundHtml(slug) {
51
+ const safeSlug = escapeHtml(slug);
52
+ return `<!DOCTYPE html>
53
+ <html>
54
+ <head><meta charset="utf-8"><title>Not Found - SlugBase</title></head>
55
+ <body style="font-family: system-ui, sans-serif; max-width: 480px; margin: 2rem auto; padding: 1rem;">
56
+ <h1>Bookmark not found</h1>
57
+ <p>No bookmark with slug <code>${safeSlug}</code> was found in your collection.</p>
58
+ <p>Make sure you're logged in and the bookmark exists with forwarding enabled.</p>
59
+ </body>
60
+ </html>`;
61
+ }
62
+ /**
63
+ * Collision selection HTML page (multiple bookmarks match slug)
64
+ */
65
+ function collisionHtml(slug, candidates) {
66
+ const safeSlug = escapeHtml(slug);
67
+ const rows = candidates
68
+ .map((c) => `<tr>
69
+ <td><a href="${escapeHtml(c.url)}">${escapeHtml(c.title)}</a></td>
70
+ <td>${escapeHtml(c.workspace)}</td>
71
+ <td><a href="/go/${encodeURIComponent(slug)}/remember/${encodeURIComponent(c.id)}">Always use this</a></td>
72
+ </tr>`)
73
+ .join('');
74
+ return `<!DOCTYPE html>
75
+ <html>
76
+ <head><meta charset="utf-8"><title>Choose bookmark - SlugBase</title></head>
77
+ <body style="font-family: system-ui, sans-serif; max-width: 640px; margin: 2rem auto; padding: 1rem;">
78
+ <h1>Multiple bookmarks match "${safeSlug}"</h1>
79
+ <p>Choose which one to open:</p>
80
+ <table style="width:100%; border-collapse: collapse;">
81
+ <thead>
82
+ <tr style="text-align:left;"><th>Title</th><th>Source</th><th></th></tr>
83
+ </thead>
84
+ <tbody>${rows}</tbody>
85
+ </table>
86
+ </body>
87
+ </html>`;
88
+ }
89
+ /**
90
+ * GET /go/:slug - Main forwarding endpoint
91
+ * 1. Check remembered preference
92
+ * 2. Search accessible bookmarks
93
+ * 3. 0 → not-found, 1 → redirect, 2+ → collision UI
94
+ */
95
+ export function handleGoSlug(req, res) {
96
+ const slug = req.params.slug;
97
+ const authReq = req;
98
+ const userId = authReq.user.id;
99
+ const tenantId = getTenantId(req);
100
+ const slugValidation = validateSlug(slug);
101
+ if (!slugValidation.valid) {
102
+ return res.status(400).send('Invalid slug');
103
+ }
104
+ (async () => {
105
+ const orgId = null;
106
+ // Step 1: Check remembered preference
107
+ const pref = await queryOne('SELECT bookmark_id FROM slug_preferences WHERE tenant_id = ? AND user_id = ? AND slug = ?', [tenantId, userId, slug]);
108
+ if (pref) {
109
+ const bookmarkId = pref.bookmark_id;
110
+ const hasAccess = await canAccessBookmark(userId, bookmarkId, orgId, tenantId);
111
+ if (hasAccess) {
112
+ const bookmark = await queryOne('SELECT id, url, slug, forwarding_enabled FROM bookmarks WHERE id = ? AND tenant_id = ?', [bookmarkId, tenantId]);
113
+ if (bookmark && bookmark.forwarding_enabled) {
114
+ const url = bookmark.url;
115
+ const urlValidation = validateUrl(url);
116
+ if (urlValidation.valid) {
117
+ execute(`UPDATE bookmarks SET access_count = COALESCE(access_count, 0) + 1, last_accessed_at = CURRENT_TIMESTAMP WHERE id = ? AND tenant_id = ?`, [bookmarkId, tenantId]).catch((err) => console.error('Failed to track bookmark access:', err));
118
+ return res.redirect(302, url);
119
+ }
120
+ }
121
+ }
122
+ await execute('DELETE FROM slug_preferences WHERE tenant_id = ? AND user_id = ? AND slug = ?', [tenantId, userId, slug]);
123
+ }
124
+ // Step 2: Search accessible bookmarks
125
+ const candidates = await getAccessibleBookmarksBySlug(userId, slug, orgId, tenantId);
126
+ if (candidates.length === 0) {
127
+ return res.status(404).type('text/html').send(notFoundHtml(slug));
128
+ }
129
+ if (candidates.length === 1) {
130
+ const b = candidates[0];
131
+ const urlValidation = validateUrl(b.url);
132
+ if (!urlValidation.valid) {
133
+ return res.status(400).send('Invalid redirect URL');
134
+ }
135
+ execute(`UPDATE bookmarks SET access_count = COALESCE(access_count, 0) + 1, last_accessed_at = CURRENT_TIMESTAMP WHERE id = ? AND tenant_id = ?`, [b.id, tenantId]).catch((err) => console.error('Failed to track bookmark access:', err));
136
+ return res.redirect(302, b.url);
137
+ }
138
+ // Step 3: Multiple matches - collision UI
139
+ return res.type('text/html').send(collisionHtml(slug, candidates.map((c) => ({ id: c.id, title: c.title, url: c.url, workspace: c.workspace }))));
140
+ })().catch((err) => {
141
+ console.error('Go slug error:', err);
142
+ res.status(500).send('Internal Server Error');
143
+ });
144
+ }
145
+ /**
146
+ * GET /go/:slug/remember/:bookmarkId - Create preference and redirect to bookmark
147
+ * Used from collision page "Always use this" links
148
+ */
149
+ export async function handleGoRemember(req, res) {
150
+ const { slug, bookmarkId } = req.params;
151
+ const authReq = req;
152
+ const userId = authReq.user.id;
153
+ const tenantId = getTenantId(req);
154
+ const orgId = null;
155
+ const hasAccess = await canAccessBookmark(userId, bookmarkId, orgId, tenantId);
156
+ if (!hasAccess) {
157
+ return res.status(403).send('Forbidden');
158
+ }
159
+ const bookmark = await queryOne('SELECT id, url, slug, forwarding_enabled FROM bookmarks WHERE id = ? AND tenant_id = ?', [bookmarkId, tenantId]);
160
+ if (!bookmark || bookmark.slug !== slug || !bookmark.forwarding_enabled) {
161
+ return res.status(404).send('Not Found');
162
+ }
163
+ const urlValidation = validateUrl(bookmark.url);
164
+ if (!urlValidation.valid) {
165
+ return res.status(400).send('Invalid redirect URL');
166
+ }
167
+ await execute(`INSERT INTO slug_preferences (tenant_id, user_id, slug, bookmark_id, updated_at)
168
+ VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
169
+ ON CONFLICT (tenant_id, user_id, slug) DO UPDATE SET bookmark_id = excluded.bookmark_id, updated_at = CURRENT_TIMESTAMP`, [tenantId, userId, slug, bookmarkId]);
170
+ execute(`UPDATE bookmarks SET access_count = COALESCE(access_count, 0) + 1, last_accessed_at = CURRENT_TIMESTAMP WHERE id = ? AND tenant_id = ?`, [bookmarkId, tenantId]).catch((err) => console.error('Failed to track bookmark access:', err));
171
+ return res.redirect(302, bookmark.url);
172
+ }
173
+ // --- API routes (mounted at /api/go) ---
174
+ async function getOwnerName(userId) {
175
+ const row = await queryOne('SELECT name, email FROM users WHERE id = ?', [userId]);
176
+ if (!row)
177
+ return 'Shared';
178
+ const r = row;
179
+ return r.name || r.email || 'Shared';
180
+ }
181
+ /**
182
+ * @swagger
183
+ * /api/go/preferences:
184
+ * get:
185
+ * summary: List slug preferences
186
+ * description: Returns the user's slug-to-bookmark preferences for collision resolution.
187
+ * tags: [Go]
188
+ * security:
189
+ * - cookieAuth: []
190
+ * - bearerAuth: []
191
+ * responses:
192
+ * 200:
193
+ * description: List of slug preferences
194
+ * content:
195
+ * application/json:
196
+ * schema:
197
+ * type: array
198
+ * items:
199
+ * type: object
200
+ * properties:
201
+ * slug:
202
+ * type: string
203
+ * bookmark_id:
204
+ * type: string
205
+ * title:
206
+ * type: string
207
+ * url:
208
+ * type: string
209
+ * workspace:
210
+ * type: string
211
+ * 401:
212
+ * description: Unauthorized
213
+ */
214
+ router.get('/preferences', requireAuth(), async (req, res) => {
215
+ const authReq = req;
216
+ const userId = authReq.user.id;
217
+ const tenantId = getTenantId(req);
218
+ try {
219
+ const rows = await query(`SELECT sp.slug, sp.bookmark_id, sp.created_at, sp.updated_at, b.title, b.url, b.user_id
220
+ FROM slug_preferences sp
221
+ INNER JOIN bookmarks b ON sp.bookmark_id = b.id
222
+ WHERE sp.tenant_id = ? AND sp.user_id = ? AND b.tenant_id = ?
223
+ ORDER BY sp.slug ASC`, [tenantId, userId, tenantId]);
224
+ const list = Array.isArray(rows) ? rows : rows ? [rows] : [];
225
+ const result = await Promise.all(list.map(async (r) => {
226
+ const workspace = r.user_id === userId ? 'Personal' : await getOwnerName(r.user_id);
227
+ return {
228
+ slug: r.slug,
229
+ bookmark_id: r.bookmark_id,
230
+ title: r.title,
231
+ url: r.url,
232
+ workspace,
233
+ created_at: r.created_at,
234
+ updated_at: r.updated_at,
235
+ };
236
+ }));
237
+ res.json(result);
238
+ }
239
+ catch (error) {
240
+ console.error('List preferences error:', error);
241
+ res.status(500).json({ error: 'Internal server error' });
242
+ }
243
+ });
244
+ /**
245
+ * @swagger
246
+ * /api/go/preferences:
247
+ * post:
248
+ * summary: Create or update slug preference
249
+ * description: Sets which bookmark to use when multiple match a slug. User must have access to the bookmark.
250
+ * tags: [Go]
251
+ * security:
252
+ * - cookieAuth: []
253
+ * - bearerAuth: []
254
+ * requestBody:
255
+ * required: true
256
+ * content:
257
+ * application/json:
258
+ * schema:
259
+ * type: object
260
+ * required:
261
+ * - slug
262
+ * - bookmark_id
263
+ * properties:
264
+ * slug:
265
+ * type: string
266
+ * bookmark_id:
267
+ * type: string
268
+ * responses:
269
+ * 201:
270
+ * description: Preference created or updated
271
+ * 400:
272
+ * description: slug and bookmark_id required
273
+ * 401:
274
+ * description: Unauthorized
275
+ * 403:
276
+ * description: Forbidden
277
+ * 404:
278
+ * description: Bookmark not found or slug mismatch
279
+ */
280
+ router.post('/preferences', requireAuth(), async (req, res) => {
281
+ const authReq = req;
282
+ const userId = authReq.user.id;
283
+ const tenantId = getTenantId(req);
284
+ const orgId = null;
285
+ const { slug, bookmark_id } = req.body;
286
+ if (!slug || !bookmark_id) {
287
+ return res.status(400).json({ error: 'slug and bookmark_id are required' });
288
+ }
289
+ const slugVal = validateSlug(slug);
290
+ if (!slugVal.valid) {
291
+ return res.status(400).json({ error: slugVal.error });
292
+ }
293
+ const hasAccess = await canAccessBookmark(userId, bookmark_id, orgId, tenantId);
294
+ if (!hasAccess) {
295
+ return res.status(403).json({ error: 'Forbidden' });
296
+ }
297
+ const bookmark = await queryOne('SELECT id, slug, forwarding_enabled FROM bookmarks WHERE id = ? AND tenant_id = ?', [bookmark_id, tenantId]);
298
+ if (!bookmark || bookmark.slug !== slug || !bookmark.forwarding_enabled) {
299
+ return res.status(404).json({ error: 'Bookmark not found or slug mismatch' });
300
+ }
301
+ try {
302
+ await execute(`INSERT INTO slug_preferences (tenant_id, user_id, slug, bookmark_id, updated_at)
303
+ VALUES (?, ?, ?, ?, CURRENT_TIMESTAMP)
304
+ ON CONFLICT (tenant_id, user_id, slug) DO UPDATE SET bookmark_id = excluded.bookmark_id, updated_at = CURRENT_TIMESTAMP`, [tenantId, userId, slug, bookmark_id]);
305
+ res.status(201).json({ slug, bookmark_id });
306
+ }
307
+ catch (error) {
308
+ console.error('Create preference error:', error);
309
+ res.status(500).json({ error: 'Internal server error' });
310
+ }
311
+ });
312
+ /**
313
+ * @swagger
314
+ * /api/go/preferences/{slug}:
315
+ * delete:
316
+ * summary: Remove slug preference
317
+ * description: Removes the user's preference for a slug.
318
+ * tags: [Go]
319
+ * security:
320
+ * - cookieAuth: []
321
+ * - bearerAuth: []
322
+ * parameters:
323
+ * - in: path
324
+ * name: slug
325
+ * required: true
326
+ * schema:
327
+ * type: string
328
+ * responses:
329
+ * 204:
330
+ * description: Preference removed
331
+ * 400:
332
+ * description: Invalid slug
333
+ * 401:
334
+ * description: Unauthorized
335
+ * 404:
336
+ * description: Preference not found
337
+ */
338
+ router.delete('/preferences/:slug', requireAuth(), async (req, res) => {
339
+ const authReq = req;
340
+ const userId = authReq.user.id;
341
+ const tenantId = getTenantId(req);
342
+ const { slug } = req.params;
343
+ const slugVal = validateSlug(slug);
344
+ if (!slugVal.valid) {
345
+ return res.status(400).json({ error: slugVal.error });
346
+ }
347
+ try {
348
+ const result = await execute('DELETE FROM slug_preferences WHERE tenant_id = ? AND user_id = ? AND slug = ?', [tenantId, userId, slug]);
349
+ const affected = result?.changes ?? result?.rowCount ?? 0;
350
+ if (affected === 0) {
351
+ return res.status(404).json({ error: 'Preference not found' });
352
+ }
353
+ res.status(204).send();
354
+ }
355
+ catch (error) {
356
+ console.error('Delete preference error:', error);
357
+ res.status(500).json({ error: 'Internal server error' });
358
+ }
359
+ });
360
+ export default router;
361
+ //# sourceMappingURL=go.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"go.js","sourceRoot":"","sources":["../../src/routes/go.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Health and version endpoints.
3
+ */
4
+ declare const router: import("express-serve-static-core").Router;
5
+ export default router;
6
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuBH,QAAA,MAAM,MAAM,4CAAW,CAAC;AA2DxB,eAAe,MAAM,CAAC"}
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Health and version endpoints.
3
+ */
4
+ import { readFileSync } from 'fs';
5
+ import { join, dirname } from 'path';
6
+ import { fileURLToPath } from 'url';
7
+ import { Router } from 'express';
8
+ import { mode } from '../config/mode.js';
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ /** Read semantic version from root package.json. Falls back to COMMIT_SHA or 'dev'. */
11
+ function getAppVersion() {
12
+ try {
13
+ const rootPkgPath = join(__dirname, '..', '..', '..', 'package.json');
14
+ const pkg = JSON.parse(readFileSync(rootPkgPath, 'utf-8'));
15
+ return typeof pkg.version === 'string' ? pkg.version : 'dev';
16
+ }
17
+ catch {
18
+ return process.env.COMMIT_SHA || 'dev';
19
+ }
20
+ }
21
+ const appVersion = getAppVersion();
22
+ const router = Router();
23
+ /**
24
+ * @swagger
25
+ * /api/health:
26
+ * get:
27
+ * summary: Health check
28
+ * description: Returns service health status. Public, no auth required.
29
+ * tags: [Health]
30
+ * responses:
31
+ * 200:
32
+ * description: Service is healthy
33
+ * content:
34
+ * application/json:
35
+ * schema:
36
+ * type: object
37
+ * properties:
38
+ * status:
39
+ * type: string
40
+ * example: "ok"
41
+ */
42
+ router.get('/health', (req, res) => {
43
+ res.json({ status: 'ok' });
44
+ });
45
+ /**
46
+ * @swagger
47
+ * /api/version:
48
+ * get:
49
+ * summary: Get version info
50
+ * description: Returns application version, commit SHA, and mode. Public, no auth required.
51
+ * tags: [Health]
52
+ * responses:
53
+ * 200:
54
+ * description: Version information
55
+ * content:
56
+ * application/json:
57
+ * schema:
58
+ * type: object
59
+ * properties:
60
+ * version:
61
+ * type: string
62
+ * description: "Semantic version from package.json (e.g. 1.0.0)"
63
+ * commit:
64
+ * type: string
65
+ * nullable: true
66
+ * description: "Git commit SHA when built in CI, null in dev"
67
+ * mode:
68
+ * type: string
69
+ * description: "'selfhosted' or 'cloud'"
70
+ */
71
+ router.get('/version', (req, res) => {
72
+ res.json({
73
+ version: appVersion,
74
+ commit: process.env.COMMIT_SHA || null,
75
+ mode,
76
+ });
77
+ });
78
+ export default router;
79
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/routes/health.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,uFAAuF;AACvF,SAAS,aAAa;IACpB,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;QACtE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3D,OAAO,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAC/D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,KAAK,CAAC;IACzC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC;AAEnC,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC;AAExB;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACjC,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC7B,CAAC,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IAClC,GAAG,CAAC,IAAI,CAAC;QACP,OAAO,EAAE,UAAU;QACnB,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,IAAI;QACtC,IAAI;KACL,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,eAAe,MAAM,CAAC"}
@@ -0,0 +1,3 @@
1
+ declare const router: import("express-serve-static-core").Router;
2
+ export default router;
3
+ //# sourceMappingURL=invitations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"invitations.d.ts","sourceRoot":"","sources":["../../src/routes/invitations.ts"],"names":[],"mappings":"AAQA,QAAA,MAAM,MAAM,4CAAW,CAAC;AAwLxB,eAAe,MAAM,CAAC"}