@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.
- package/backend/dist/app-factory.d.ts +17 -0
- package/backend/dist/app-factory.d.ts.map +1 -0
- package/backend/dist/app-factory.js +106 -0
- package/backend/dist/app-factory.js.map +1 -0
- package/backend/dist/auth/authorization.d.ts +25 -0
- package/backend/dist/auth/authorization.d.ts.map +1 -0
- package/backend/dist/auth/authorization.js +100 -0
- package/backend/dist/auth/authorization.js.map +1 -0
- package/backend/dist/auth/jwt.d.ts +5 -0
- package/backend/dist/auth/jwt.d.ts.map +1 -0
- package/backend/dist/auth/jwt.js +34 -0
- package/backend/dist/auth/jwt.js.map +1 -0
- package/backend/dist/auth/oidc.d.ts +4 -0
- package/backend/dist/auth/oidc.d.ts.map +1 -0
- package/backend/dist/auth/oidc.js +201 -0
- package/backend/dist/auth/oidc.js.map +1 -0
- package/backend/dist/config/cloud-providers.d.ts +18 -0
- package/backend/dist/config/cloud-providers.d.ts.map +1 -0
- package/backend/dist/config/cloud-providers.js +60 -0
- package/backend/dist/config/cloud-providers.js.map +1 -0
- package/backend/dist/config/cookies.d.ts +17 -0
- package/backend/dist/config/cookies.d.ts.map +1 -0
- package/backend/dist/config/cookies.js +26 -0
- package/backend/dist/config/cookies.js.map +1 -0
- package/backend/dist/config/mode.d.ts +7 -0
- package/backend/dist/config/mode.d.ts.map +1 -0
- package/backend/dist/config/mode.js +7 -0
- package/backend/dist/config/mode.js.map +1 -0
- package/backend/dist/config/swagger.d.ts +2 -0
- package/backend/dist/config/swagger.d.ts.map +1 -0
- package/backend/dist/config/swagger.js +76 -0
- package/backend/dist/config/swagger.js.map +1 -0
- package/backend/dist/config.d.ts +29 -0
- package/backend/dist/config.d.ts.map +1 -0
- package/backend/dist/config.js +41 -0
- package/backend/dist/config.js.map +1 -0
- package/backend/dist/db/index.d.ts +14 -0
- package/backend/dist/db/index.d.ts.map +1 -0
- package/backend/dist/db/index.js +114 -0
- package/backend/dist/db/index.js.map +1 -0
- package/backend/dist/db/migrate-slug-nullable.d.ts +10 -0
- package/backend/dist/db/migrate-slug-nullable.d.ts.map +1 -0
- package/backend/dist/db/migrate-slug-nullable.js +87 -0
- package/backend/dist/db/migrate-slug-nullable.js.map +1 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts +10 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.d.ts.map +1 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.js +103 -0
- package/backend/dist/db/migrations/001_migrate_slug_nullable.js.map +1 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts +11 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.d.ts.map +1 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js +92 -0
- package/backend/dist/db/migrations/002_add_oidc_custom_endpoints.js.map +1 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.d.ts +5 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.d.ts.map +1 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.js +98 -0
- package/backend/dist/db/migrations/003_add_bookmark_features.js.map +1 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts +12 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.d.ts.map +1 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.js +152 -0
- package/backend/dist/db/migrations/004_make_slug_globally_unique.js.map +1 -0
- package/backend/dist/db/migrations/005_add_email_verification.d.ts +5 -0
- package/backend/dist/db/migrations/005_add_email_verification.d.ts.map +1 -0
- package/backend/dist/db/migrations/005_add_email_verification.js +102 -0
- package/backend/dist/db/migrations/005_add_email_verification.js.map +1 -0
- package/backend/dist/db/migrations/006_refresh_tokens.d.ts +9 -0
- package/backend/dist/db/migrations/006_refresh_tokens.d.ts.map +1 -0
- package/backend/dist/db/migrations/006_refresh_tokens.js +61 -0
- package/backend/dist/db/migrations/006_refresh_tokens.js.map +1 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.js +40 -0
- package/backend/dist/db/migrations/007_password_reset_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/008_slug_preferences.d.ts +8 -0
- package/backend/dist/db/migrations/008_slug_preferences.d.ts.map +1 -0
- package/backend/dist/db/migrations/008_slug_preferences.js +24 -0
- package/backend/dist/db/migrations/008_slug_preferences.js.map +1 -0
- package/backend/dist/db/migrations/009_signup_email_verified.d.ts +5 -0
- package/backend/dist/db/migrations/009_signup_email_verified.d.ts.map +1 -0
- package/backend/dist/db/migrations/009_signup_email_verified.js +79 -0
- package/backend/dist/db/migrations/009_signup_email_verified.js.map +1 -0
- package/backend/dist/db/migrations/010_organizations.d.ts +5 -0
- package/backend/dist/db/migrations/010_organizations.d.ts.map +1 -0
- package/backend/dist/db/migrations/010_organizations.js +113 -0
- package/backend/dist/db/migrations/010_organizations.js.map +1 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.d.ts +11 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.d.ts.map +1 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.js +59 -0
- package/backend/dist/db/migrations/011_org_scoped_teams.js.map +1 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.js +40 -0
- package/backend/dist/db/migrations/012_org_invitations_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.js +39 -0
- package/backend/dist/db/migrations/013_signup_verification_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/014_stats_indexes.d.ts +8 -0
- package/backend/dist/db/migrations/014_stats_indexes.d.ts.map +1 -0
- package/backend/dist/db/migrations/014_stats_indexes.js +19 -0
- package/backend/dist/db/migrations/014_stats_indexes.js.map +1 -0
- package/backend/dist/db/migrations/015_api_tokens.d.ts +9 -0
- package/backend/dist/db/migrations/015_api_tokens.d.ts.map +1 -0
- package/backend/dist/db/migrations/015_api_tokens.js +48 -0
- package/backend/dist/db/migrations/015_api_tokens.js.map +1 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts +9 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.d.ts.map +1 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js +50 -0
- package/backend/dist/db/migrations/016_free_plan_grace_ends_at.js.map +1 -0
- package/backend/dist/db/migrations/017_ai_suggestions.d.ts +11 -0
- package/backend/dist/db/migrations/017_ai_suggestions.d.ts.map +1 -0
- package/backend/dist/db/migrations/017_ai_suggestions.js +78 -0
- package/backend/dist/db/migrations/017_ai_suggestions.js.map +1 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts +10 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.d.ts.map +1 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.js +89 -0
- package/backend/dist/db/migrations/018_ai_cache_output_language.js.map +1 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts +10 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.d.ts.map +1 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.js +47 -0
- package/backend/dist/db/migrations/019_ai_suggestion_usage.js.map +1 -0
- package/backend/dist/db/migrations/020_tenant_scope.d.ts +5 -0
- package/backend/dist/db/migrations/020_tenant_scope.d.ts.map +1 -0
- package/backend/dist/db/migrations/020_tenant_scope.js +105 -0
- package/backend/dist/db/migrations/020_tenant_scope.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts +5 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js +113 -0
- package/backend/dist/db/migrations/_legacy_cloud_010_organizations.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts +11 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js +59 -0
- package/backend/dist/db/migrations/_legacy_cloud_011_org_scoped_teams.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts +10 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js +40 -0
- package/backend/dist/db/migrations/_legacy_cloud_012_org_invitations_token_hash.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts +9 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js +50 -0
- package/backend/dist/db/migrations/_legacy_cloud_016_free_plan_grace_ends_at.js.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts +11 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.d.ts.map +1 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js +78 -0
- package/backend/dist/db/migrations/_legacy_cloud_017_ai_suggestions.js.map +1 -0
- package/backend/dist/db/migrations/index.d.ts +22 -0
- package/backend/dist/db/migrations/index.d.ts.map +1 -0
- package/backend/dist/db/migrations/index.js +194 -0
- package/backend/dist/db/migrations/index.js.map +1 -0
- package/backend/dist/db/pool.d.ts +13 -0
- package/backend/dist/db/pool.d.ts.map +1 -0
- package/backend/dist/db/pool.js +41 -0
- package/backend/dist/db/pool.js.map +1 -0
- package/backend/dist/db/seed-data.d.ts +66 -0
- package/backend/dist/db/seed-data.d.ts.map +1 -0
- package/backend/dist/db/seed-data.js +394 -0
- package/backend/dist/db/seed-data.js.map +1 -0
- package/backend/dist/db/seed.d.ts +19 -0
- package/backend/dist/db/seed.d.ts.map +1 -0
- package/backend/dist/db/seed.js +406 -0
- package/backend/dist/db/seed.js.map +1 -0
- package/backend/dist/index.d.ts +3 -0
- package/backend/dist/index.d.ts.map +1 -0
- package/backend/dist/index.js +64 -0
- package/backend/dist/index.js.map +1 -0
- package/backend/dist/instrument.d.ts +2 -0
- package/backend/dist/instrument.d.ts.map +1 -0
- package/backend/dist/instrument.js +16 -0
- package/backend/dist/instrument.js.map +1 -0
- package/backend/dist/load-env.d.ts +2 -0
- package/backend/dist/load-env.d.ts.map +1 -0
- package/backend/dist/load-env.js +33 -0
- package/backend/dist/load-env.js.map +1 -0
- package/backend/dist/middleware/auth.d.ts +23 -0
- package/backend/dist/middleware/auth.d.ts.map +1 -0
- package/backend/dist/middleware/auth.js +69 -0
- package/backend/dist/middleware/auth.js.map +1 -0
- package/backend/dist/middleware/error-handler.d.ts +11 -0
- package/backend/dist/middleware/error-handler.d.ts.map +1 -0
- package/backend/dist/middleware/error-handler.js +40 -0
- package/backend/dist/middleware/error-handler.js.map +1 -0
- package/backend/dist/middleware/security.d.ts +26 -0
- package/backend/dist/middleware/security.d.ts.map +1 -0
- package/backend/dist/middleware/security.js +162 -0
- package/backend/dist/middleware/security.js.map +1 -0
- package/backend/dist/middleware/stats-auth.d.ts +7 -0
- package/backend/dist/middleware/stats-auth.d.ts.map +1 -0
- package/backend/dist/middleware/stats-auth.js +20 -0
- package/backend/dist/middleware/stats-auth.js.map +1 -0
- package/backend/dist/middleware/tenant.d.ts +3 -0
- package/backend/dist/middleware/tenant.d.ts.map +1 -0
- package/backend/dist/middleware/tenant.js +13 -0
- package/backend/dist/middleware/tenant.js.map +1 -0
- package/backend/dist/register-routes.d.ts +12 -0
- package/backend/dist/register-routes.d.ts.map +1 -0
- package/backend/dist/register-routes.js +59 -0
- package/backend/dist/register-routes.js.map +1 -0
- package/backend/dist/routes/admin/demo-reset.d.ts +8 -0
- package/backend/dist/routes/admin/demo-reset.d.ts.map +1 -0
- package/backend/dist/routes/admin/demo-reset.js +66 -0
- package/backend/dist/routes/admin/demo-reset.js.map +1 -0
- package/backend/dist/routes/admin/settings.d.ts +3 -0
- package/backend/dist/routes/admin/settings.d.ts.map +1 -0
- package/backend/dist/routes/admin/settings.js +452 -0
- package/backend/dist/routes/admin/settings.js.map +1 -0
- package/backend/dist/routes/admin/stats.d.ts +7 -0
- package/backend/dist/routes/admin/stats.d.ts.map +1 -0
- package/backend/dist/routes/admin/stats.js +66 -0
- package/backend/dist/routes/admin/stats.js.map +1 -0
- package/backend/dist/routes/admin/teams.d.ts +3 -0
- package/backend/dist/routes/admin/teams.d.ts.map +1 -0
- package/backend/dist/routes/admin/teams.js +509 -0
- package/backend/dist/routes/admin/teams.js.map +1 -0
- package/backend/dist/routes/admin/users.d.ts +3 -0
- package/backend/dist/routes/admin/users.d.ts.map +1 -0
- package/backend/dist/routes/admin/users.js +525 -0
- package/backend/dist/routes/admin/users.js.map +1 -0
- package/backend/dist/routes/auth.d.ts +3 -0
- package/backend/dist/routes/auth.d.ts.map +1 -0
- package/backend/dist/routes/auth.js +992 -0
- package/backend/dist/routes/auth.js.map +1 -0
- package/backend/dist/routes/billing.d.ts +8 -0
- package/backend/dist/routes/billing.d.ts.map +1 -0
- package/backend/dist/routes/billing.js +481 -0
- package/backend/dist/routes/billing.js.map +1 -0
- package/backend/dist/routes/bookmarks.d.ts +3 -0
- package/backend/dist/routes/bookmarks.d.ts.map +1 -0
- package/backend/dist/routes/bookmarks.js +1593 -0
- package/backend/dist/routes/bookmarks.js.map +1 -0
- package/backend/dist/routes/config.d.ts +7 -0
- package/backend/dist/routes/config.d.ts.map +1 -0
- package/backend/dist/routes/config.js +52 -0
- package/backend/dist/routes/config.js.map +1 -0
- package/backend/dist/routes/contact.d.ts +9 -0
- package/backend/dist/routes/contact.d.ts.map +1 -0
- package/backend/dist/routes/contact.js +99 -0
- package/backend/dist/routes/contact.js.map +1 -0
- package/backend/dist/routes/csrf.d.ts +3 -0
- package/backend/dist/routes/csrf.d.ts.map +1 -0
- package/backend/dist/routes/csrf.js +39 -0
- package/backend/dist/routes/csrf.js.map +1 -0
- package/backend/dist/routes/dashboard.d.ts +3 -0
- package/backend/dist/routes/dashboard.d.ts.map +1 -0
- package/backend/dist/routes/dashboard.js +212 -0
- package/backend/dist/routes/dashboard.js.map +1 -0
- package/backend/dist/routes/email-verification.d.ts +3 -0
- package/backend/dist/routes/email-verification.d.ts.map +1 -0
- package/backend/dist/routes/email-verification.js +124 -0
- package/backend/dist/routes/email-verification.js.map +1 -0
- package/backend/dist/routes/folders.d.ts +3 -0
- package/backend/dist/routes/folders.d.ts.map +1 -0
- package/backend/dist/routes/folders.js +524 -0
- package/backend/dist/routes/folders.js.map +1 -0
- package/backend/dist/routes/go-helpers.d.ts +18 -0
- package/backend/dist/routes/go-helpers.d.ts.map +1 -0
- package/backend/dist/routes/go-helpers.js +64 -0
- package/backend/dist/routes/go-helpers.js.map +1 -0
- package/backend/dist/routes/go.d.ts +23 -0
- package/backend/dist/routes/go.d.ts.map +1 -0
- package/backend/dist/routes/go.js +361 -0
- package/backend/dist/routes/go.js.map +1 -0
- package/backend/dist/routes/health.d.ts +6 -0
- package/backend/dist/routes/health.d.ts.map +1 -0
- package/backend/dist/routes/health.js +79 -0
- package/backend/dist/routes/health.js.map +1 -0
- package/backend/dist/routes/invitations.d.ts +3 -0
- package/backend/dist/routes/invitations.d.ts.map +1 -0
- package/backend/dist/routes/invitations.js +172 -0
- package/backend/dist/routes/invitations.js.map +1 -0
- package/backend/dist/routes/oidc-providers.d.ts +3 -0
- package/backend/dist/routes/oidc-providers.d.ts.map +1 -0
- package/backend/dist/routes/oidc-providers.js +495 -0
- package/backend/dist/routes/oidc-providers.js.map +1 -0
- package/backend/dist/routes/organizations.d.ts +3 -0
- package/backend/dist/routes/organizations.d.ts.map +1 -0
- package/backend/dist/routes/organizations.js +538 -0
- package/backend/dist/routes/organizations.js.map +1 -0
- package/backend/dist/routes/password-reset.d.ts +3 -0
- package/backend/dist/routes/password-reset.d.ts.map +1 -0
- package/backend/dist/routes/password-reset.js +212 -0
- package/backend/dist/routes/password-reset.js.map +1 -0
- package/backend/dist/routes/redirect.d.ts +3 -0
- package/backend/dist/routes/redirect.d.ts.map +1 -0
- package/backend/dist/routes/redirect.js +124 -0
- package/backend/dist/routes/redirect.js.map +1 -0
- package/backend/dist/routes/tags.d.ts +3 -0
- package/backend/dist/routes/tags.d.ts.map +1 -0
- package/backend/dist/routes/tags.js +302 -0
- package/backend/dist/routes/tags.js.map +1 -0
- package/backend/dist/routes/teams.d.ts +3 -0
- package/backend/dist/routes/teams.d.ts.map +1 -0
- package/backend/dist/routes/teams.js +60 -0
- package/backend/dist/routes/teams.js.map +1 -0
- package/backend/dist/routes/tokens.d.ts +3 -0
- package/backend/dist/routes/tokens.d.ts.map +1 -0
- package/backend/dist/routes/tokens.js +157 -0
- package/backend/dist/routes/tokens.js.map +1 -0
- package/backend/dist/routes/users.d.ts +3 -0
- package/backend/dist/routes/users.d.ts.map +1 -0
- package/backend/dist/routes/users.js +199 -0
- package/backend/dist/routes/users.js.map +1 -0
- package/backend/dist/services/ai-suggestions.d.ts +29 -0
- package/backend/dist/services/ai-suggestions.d.ts.map +1 -0
- package/backend/dist/services/ai-suggestions.js +163 -0
- package/backend/dist/services/ai-suggestions.js.map +1 -0
- package/backend/dist/services/api-tokens.d.ts +66 -0
- package/backend/dist/services/api-tokens.d.ts.map +1 -0
- package/backend/dist/services/api-tokens.js +129 -0
- package/backend/dist/services/api-tokens.js.map +1 -0
- package/backend/dist/services/fetch-page-metadata.d.ts +15 -0
- package/backend/dist/services/fetch-page-metadata.d.ts.map +1 -0
- package/backend/dist/services/fetch-page-metadata.js +205 -0
- package/backend/dist/services/fetch-page-metadata.js.map +1 -0
- package/backend/dist/services/stats.d.ts +73 -0
- package/backend/dist/services/stats.d.ts.map +1 -0
- package/backend/dist/services/stats.js +145 -0
- package/backend/dist/services/stats.js.map +1 -0
- package/backend/dist/types/oidc-provider.d.ts +17 -0
- package/backend/dist/types/oidc-provider.d.ts.map +1 -0
- package/backend/dist/types/oidc-provider.js +2 -0
- package/backend/dist/types/oidc-provider.js.map +1 -0
- package/backend/dist/types.d.ts +86 -0
- package/backend/dist/types.d.ts.map +1 -0
- package/backend/dist/types.js +2 -0
- package/backend/dist/types.js.map +1 -0
- package/backend/dist/utils/ai-feature.d.ts +23 -0
- package/backend/dist/utils/ai-feature.d.ts.map +1 -0
- package/backend/dist/utils/ai-feature.js +62 -0
- package/backend/dist/utils/ai-feature.js.map +1 -0
- package/backend/dist/utils/email.d.ts +40 -0
- package/backend/dist/utils/email.d.ts.map +1 -0
- package/backend/dist/utils/email.js +456 -0
- package/backend/dist/utils/email.js.map +1 -0
- package/backend/dist/utils/encryption.d.ts +18 -0
- package/backend/dist/utils/encryption.d.ts.map +1 -0
- package/backend/dist/utils/encryption.js +95 -0
- package/backend/dist/utils/encryption.js.map +1 -0
- package/backend/dist/utils/env-validation.d.ts +6 -0
- package/backend/dist/utils/env-validation.d.ts.map +1 -0
- package/backend/dist/utils/env-validation.js +51 -0
- package/backend/dist/utils/env-validation.js.map +1 -0
- package/backend/dist/utils/jwt.d.ts +20 -0
- package/backend/dist/utils/jwt.d.ts.map +1 -0
- package/backend/dist/utils/jwt.js +48 -0
- package/backend/dist/utils/jwt.js.map +1 -0
- package/backend/dist/utils/org-cleanup.d.ts +6 -0
- package/backend/dist/utils/org-cleanup.d.ts.map +1 -0
- package/backend/dist/utils/org-cleanup.js +37 -0
- package/backend/dist/utils/org-cleanup.js.map +1 -0
- package/backend/dist/utils/organizations.d.ts +12 -0
- package/backend/dist/utils/organizations.d.ts.map +1 -0
- package/backend/dist/utils/organizations.js +24 -0
- package/backend/dist/utils/organizations.js.map +1 -0
- package/backend/dist/utils/plan-errors.d.ts +18 -0
- package/backend/dist/utils/plan-errors.d.ts.map +1 -0
- package/backend/dist/utils/plan-errors.js +21 -0
- package/backend/dist/utils/plan-errors.js.map +1 -0
- package/backend/dist/utils/refresh-token.d.ts +31 -0
- package/backend/dist/utils/refresh-token.d.ts.map +1 -0
- package/backend/dist/utils/refresh-token.js +63 -0
- package/backend/dist/utils/refresh-token.js.map +1 -0
- package/backend/dist/utils/session-store.d.ts +46 -0
- package/backend/dist/utils/session-store.d.ts.map +1 -0
- package/backend/dist/utils/session-store.js +222 -0
- package/backend/dist/utils/session-store.js.map +1 -0
- package/backend/dist/utils/tenant.d.ts +5 -0
- package/backend/dist/utils/tenant.d.ts.map +1 -0
- package/backend/dist/utils/tenant.js +12 -0
- package/backend/dist/utils/tenant.js.map +1 -0
- package/backend/dist/utils/user-key.d.ts +24 -0
- package/backend/dist/utils/user-key.d.ts.map +1 -0
- package/backend/dist/utils/user-key.js +116 -0
- package/backend/dist/utils/user-key.js.map +1 -0
- package/backend/dist/utils/validation.d.ts +91 -0
- package/backend/dist/utils/validation.d.ts.map +1 -0
- package/backend/dist/utils/validation.js +337 -0
- package/backend/dist/utils/validation.js.map +1 -0
- package/backend/index.js +15 -0
- package/frontend/index.js +5 -0
- package/frontend/index.tsx +7 -0
- package/package.json +16 -0
- package/types/index.js +4 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats aggregation service for admin metrics (selfhost-core).
|
|
3
|
+
* All metrics are tenant-scoped to the default tenant.
|
|
4
|
+
*/
|
|
5
|
+
/** Core counts: users, bookmarks, folders, tags, shares */
|
|
6
|
+
export declare function getCoreCounts(): Promise<{
|
|
7
|
+
users_total: number;
|
|
8
|
+
bookmarks_total: number;
|
|
9
|
+
folders_total: number;
|
|
10
|
+
tags_total: number;
|
|
11
|
+
shares_total: number;
|
|
12
|
+
}>;
|
|
13
|
+
/** Selfhost breakdowns */
|
|
14
|
+
export declare function getBreakdowns(): Promise<{
|
|
15
|
+
shares_by_type: {
|
|
16
|
+
team: number;
|
|
17
|
+
user: number;
|
|
18
|
+
};
|
|
19
|
+
}>;
|
|
20
|
+
/** Active users: distinct users with bookmark last_accessed_at in window */
|
|
21
|
+
export declare function getActivity(): Promise<{
|
|
22
|
+
active_users_7d: number;
|
|
23
|
+
active_users_30d: number;
|
|
24
|
+
}>;
|
|
25
|
+
/** Distributions: bookmarks/folders/tags per user (p50, p90, p95, max) */
|
|
26
|
+
export declare function getDistributions(): Promise<{
|
|
27
|
+
bookmarks_per_user: {
|
|
28
|
+
p50: number;
|
|
29
|
+
p90: number;
|
|
30
|
+
p95: number;
|
|
31
|
+
max: number;
|
|
32
|
+
};
|
|
33
|
+
folders_per_user: {
|
|
34
|
+
p50: number;
|
|
35
|
+
p90: number;
|
|
36
|
+
p95: number;
|
|
37
|
+
max: number;
|
|
38
|
+
};
|
|
39
|
+
tags_per_user: {
|
|
40
|
+
p50: number;
|
|
41
|
+
p90: number;
|
|
42
|
+
p95: number;
|
|
43
|
+
max: number;
|
|
44
|
+
};
|
|
45
|
+
}>;
|
|
46
|
+
/** Timeseries: users and bookmarks per day for last 30d and 90d */
|
|
47
|
+
export declare function getTimeseries(): Promise<{
|
|
48
|
+
users_30d: Array<{
|
|
49
|
+
day: string;
|
|
50
|
+
count: number;
|
|
51
|
+
}>;
|
|
52
|
+
users_90d: Array<{
|
|
53
|
+
day: string;
|
|
54
|
+
count: number;
|
|
55
|
+
}>;
|
|
56
|
+
bookmarks_30d: Array<{
|
|
57
|
+
day: string;
|
|
58
|
+
count: number;
|
|
59
|
+
}>;
|
|
60
|
+
bookmarks_90d: Array<{
|
|
61
|
+
day: string;
|
|
62
|
+
count: number;
|
|
63
|
+
}>;
|
|
64
|
+
}>;
|
|
65
|
+
/** Aggregate all stats */
|
|
66
|
+
export declare function aggregateStats(): Promise<{
|
|
67
|
+
core_counts: Awaited<ReturnType<typeof getCoreCounts>>;
|
|
68
|
+
breakdowns: Awaited<ReturnType<typeof getBreakdowns>>;
|
|
69
|
+
activity: Awaited<ReturnType<typeof getActivity>>;
|
|
70
|
+
distributions: Awaited<ReturnType<typeof getDistributions>>;
|
|
71
|
+
timeseries: Awaited<ReturnType<typeof getTimeseries>>;
|
|
72
|
+
}>;
|
|
73
|
+
//# sourceMappingURL=stats.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,2DAA2D;AAC3D,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC,CA0BD;AAED,0BAA0B;AAC1B,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,cAAc,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD,CAAC,CAKD;AAmBD,4EAA4E;AAC5E,wBAAsB,WAAW,IAAI,OAAO,CAAC;IAAE,eAAe,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAqBlG;AAYD,0EAA0E;AAC1E,wBAAsB,gBAAgB,IAAI,OAAO,CAAC;IAChD,kBAAkB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC3E,gBAAgB,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,aAAa,EAAE;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE,CAAC,CAmCD;AAED,mEAAmE;AACnE,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAC7C,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,SAAS,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACjD,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACrD,aAAa,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACtD,CAAC,CA+BD;AAED,0BAA0B;AAC1B,wBAAsB,cAAc,IAAI,OAAO,CAAC;IAC9C,WAAW,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IACvD,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;IACtD,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC,CAAC;IAClD,aAAa,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC,CAAC;IAC5D,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC;CACvD,CAAC,CAgBD"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Stats aggregation service for admin metrics (selfhost-core).
|
|
3
|
+
* All metrics are tenant-scoped to the default tenant.
|
|
4
|
+
*/
|
|
5
|
+
import { query, queryOne } from '../db/index.js';
|
|
6
|
+
import { DEFAULT_TENANT_ID } from '../utils/tenant.js';
|
|
7
|
+
const DB_TYPE = process.env.DB_TYPE || 'sqlite';
|
|
8
|
+
function parseIntOrZero(val) {
|
|
9
|
+
if (val === null || val === undefined)
|
|
10
|
+
return 0;
|
|
11
|
+
const n = parseInt(String(val), 10);
|
|
12
|
+
return isNaN(n) ? 0 : n;
|
|
13
|
+
}
|
|
14
|
+
/** Core counts: users, bookmarks, folders, tags, shares */
|
|
15
|
+
export async function getCoreCounts() {
|
|
16
|
+
const [usersRes, bookmarksRes, foldersRes, tagsRes, teamSharesRes, userSharesRes] = await Promise.all([
|
|
17
|
+
queryOne('SELECT COUNT(*) as c FROM users', []),
|
|
18
|
+
queryOne('SELECT COUNT(*) as c FROM bookmarks WHERE tenant_id = ?', [DEFAULT_TENANT_ID]),
|
|
19
|
+
queryOne('SELECT COUNT(*) as c FROM folders WHERE tenant_id = ?', [DEFAULT_TENANT_ID]),
|
|
20
|
+
queryOne('SELECT COUNT(*) as c FROM tags WHERE tenant_id = ?', [DEFAULT_TENANT_ID]),
|
|
21
|
+
queryOne('SELECT (SELECT COUNT(*) FROM bookmark_team_shares WHERE tenant_id = ?) + (SELECT COUNT(*) FROM folder_team_shares WHERE tenant_id = ?) as c', [DEFAULT_TENANT_ID, DEFAULT_TENANT_ID]),
|
|
22
|
+
queryOne('SELECT (SELECT COUNT(*) FROM bookmark_user_shares WHERE tenant_id = ?) + (SELECT COUNT(*) FROM folder_user_shares WHERE tenant_id = ?) as c', [DEFAULT_TENANT_ID, DEFAULT_TENANT_ID]),
|
|
23
|
+
]);
|
|
24
|
+
const teamShares = parseIntOrZero(teamSharesRes?.c);
|
|
25
|
+
const userShares = parseIntOrZero(userSharesRes?.c);
|
|
26
|
+
return {
|
|
27
|
+
users_total: parseIntOrZero(usersRes?.c),
|
|
28
|
+
bookmarks_total: parseIntOrZero(bookmarksRes?.c),
|
|
29
|
+
folders_total: parseIntOrZero(foldersRes?.c),
|
|
30
|
+
tags_total: parseIntOrZero(tagsRes?.c),
|
|
31
|
+
shares_total: teamShares + userShares,
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/** Selfhost breakdowns */
|
|
35
|
+
export async function getBreakdowns() {
|
|
36
|
+
const sharesByType = await getSharesByType();
|
|
37
|
+
return {
|
|
38
|
+
shares_by_type: sharesByType,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
async function getSharesByType() {
|
|
42
|
+
const [teamRes, userRes] = await Promise.all([
|
|
43
|
+
queryOne('SELECT (SELECT COUNT(*) FROM bookmark_team_shares WHERE tenant_id = ?) + (SELECT COUNT(*) FROM folder_team_shares WHERE tenant_id = ?) as c', [DEFAULT_TENANT_ID, DEFAULT_TENANT_ID]),
|
|
44
|
+
queryOne('SELECT (SELECT COUNT(*) FROM bookmark_user_shares WHERE tenant_id = ?) + (SELECT COUNT(*) FROM folder_user_shares WHERE tenant_id = ?) as c', [DEFAULT_TENANT_ID, DEFAULT_TENANT_ID]),
|
|
45
|
+
]);
|
|
46
|
+
return {
|
|
47
|
+
team: parseIntOrZero(teamRes?.c),
|
|
48
|
+
user: parseIntOrZero(userRes?.c),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Active users: distinct users with bookmark last_accessed_at in window */
|
|
52
|
+
export async function getActivity() {
|
|
53
|
+
const isPg = DB_TYPE === 'postgresql';
|
|
54
|
+
const since7d = isPg ? "now() - interval '7 days'" : "datetime('now', '-7 days')";
|
|
55
|
+
const since30d = isPg ? "now() - interval '30 days'" : "datetime('now', '-30 days')";
|
|
56
|
+
const [res7d, res30d] = await Promise.all([
|
|
57
|
+
queryOne(`SELECT COUNT(DISTINCT user_id) as c FROM bookmarks WHERE tenant_id = ? AND last_accessed_at >= ${since7d}`, [DEFAULT_TENANT_ID]),
|
|
58
|
+
queryOne(`SELECT COUNT(DISTINCT user_id) as c FROM bookmarks WHERE tenant_id = ? AND last_accessed_at >= ${since30d}`, [DEFAULT_TENANT_ID]),
|
|
59
|
+
]);
|
|
60
|
+
return {
|
|
61
|
+
active_users_7d: parseIntOrZero(res7d?.c),
|
|
62
|
+
active_users_30d: parseIntOrZero(res30d?.c),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
/** Percentile from sorted array */
|
|
66
|
+
function percentile(sorted, p) {
|
|
67
|
+
if (sorted.length === 0)
|
|
68
|
+
return 0;
|
|
69
|
+
const idx = (p / 100) * (sorted.length - 1);
|
|
70
|
+
const lo = Math.floor(idx);
|
|
71
|
+
const hi = Math.ceil(idx);
|
|
72
|
+
if (lo === hi)
|
|
73
|
+
return sorted[lo];
|
|
74
|
+
return sorted[lo] + (idx - lo) * (sorted[hi] - sorted[lo]);
|
|
75
|
+
}
|
|
76
|
+
/** Distributions: bookmarks/folders/tags per user (p50, p90, p95, max) */
|
|
77
|
+
export async function getDistributions() {
|
|
78
|
+
const [bookmarkCounts, folderCounts, tagCounts] = await Promise.all([
|
|
79
|
+
query('SELECT user_id, COUNT(*) as cnt FROM bookmarks WHERE tenant_id = ? GROUP BY user_id', [DEFAULT_TENANT_ID]),
|
|
80
|
+
query('SELECT user_id, COUNT(*) as cnt FROM folders WHERE tenant_id = ? GROUP BY user_id', [DEFAULT_TENANT_ID]),
|
|
81
|
+
query('SELECT user_id, COUNT(*) as cnt FROM tags WHERE tenant_id = ? GROUP BY user_id', [DEFAULT_TENANT_ID]),
|
|
82
|
+
]);
|
|
83
|
+
const toPercentiles = (rows) => {
|
|
84
|
+
const counts = rows.map((r) => parseIntOrZero(r.cnt)).sort((a, b) => a - b);
|
|
85
|
+
return {
|
|
86
|
+
p50: percentile(counts, 50),
|
|
87
|
+
p90: percentile(counts, 90),
|
|
88
|
+
p95: percentile(counts, 95),
|
|
89
|
+
max: counts.length > 0 ? Math.max(...counts) : 0,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
92
|
+
const bList = Array.isArray(bookmarkCounts) ? bookmarkCounts : [];
|
|
93
|
+
const fList = Array.isArray(folderCounts) ? folderCounts : [];
|
|
94
|
+
const tList = Array.isArray(tagCounts) ? tagCounts : [];
|
|
95
|
+
return {
|
|
96
|
+
bookmarks_per_user: toPercentiles(bList),
|
|
97
|
+
folders_per_user: toPercentiles(fList),
|
|
98
|
+
tags_per_user: toPercentiles(tList),
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/** Timeseries: users and bookmarks per day for last 30d and 90d */
|
|
102
|
+
export async function getTimeseries() {
|
|
103
|
+
const isPg = DB_TYPE === 'postgresql';
|
|
104
|
+
const dayExpr = isPg ? "date_trunc('day', created_at)::date" : "date(created_at)";
|
|
105
|
+
const since30d = isPg ? "now() - interval '30 days'" : "datetime('now', '-30 days')";
|
|
106
|
+
const since90d = isPg ? "now() - interval '90 days'" : "datetime('now', '-90 days')";
|
|
107
|
+
const users30Sql = `SELECT ${dayExpr} as day, COUNT(*) as count FROM users WHERE created_at >= ${since30d} GROUP BY 1 ORDER BY 1`;
|
|
108
|
+
const users90Sql = `SELECT ${dayExpr} as day, COUNT(*) as count FROM users WHERE created_at >= ${since90d} GROUP BY 1 ORDER BY 1`;
|
|
109
|
+
const bookmarks30Sql = `SELECT ${dayExpr} as day, COUNT(*) as count FROM bookmarks WHERE tenant_id = ? AND created_at >= ${since30d} GROUP BY 1 ORDER BY 1`;
|
|
110
|
+
const bookmarks90Sql = `SELECT ${dayExpr} as day, COUNT(*) as count FROM bookmarks WHERE tenant_id = ? AND created_at >= ${since90d} GROUP BY 1 ORDER BY 1`;
|
|
111
|
+
const [users30, users90, bookmarks30, bookmarks90] = await Promise.all([
|
|
112
|
+
query(users30Sql, []),
|
|
113
|
+
query(users90Sql, []),
|
|
114
|
+
query(bookmarks30Sql, [DEFAULT_TENANT_ID]),
|
|
115
|
+
query(bookmarks90Sql, [DEFAULT_TENANT_ID]),
|
|
116
|
+
]);
|
|
117
|
+
const toSeries = (rows) => (Array.isArray(rows) ? rows : []).map((r) => ({
|
|
118
|
+
day: r.day ? String(r.day).split('T')[0] : '',
|
|
119
|
+
count: parseIntOrZero(r.count),
|
|
120
|
+
}));
|
|
121
|
+
return {
|
|
122
|
+
users_30d: toSeries(users30),
|
|
123
|
+
users_90d: toSeries(users90),
|
|
124
|
+
bookmarks_30d: toSeries(bookmarks30),
|
|
125
|
+
bookmarks_90d: toSeries(bookmarks90),
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
/** Aggregate all stats */
|
|
129
|
+
export async function aggregateStats() {
|
|
130
|
+
const [core_counts, breakdowns, activity, distributions, timeseries] = await Promise.all([
|
|
131
|
+
getCoreCounts(),
|
|
132
|
+
getBreakdowns(),
|
|
133
|
+
getActivity(),
|
|
134
|
+
getDistributions(),
|
|
135
|
+
getTimeseries(),
|
|
136
|
+
]);
|
|
137
|
+
return {
|
|
138
|
+
core_counts,
|
|
139
|
+
breakdowns,
|
|
140
|
+
activity,
|
|
141
|
+
distributions,
|
|
142
|
+
timeseries,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=stats.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/services/stats.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export interface OIDCProviderRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
provider_key: string;
|
|
4
|
+
client_id: string;
|
|
5
|
+
client_secret: string;
|
|
6
|
+
issuer_url: string;
|
|
7
|
+
authorization_url?: string | null;
|
|
8
|
+
token_url?: string | null;
|
|
9
|
+
userinfo_url?: string | null;
|
|
10
|
+
scopes: string;
|
|
11
|
+
auto_create_users: boolean | number | string | null;
|
|
12
|
+
default_role?: string | null;
|
|
13
|
+
}
|
|
14
|
+
export interface OidcConfigProvider {
|
|
15
|
+
getProviders(tenantId: string): Promise<OIDCProviderRecord[]>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=oidc-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.d.ts","sourceRoot":"","sources":["../../src/types/oidc-provider.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACpD,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC;CAC/D"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"oidc-provider.js","sourceRoot":"","sources":["../../src/types/oidc-provider.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
export interface User {
|
|
2
|
+
id: string;
|
|
3
|
+
email: string;
|
|
4
|
+
name: string;
|
|
5
|
+
user_key: string;
|
|
6
|
+
is_admin: boolean;
|
|
7
|
+
oidc_sub?: string;
|
|
8
|
+
oidc_provider?: string;
|
|
9
|
+
language: string;
|
|
10
|
+
theme: string;
|
|
11
|
+
created_at: string;
|
|
12
|
+
}
|
|
13
|
+
export interface OIDCProvider {
|
|
14
|
+
id: string;
|
|
15
|
+
provider_key: string;
|
|
16
|
+
client_id: string;
|
|
17
|
+
client_secret: string;
|
|
18
|
+
issuer_url: string;
|
|
19
|
+
authorization_url?: string;
|
|
20
|
+
token_url?: string;
|
|
21
|
+
userinfo_url?: string;
|
|
22
|
+
scopes: string;
|
|
23
|
+
auto_create_users: boolean;
|
|
24
|
+
default_role: string;
|
|
25
|
+
created_at: string;
|
|
26
|
+
}
|
|
27
|
+
export interface Folder {
|
|
28
|
+
id: string;
|
|
29
|
+
user_id: string;
|
|
30
|
+
name: string;
|
|
31
|
+
created_at: string;
|
|
32
|
+
}
|
|
33
|
+
export interface Tag {
|
|
34
|
+
id: string;
|
|
35
|
+
user_id: string;
|
|
36
|
+
name: string;
|
|
37
|
+
created_at: string;
|
|
38
|
+
}
|
|
39
|
+
export interface Bookmark {
|
|
40
|
+
id: string;
|
|
41
|
+
user_id: string;
|
|
42
|
+
title: string;
|
|
43
|
+
url: string;
|
|
44
|
+
slug: string;
|
|
45
|
+
forwarding_enabled: boolean;
|
|
46
|
+
pinned?: boolean;
|
|
47
|
+
access_count?: number;
|
|
48
|
+
last_accessed_at?: string | null;
|
|
49
|
+
folder_id?: string;
|
|
50
|
+
folder?: Folder;
|
|
51
|
+
tags?: Tag[];
|
|
52
|
+
created_at: string;
|
|
53
|
+
updated_at: string;
|
|
54
|
+
}
|
|
55
|
+
/** Sent by frontend when user saved a bookmark after seeing AI suggestions; used for usage stats. */
|
|
56
|
+
export interface AiSuggestionUsed {
|
|
57
|
+
title?: boolean;
|
|
58
|
+
slug?: boolean;
|
|
59
|
+
tags?: boolean;
|
|
60
|
+
}
|
|
61
|
+
export interface CreateBookmarkInput {
|
|
62
|
+
title: string;
|
|
63
|
+
url: string;
|
|
64
|
+
slug?: string;
|
|
65
|
+
forwarding_enabled: boolean;
|
|
66
|
+
folder_ids?: string[];
|
|
67
|
+
tag_ids?: string[];
|
|
68
|
+
team_ids?: string[];
|
|
69
|
+
user_ids?: string[];
|
|
70
|
+
share_all_teams?: boolean;
|
|
71
|
+
ai_suggestion_used?: AiSuggestionUsed;
|
|
72
|
+
}
|
|
73
|
+
export interface UpdateBookmarkInput {
|
|
74
|
+
title?: string;
|
|
75
|
+
url?: string;
|
|
76
|
+
slug?: string;
|
|
77
|
+
forwarding_enabled?: boolean;
|
|
78
|
+
pinned?: boolean;
|
|
79
|
+
folder_ids?: string[];
|
|
80
|
+
tag_ids?: string[];
|
|
81
|
+
team_ids?: string[];
|
|
82
|
+
user_ids?: string[];
|
|
83
|
+
share_all_teams?: boolean;
|
|
84
|
+
ai_suggestion_used?: AiSuggestionUsed;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI suggestions feature flag logic for self-hosted runtime.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Check if AI feature is available (org/plan/config allows it).
|
|
6
|
+
* Does not consider user-level ai_suggestions_enabled.
|
|
7
|
+
*/
|
|
8
|
+
export declare function isAIFeatureAvailable(userId: string): Promise<boolean>;
|
|
9
|
+
/**
|
|
10
|
+
* Check if AI suggestions are enabled for the user.
|
|
11
|
+
* Returns false if not configured or user opted out.
|
|
12
|
+
*/
|
|
13
|
+
export declare function isAISuggestionsEnabled(userId: string): Promise<boolean>;
|
|
14
|
+
/**
|
|
15
|
+
* Get AI API key for making requests.
|
|
16
|
+
* Reads from system_config and decrypts when needed.
|
|
17
|
+
*/
|
|
18
|
+
export declare function getAIApiKey(): Promise<string | null>;
|
|
19
|
+
/**
|
|
20
|
+
* Get AI model from config. Default gpt-4o-mini.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getAIModel(): Promise<string>;
|
|
23
|
+
//# sourceMappingURL=ai-feature.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-feature.d.ts","sourceRoot":"","sources":["../../src/utils/ai-feature.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAW3E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwB7E;AAED;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAgB1D;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAMlD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI suggestions feature flag logic for self-hosted runtime.
|
|
3
|
+
*/
|
|
4
|
+
import { queryOne } from '../db/index.js';
|
|
5
|
+
/**
|
|
6
|
+
* Check if AI feature is available (org/plan/config allows it).
|
|
7
|
+
* Does not consider user-level ai_suggestions_enabled.
|
|
8
|
+
*/
|
|
9
|
+
export async function isAIFeatureAvailable(userId) {
|
|
10
|
+
const aiEnabled = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_enabled']);
|
|
11
|
+
if (!aiEnabled || aiEnabled.value !== 'true')
|
|
12
|
+
return false;
|
|
13
|
+
const aiApiKey = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_api_key']);
|
|
14
|
+
return !!(aiApiKey && aiApiKey.value);
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Check if AI suggestions are enabled for the user.
|
|
18
|
+
* Returns false if not configured or user opted out.
|
|
19
|
+
*/
|
|
20
|
+
export async function isAISuggestionsEnabled(userId) {
|
|
21
|
+
const userRow = await queryOne('SELECT ai_suggestions_enabled FROM users WHERE id = ?', [userId]);
|
|
22
|
+
const userEnabled = userRow
|
|
23
|
+
? userRow.ai_suggestions_enabled !== 0 && userRow.ai_suggestions_enabled !== false
|
|
24
|
+
: true;
|
|
25
|
+
if (!userEnabled)
|
|
26
|
+
return false;
|
|
27
|
+
const aiEnabled = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_enabled']);
|
|
28
|
+
if (!aiEnabled || aiEnabled.value !== 'true')
|
|
29
|
+
return false;
|
|
30
|
+
const aiApiKey = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_api_key']);
|
|
31
|
+
if (!aiApiKey || !aiApiKey.value)
|
|
32
|
+
return false;
|
|
33
|
+
return true;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Get AI API key for making requests.
|
|
37
|
+
* Reads from system_config and decrypts when needed.
|
|
38
|
+
*/
|
|
39
|
+
export async function getAIApiKey() {
|
|
40
|
+
const row = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_api_key']);
|
|
41
|
+
if (!row || !row.value)
|
|
42
|
+
return null;
|
|
43
|
+
const raw = row.value;
|
|
44
|
+
if (raw.startsWith('sk-') && !raw.includes(':')) {
|
|
45
|
+
return raw;
|
|
46
|
+
}
|
|
47
|
+
try {
|
|
48
|
+
const { decrypt } = await import('./encryption.js');
|
|
49
|
+
return decrypt(raw);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return raw;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Get AI model from config. Default gpt-4o-mini.
|
|
57
|
+
*/
|
|
58
|
+
export async function getAIModel() {
|
|
59
|
+
const row = await queryOne('SELECT value FROM system_config WHERE key = ?', ['ai_model']);
|
|
60
|
+
return (row && row.value) ? String(row.value) : 'gpt-4o-mini';
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=ai-feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-feature.js","sourceRoot":"","sources":["../../src/utils/ai-feature.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,MAAc;IACvD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,+CAA+C,EAC/C,CAAC,YAAY,CAAC,CACf,CAAC;IACF,IAAI,CAAC,SAAS,IAAK,SAAiB,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACpE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,+CAA+C,EAC/C,CAAC,YAAY,CAAC,CACf,CAAC;IACF,OAAO,CAAC,CAAC,CAAC,QAAQ,IAAK,QAAgB,CAAC,KAAK,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,MAAc;IACzD,MAAM,OAAO,GAAG,MAAM,QAAQ,CAC5B,uDAAuD,EACvD,CAAC,MAAM,CAAC,CACT,CAAC;IACF,MAAM,WAAW,GAAG,OAAO;QACzB,CAAC,CAAE,OAAe,CAAC,sBAAsB,KAAK,CAAC,IAAK,OAAe,CAAC,sBAAsB,KAAK,KAAK;QACpG,CAAC,CAAC,IAAI,CAAC;IAET,IAAI,CAAC,WAAW;QAAE,OAAO,KAAK,CAAC;IAE/B,MAAM,SAAS,GAAG,MAAM,QAAQ,CAC9B,+CAA+C,EAC/C,CAAC,YAAY,CAAC,CACf,CAAC;IACF,IAAI,CAAC,SAAS,IAAK,SAAiB,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IAEpE,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,+CAA+C,EAC/C,CAAC,YAAY,CAAC,CACf,CAAC;IACF,IAAI,CAAC,QAAQ,IAAI,CAAE,QAAgB,CAAC,KAAK;QAAE,OAAO,KAAK,CAAC;IAExD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,+CAA+C,EAC/C,CAAC,YAAY,CAAC,CACf,CAAC;IACF,IAAI,CAAC,GAAG,IAAI,CAAE,GAAW,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAC7C,MAAM,GAAG,GAAI,GAAW,CAAC,KAAe,CAAC;IACzC,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,CAAC;QACH,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACpD,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC;IACtB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,GAAG,CAAC;IACb,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,GAAG,GAAG,MAAM,QAAQ,CACxB,+CAA+C,EAC/C,CAAC,UAAU,CAAC,CACb,CAAC;IACF,OAAO,CAAC,GAAG,IAAK,GAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAE,GAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;AAClF,CAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Send email using SMTP (self-hosted).
|
|
3
|
+
*/
|
|
4
|
+
export declare function sendEmail(to: string, subject: string, html: string, text?: string): Promise<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
error?: string;
|
|
7
|
+
}>;
|
|
8
|
+
/**
|
|
9
|
+
* Send password reset email
|
|
10
|
+
*/
|
|
11
|
+
export declare function sendPasswordResetEmail(email: string, resetToken: string, resetUrl: string): Promise<boolean>;
|
|
12
|
+
/**
|
|
13
|
+
* Send email verification email
|
|
14
|
+
*/
|
|
15
|
+
export declare function sendEmailVerificationEmail(email: string, verificationToken: string, verificationUrl: string, newEmail: string): Promise<boolean>;
|
|
16
|
+
export interface ContactFormData {
|
|
17
|
+
name: string;
|
|
18
|
+
email: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Send contact form confirmation to the customer
|
|
23
|
+
*/
|
|
24
|
+
export declare function sendContactConfirmationEmail(email: string, name: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Send contact form submission to the configured recipient
|
|
27
|
+
*/
|
|
28
|
+
export declare function sendContactFormNotification(recipient: string, data: ContactFormData): Promise<boolean>;
|
|
29
|
+
/**
|
|
30
|
+
* Send signup verification email.
|
|
31
|
+
*/
|
|
32
|
+
export declare function sendSignupVerificationEmail(email: string, verificationUrl: string): Promise<boolean>;
|
|
33
|
+
/**
|
|
34
|
+
* Test SMTP configuration
|
|
35
|
+
*/
|
|
36
|
+
export declare function testSMTPConfig(testEmail: string): Promise<{
|
|
37
|
+
success: boolean;
|
|
38
|
+
error?: string;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=email.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"email.d.ts","sourceRoot":"","sources":["../../src/utils/email.ts"],"names":[],"mappings":"AA8LA;;GAEG;AACH,wBAAsB,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAiDvI;AAED;;GAEG;AACH,wBAAsB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAuClH;AAED;;GAEG;AACH,wBAAsB,0BAA0B,CAAC,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAwCtJ;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAsB,4BAA4B,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAqBhG;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,CAwC5G;AAED;;GAEG;AACH,wBAAsB,2BAA2B,CAAC,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4B1G;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAwErG"}
|