@de-otio/trellis 0.7.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/dist/db.js +10 -18
- package/dist/db.js.map +1 -1
- package/dist/env.d.ts +66 -6
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +89 -70
- package/dist/env.js.map +1 -1
- package/dist/extensions.js +3 -8
- package/dist/extensions.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -9
- package/dist/index.js.map +1 -1
- package/dist/lambda/cleanup-cron.d.ts.map +1 -1
- package/dist/lambda/cleanup-cron.js +20 -24
- package/dist/lambda/cleanup-cron.js.map +1 -1
- package/dist/lambda/create-auth-challenge.d.ts.map +1 -1
- package/dist/lambda/create-auth-challenge.js +17 -19
- package/dist/lambda/create-auth-challenge.js.map +1 -1
- package/dist/lambda/custom-message.js +1 -5
- package/dist/lambda/custom-message.js.map +1 -1
- package/dist/lambda/define-auth-challenge.js +1 -5
- package/dist/lambda/define-auth-challenge.js.map +1 -1
- package/dist/lambda/delete-account-worker.d.ts.map +1 -1
- package/dist/lambda/delete-account-worker.js +25 -58
- package/dist/lambda/delete-account-worker.js.map +1 -1
- package/dist/lambda/diagnostics-proxy.d.ts.map +1 -1
- package/dist/lambda/diagnostics-proxy.js +14 -49
- package/dist/lambda/diagnostics-proxy.js.map +1 -1
- package/dist/lambda/e2e-sweeper.d.ts.map +1 -1
- package/dist/lambda/e2e-sweeper.js +30 -38
- package/dist/lambda/e2e-sweeper.js.map +1 -1
- package/dist/lambda/federation-outbox-worker.d.ts.map +1 -1
- package/dist/lambda/federation-outbox-worker.js +4 -6
- package/dist/lambda/federation-outbox-worker.js.map +1 -1
- package/dist/lambda/followers-events-worker.d.ts.map +1 -1
- package/dist/lambda/followers-events-worker.js +4 -6
- package/dist/lambda/followers-events-worker.js.map +1 -1
- package/dist/lambda/hourly-cron.d.ts.map +1 -1
- package/dist/lambda/hourly-cron.js +100 -32
- package/dist/lambda/hourly-cron.js.map +1 -1
- package/dist/lambda/link-check-worker.d.ts.map +1 -1
- package/dist/lambda/link-check-worker.js +4 -6
- package/dist/lambda/link-check-worker.js.map +1 -1
- package/dist/lambda/maintenance-cron.d.ts.map +1 -1
- package/dist/lambda/maintenance-cron.js +30 -63
- package/dist/lambda/maintenance-cron.js.map +1 -1
- package/dist/lambda/media-processing-worker.d.ts.map +1 -1
- package/dist/lambda/media-processing-worker.js +11 -46
- package/dist/lambda/media-processing-worker.js.map +1 -1
- package/dist/lambda/media-reconciliation-worker.d.ts.map +1 -1
- package/dist/lambda/media-reconciliation-worker.js +4 -6
- package/dist/lambda/media-reconciliation-worker.js.map +1 -1
- package/dist/lambda/nightly-cron.d.ts.map +1 -1
- package/dist/lambda/nightly-cron.js +67 -112
- package/dist/lambda/nightly-cron.js.map +1 -1
- package/dist/lambda/post-confirmation.d.ts.map +1 -1
- package/dist/lambda/post-confirmation.js +147 -45
- package/dist/lambda/post-confirmation.js.map +1 -1
- package/dist/lambda/pre-signup.js +7 -11
- package/dist/lambda/pre-signup.js.map +1 -1
- package/dist/lambda/pre-token-generation.d.ts.map +1 -1
- package/dist/lambda/pre-token-generation.js +27 -35
- package/dist/lambda/pre-token-generation.js.map +1 -1
- package/dist/lambda/tools/check-health.js +1 -5
- package/dist/lambda/tools/check-health.js.map +1 -1
- package/dist/lambda/tools/describe-services.js +4 -8
- package/dist/lambda/tools/describe-services.js.map +1 -1
- package/dist/lambda/tools/get-cost-report.js +4 -8
- package/dist/lambda/tools/get-cost-report.js.map +1 -1
- package/dist/lambda/tools/get-errors.js +5 -9
- package/dist/lambda/tools/get-errors.js.map +1 -1
- package/dist/lambda/tools/get-feature-flags.js +4 -8
- package/dist/lambda/tools/get-feature-flags.js.map +1 -1
- package/dist/lambda/tools/get-queue-status.js +5 -9
- package/dist/lambda/tools/get-queue-status.js.map +1 -1
- package/dist/lambda/tools/search-logs.js +5 -9
- package/dist/lambda/tools/search-logs.js.map +1 -1
- package/dist/lambda/tools/send-alert.js +4 -8
- package/dist/lambda/tools/send-alert.js.map +1 -1
- package/dist/lambda/verify-auth-challenge.d.ts.map +1 -1
- package/dist/lambda/verify-auth-challenge.js +10 -12
- package/dist/lambda/verify-auth-challenge.js.map +1 -1
- package/dist/lib/abuse-metrics.d.ts.map +1 -1
- package/dist/lib/abuse-metrics.js +10 -13
- package/dist/lib/abuse-metrics.js.map +1 -1
- package/dist/lib/activitypub/activity-processor.d.ts +1 -1
- package/dist/lib/activitypub/activity-processor.d.ts.map +1 -1
- package/dist/lib/activitypub/activity-processor.js +9 -43
- package/dist/lib/activitypub/activity-processor.js.map +1 -1
- package/dist/lib/activitypub/activity-service.js +1 -5
- package/dist/lib/activitypub/activity-service.js.map +1 -1
- package/dist/lib/activitypub/actor.d.ts +1 -1
- package/dist/lib/activitypub/actor.d.ts.map +1 -1
- package/dist/lib/activitypub/actor.js +1 -5
- package/dist/lib/activitypub/actor.js.map +1 -1
- package/dist/lib/activitypub/audience-service.d.ts +2 -2
- package/dist/lib/activitypub/audience-service.d.ts.map +1 -1
- package/dist/lib/activitypub/audience-service.js +8 -12
- package/dist/lib/activitypub/audience-service.js.map +1 -1
- package/dist/lib/activitypub/crypto.d.ts +1 -1
- package/dist/lib/activitypub/crypto.d.ts.map +1 -1
- package/dist/lib/activitypub/crypto.js +3 -41
- package/dist/lib/activitypub/crypto.js.map +1 -1
- package/dist/lib/activitypub/delivery-service.d.ts +5 -5
- package/dist/lib/activitypub/delivery-service.d.ts.map +1 -1
- package/dist/lib/activitypub/delivery-service.js +10 -47
- package/dist/lib/activitypub/delivery-service.js.map +1 -1
- package/dist/lib/activitypub/dispatchers/entity-actor.d.ts +3 -2
- package/dist/lib/activitypub/dispatchers/entity-actor.d.ts.map +1 -1
- package/dist/lib/activitypub/dispatchers/entity-actor.js +19 -23
- package/dist/lib/activitypub/dispatchers/entity-actor.js.map +1 -1
- package/dist/lib/activitypub/dispatchers/group-actor.d.ts +3 -2
- package/dist/lib/activitypub/dispatchers/group-actor.d.ts.map +1 -1
- package/dist/lib/activitypub/dispatchers/group-actor.js +19 -23
- package/dist/lib/activitypub/dispatchers/group-actor.js.map +1 -1
- package/dist/lib/activitypub/dispatchers/user-actor.d.ts +3 -2
- package/dist/lib/activitypub/dispatchers/user-actor.d.ts.map +1 -1
- package/dist/lib/activitypub/dispatchers/user-actor.js +16 -20
- package/dist/lib/activitypub/dispatchers/user-actor.js.map +1 -1
- package/dist/lib/activitypub/dm-service.js +1 -5
- package/dist/lib/activitypub/dm-service.js.map +1 -1
- package/dist/lib/activitypub/entity-profile-service.d.ts +1 -1
- package/dist/lib/activitypub/entity-profile-service.d.ts.map +1 -1
- package/dist/lib/activitypub/entity-profile-service.js +6 -10
- package/dist/lib/activitypub/entity-profile-service.js.map +1 -1
- package/dist/lib/activitypub/fedify/config.d.ts +3 -3
- package/dist/lib/activitypub/fedify/config.d.ts.map +1 -1
- package/dist/lib/activitypub/fedify/config.js +5 -8
- package/dist/lib/activitypub/fedify/config.js.map +1 -1
- package/dist/lib/activitypub/fedify/context.d.ts +1 -1
- package/dist/lib/activitypub/fedify/context.d.ts.map +1 -1
- package/dist/lib/activitypub/fedify/context.js +8 -12
- package/dist/lib/activitypub/fedify/context.js.map +1 -1
- package/dist/lib/activitypub/fedify/runtime.d.ts +1 -1
- package/dist/lib/activitypub/fedify/runtime.d.ts.map +1 -1
- package/dist/lib/activitypub/fedify/runtime.js +3 -6
- package/dist/lib/activitypub/fedify/runtime.js.map +1 -1
- package/dist/lib/activitypub/friendship-service.js +1 -5
- package/dist/lib/activitypub/friendship-service.js.map +1 -1
- package/dist/lib/activitypub/group-service.d.ts +1 -1
- package/dist/lib/activitypub/group-service.d.ts.map +1 -1
- package/dist/lib/activitypub/group-service.js +9 -46
- package/dist/lib/activitypub/group-service.js.map +1 -1
- package/dist/lib/activitypub/http-signatures.js +8 -45
- package/dist/lib/activitypub/http-signatures.js.map +1 -1
- package/dist/lib/activitypub/jsonld.d.ts +1 -1
- package/dist/lib/activitypub/jsonld.d.ts.map +1 -1
- package/dist/lib/activitypub/jsonld.js +1 -5
- package/dist/lib/activitypub/jsonld.js.map +1 -1
- package/dist/lib/activitypub/listeners/friends-collection.d.ts +1 -1
- package/dist/lib/activitypub/listeners/friends-collection.d.ts.map +1 -1
- package/dist/lib/activitypub/listeners/friends-collection.js +17 -20
- package/dist/lib/activitypub/listeners/friends-collection.js.map +1 -1
- package/dist/lib/activitypub/listeners/http-signatures.d.ts +1 -1
- package/dist/lib/activitypub/listeners/http-signatures.d.ts.map +1 -1
- package/dist/lib/activitypub/listeners/http-signatures.js +9 -46
- package/dist/lib/activitypub/listeners/http-signatures.js.map +1 -1
- package/dist/lib/activitypub/listeners/inbox.d.ts +2 -2
- package/dist/lib/activitypub/listeners/inbox.d.ts.map +1 -1
- package/dist/lib/activitypub/listeners/inbox.js +31 -35
- package/dist/lib/activitypub/listeners/inbox.js.map +1 -1
- package/dist/lib/activitypub/listeners/outbox.d.ts +1 -1
- package/dist/lib/activitypub/listeners/outbox.d.ts.map +1 -1
- package/dist/lib/activitypub/listeners/outbox.js +17 -20
- package/dist/lib/activitypub/listeners/outbox.js.map +1 -1
- package/dist/lib/activitypub/remote-fetch-service.d.ts +6 -6
- package/dist/lib/activitypub/remote-fetch-service.d.ts.map +1 -1
- package/dist/lib/activitypub/remote-fetch-service.js +6 -10
- package/dist/lib/activitypub/remote-fetch-service.js.map +1 -1
- package/dist/lib/activitypub/services/abuse-prevention.d.ts +1 -1
- package/dist/lib/activitypub/services/abuse-prevention.d.ts.map +1 -1
- package/dist/lib/activitypub/services/abuse-prevention.js +11 -17
- package/dist/lib/activitypub/services/abuse-prevention.js.map +1 -1
- package/dist/lib/activitypub/services/dm-service-fedify.d.ts +4 -4
- package/dist/lib/activitypub/services/dm-service-fedify.d.ts.map +1 -1
- package/dist/lib/activitypub/services/dm-service-fedify.js +24 -59
- package/dist/lib/activitypub/services/dm-service-fedify.js.map +1 -1
- package/dist/lib/activitypub/services/fedify-converters.d.ts +2 -2
- package/dist/lib/activitypub/services/fedify-converters.d.ts.map +1 -1
- package/dist/lib/activitypub/services/fedify-converters.js +3 -8
- package/dist/lib/activitypub/services/fedify-converters.js.map +1 -1
- package/dist/lib/activitypub/services/fedify-delivery.d.ts +2 -2
- package/dist/lib/activitypub/services/fedify-delivery.d.ts.map +1 -1
- package/dist/lib/activitypub/services/fedify-delivery.js +19 -56
- package/dist/lib/activitypub/services/fedify-delivery.js.map +1 -1
- package/dist/lib/activitypub/services/follow-activity-service.d.ts +2 -2
- package/dist/lib/activitypub/services/follow-activity-service.d.ts.map +1 -1
- package/dist/lib/activitypub/services/follow-activity-service.js +8 -12
- package/dist/lib/activitypub/services/follow-activity-service.js.map +1 -1
- package/dist/lib/activitypub/services/post-service-fedify.d.ts +2 -2
- package/dist/lib/activitypub/services/post-service-fedify.d.ts.map +1 -1
- package/dist/lib/activitypub/services/post-service-fedify.js +33 -65
- package/dist/lib/activitypub/services/post-service-fedify.js.map +1 -1
- package/dist/lib/activitypub/services/remote-activity-handler.d.ts +2 -2
- package/dist/lib/activitypub/services/remote-activity-handler.d.ts.map +1 -1
- package/dist/lib/activitypub/services/remote-activity-handler.js +25 -28
- package/dist/lib/activitypub/services/remote-activity-handler.js.map +1 -1
- package/dist/lib/activitypub/standalone-mode.d.ts +1 -1
- package/dist/lib/activitypub/standalone-mode.d.ts.map +1 -1
- package/dist/lib/activitypub/standalone-mode.js +13 -50
- package/dist/lib/activitypub/standalone-mode.js.map +1 -1
- package/dist/lib/activitypub/webfinger/server.d.ts +1 -1
- package/dist/lib/activitypub/webfinger/server.d.ts.map +1 -1
- package/dist/lib/activitypub/webfinger/server.js +18 -54
- package/dist/lib/activitypub/webfinger/server.js.map +1 -1
- package/dist/lib/age-gate-middleware.d.ts +4 -4
- package/dist/lib/age-gate-middleware.d.ts.map +1 -1
- package/dist/lib/age-gate-middleware.js +3 -6
- package/dist/lib/age-gate-middleware.js.map +1 -1
- package/dist/lib/age-gate.js +3 -8
- package/dist/lib/age-gate.js.map +1 -1
- package/dist/lib/age-tier-transition.d.ts +1 -1
- package/dist/lib/age-tier-transition.d.ts.map +1 -1
- package/dist/lib/age-tier-transition.js +7 -44
- package/dist/lib/age-tier-transition.js.map +1 -1
- package/dist/lib/app.d.ts +76 -0
- package/dist/lib/app.d.ts.map +1 -0
- package/dist/lib/app.js +400 -0
- package/dist/lib/app.js.map +1 -0
- package/dist/lib/audit/csv-export.js +6 -13
- package/dist/lib/audit/csv-export.js.map +1 -1
- package/dist/lib/audit/pii-filter.d.ts +9 -0
- package/dist/lib/audit/pii-filter.d.ts.map +1 -1
- package/dist/lib/audit/pii-filter.js +57 -7
- package/dist/lib/audit/pii-filter.js.map +1 -1
- package/dist/lib/audit-actions.d.ts +94 -0
- package/dist/lib/audit-actions.d.ts.map +1 -0
- package/dist/lib/audit-actions.js +107 -0
- package/dist/lib/audit-actions.js.map +1 -0
- package/dist/lib/audit-composer.d.ts +174 -0
- package/dist/lib/audit-composer.d.ts.map +1 -0
- package/dist/lib/audit-composer.js +421 -0
- package/dist/lib/audit-composer.js.map +1 -0
- package/dist/lib/auth/auth-context.d.ts +1 -1
- package/dist/lib/auth/auth-context.js +1 -2
- package/dist/lib/auth/auth-context.js.map +1 -1
- package/dist/lib/auth/auth-middleware.d.ts +16 -2
- package/dist/lib/auth/auth-middleware.d.ts.map +1 -1
- package/dist/lib/auth/auth-middleware.js +36 -45
- package/dist/lib/auth/auth-middleware.js.map +1 -1
- package/dist/lib/auth/capabilities.js +2 -5
- package/dist/lib/auth/capabilities.js.map +1 -1
- package/dist/lib/auth/claims-cache.d.ts +2 -2
- package/dist/lib/auth/claims-cache.js +19 -24
- package/dist/lib/auth/claims-cache.js.map +1 -1
- package/dist/lib/auth/cognito-jwt.d.ts +20 -2
- package/dist/lib/auth/cognito-jwt.d.ts.map +1 -1
- package/dist/lib/auth/cognito-jwt.js +83 -23
- package/dist/lib/auth/cognito-jwt.js.map +1 -1
- package/dist/lib/auth/idp-redirect-builder.d.ts +1 -1
- package/dist/lib/auth/idp-redirect-builder.d.ts.map +1 -1
- package/dist/lib/auth/idp-redirect-builder.js +4 -10
- package/dist/lib/auth/idp-redirect-builder.js.map +1 -1
- package/dist/lib/auth/require.d.ts +4 -4
- package/dist/lib/auth/require.d.ts.map +1 -1
- package/dist/lib/auth/require.js +11 -18
- package/dist/lib/auth/require.js.map +1 -1
- package/dist/lib/auth/role-grants.d.ts +1 -1
- package/dist/lib/auth/role-grants.d.ts.map +1 -1
- package/dist/lib/auth/role-grants.js +28 -31
- package/dist/lib/auth/role-grants.js.map +1 -1
- package/dist/lib/auth-context-manager.js +1 -5
- package/dist/lib/auth-context-manager.js.map +1 -1
- package/dist/lib/auth-handler.d.ts +5 -5
- package/dist/lib/auth-handler.d.ts.map +1 -1
- package/dist/lib/auth-handler.js +5 -9
- package/dist/lib/auth-handler.js.map +1 -1
- package/dist/lib/badge-handler.d.ts +1 -1
- package/dist/lib/badge-handler.d.ts.map +1 -1
- package/dist/lib/badge-handler.js +14 -52
- package/dist/lib/badge-handler.js.map +1 -1
- package/dist/lib/circle-handler.d.ts +10 -10
- package/dist/lib/circle-handler.d.ts.map +1 -1
- package/dist/lib/circle-handler.js +10 -47
- package/dist/lib/circle-handler.js.map +1 -1
- package/dist/lib/cognito/idp-sdk.js +11 -18
- package/dist/lib/cognito/idp-sdk.js.map +1 -1
- package/dist/lib/cognito/issuer-probe.js +9 -14
- package/dist/lib/cognito/issuer-probe.js.map +1 -1
- package/dist/lib/comment-handler.d.ts +10 -10
- package/dist/lib/comment-handler.d.ts.map +1 -1
- package/dist/lib/comment-handler.js +61 -97
- package/dist/lib/comment-handler.js.map +1 -1
- package/dist/lib/compliance/baseline.d.ts +2 -2
- package/dist/lib/compliance/baseline.d.ts.map +1 -1
- package/dist/lib/compliance/baseline.js +15 -18
- package/dist/lib/compliance/baseline.js.map +1 -1
- package/dist/lib/compliance/tenant-merge.d.ts +1 -1
- package/dist/lib/compliance/tenant-merge.d.ts.map +1 -1
- package/dist/lib/compliance/tenant-merge.js +1 -4
- package/dist/lib/compliance/tenant-merge.js.map +1 -1
- package/dist/lib/compliance/types.d.ts +1 -1
- package/dist/lib/compliance/types.js +2 -3
- package/dist/lib/compliance/types.js.map +1 -1
- package/dist/lib/connection-code-handler.d.ts +7 -7
- package/dist/lib/connection-code-handler.d.ts.map +1 -1
- package/dist/lib/connection-code-handler.js +13 -50
- package/dist/lib/connection-code-handler.js.map +1 -1
- package/dist/lib/content-discovery.d.ts +1 -1
- package/dist/lib/content-discovery.d.ts.map +1 -1
- package/dist/lib/content-discovery.js +15 -52
- package/dist/lib/content-discovery.js.map +1 -1
- package/dist/lib/context-aware-data-access.d.ts +1 -1
- package/dist/lib/context-aware-data-access.d.ts.map +1 -1
- package/dist/lib/context-aware-data-access.js +1 -5
- package/dist/lib/context-aware-data-access.js.map +1 -1
- package/dist/lib/cors-handler.d.ts +1 -1
- package/dist/lib/cors-handler.d.ts.map +1 -1
- package/dist/lib/cors-handler.js +13 -17
- package/dist/lib/cors-handler.js.map +1 -1
- package/dist/lib/cost-accumulator.d.ts.map +1 -1
- package/dist/lib/cost-accumulator.js +7 -11
- package/dist/lib/cost-accumulator.js.map +1 -1
- package/dist/lib/crypto/voting/elgamal-encryption.js +1 -5
- package/dist/lib/crypto/voting/elgamal-encryption.js.map +1 -1
- package/dist/lib/crypto/voting/encryption-scheme.js +1 -2
- package/dist/lib/crypto/voting/encryption-scheme.js.map +1 -1
- package/dist/lib/crypto/voting/hash-utils.js +6 -12
- package/dist/lib/crypto/voting/hash-utils.js.map +1 -1
- package/dist/lib/crypto/voting/hybrid-encryption.js +5 -9
- package/dist/lib/crypto/voting/hybrid-encryption.js.map +1 -1
- package/dist/lib/crypto/voting/index.js +4 -14
- package/dist/lib/crypto/voting/index.js.map +1 -1
- package/dist/lib/crypto/voting/post-quantum-encryption.js +1 -5
- package/dist/lib/crypto/voting/post-quantum-encryption.js.map +1 -1
- package/dist/lib/csrf.d.ts +2 -2
- package/dist/lib/csrf.d.ts.map +1 -1
- package/dist/lib/csrf.js +1 -5
- package/dist/lib/csrf.js.map +1 -1
- package/dist/lib/data-router.d.ts +5 -4
- package/dist/lib/data-router.d.ts.map +1 -1
- package/dist/lib/data-router.js +60 -90
- package/dist/lib/data-router.js.map +1 -1
- package/dist/lib/database-circuit-breaker.d.ts +61 -34
- package/dist/lib/database-circuit-breaker.d.ts.map +1 -1
- package/dist/lib/database-circuit-breaker.js +102 -109
- package/dist/lib/database-circuit-breaker.js.map +1 -1
- package/dist/lib/database-config.js +1 -4
- package/dist/lib/database-config.js.map +1 -1
- package/dist/lib/database-connection-manager.d.ts +42 -2
- package/dist/lib/database-connection-manager.d.ts.map +1 -1
- package/dist/lib/database-connection-manager.js +178 -74
- package/dist/lib/database-connection-manager.js.map +1 -1
- package/dist/lib/database-monitor.d.ts +1 -1
- package/dist/lib/database-monitor.d.ts.map +1 -1
- package/dist/lib/database-monitor.js +5 -9
- package/dist/lib/database-monitor.js.map +1 -1
- package/dist/lib/database-rate-limiter.d.ts +1 -1
- package/dist/lib/database-rate-limiter.d.ts.map +1 -1
- package/dist/lib/database-rate-limiter.js +3 -7
- package/dist/lib/database-rate-limiter.js.map +1 -1
- package/dist/lib/database-wrapper-helper.d.ts +2 -2
- package/dist/lib/database-wrapper-helper.d.ts.map +1 -1
- package/dist/lib/database-wrapper-helper.js +7 -11
- package/dist/lib/database-wrapper-helper.js.map +1 -1
- package/dist/lib/database-wrapper.d.ts +1 -1
- package/dist/lib/database-wrapper.d.ts.map +1 -1
- package/dist/lib/database-wrapper.js +5 -9
- package/dist/lib/database-wrapper.js.map +1 -1
- package/dist/lib/db-query-helper.d.ts +3 -3
- package/dist/lib/db-query-helper.d.ts.map +1 -1
- package/dist/lib/db-query-helper.js +4 -9
- package/dist/lib/db-query-helper.js.map +1 -1
- package/dist/lib/discovery-exposure.d.ts +42 -0
- package/dist/lib/discovery-exposure.d.ts.map +1 -0
- package/dist/lib/discovery-exposure.js +89 -0
- package/dist/lib/discovery-exposure.js.map +1 -0
- package/dist/lib/discovery-handler.d.ts +6 -6
- package/dist/lib/discovery-handler.d.ts.map +1 -1
- package/dist/lib/discovery-handler.js +10 -43
- package/dist/lib/discovery-handler.js.map +1 -1
- package/dist/lib/domain-reputation-service.d.ts +1 -1
- package/dist/lib/domain-reputation-service.d.ts.map +1 -1
- package/dist/lib/domain-reputation-service.js +12 -15
- package/dist/lib/domain-reputation-service.js.map +1 -1
- package/dist/lib/email-privacy.js +4 -8
- package/dist/lib/email-privacy.js.map +1 -1
- package/dist/lib/email-provider.d.ts +2 -2
- package/dist/lib/email-provider.d.ts.map +1 -1
- package/dist/lib/email-provider.js +8 -16
- package/dist/lib/email-provider.js.map +1 -1
- package/dist/lib/entity-handler.d.ts +5 -6
- package/dist/lib/entity-handler.d.ts.map +1 -1
- package/dist/lib/entity-handler.js +45 -80
- package/dist/lib/entity-handler.js.map +1 -1
- package/dist/lib/entity-relationship-handler.d.ts +9 -9
- package/dist/lib/entity-relationship-handler.d.ts.map +1 -1
- package/dist/lib/entity-relationship-handler.js +14 -51
- package/dist/lib/entity-relationship-handler.js.map +1 -1
- package/dist/lib/entity-tagging-errors.js +4 -11
- package/dist/lib/entity-tagging-errors.js.map +1 -1
- package/dist/lib/entity-tagging-validator.d.ts +3 -3
- package/dist/lib/entity-tagging-validator.d.ts.map +1 -1
- package/dist/lib/entity-tagging-validator.js +6 -11
- package/dist/lib/entity-tagging-validator.js.map +1 -1
- package/dist/lib/exif-stripper.js +1 -4
- package/dist/lib/exif-stripper.js.map +1 -1
- package/dist/lib/extension-context.d.ts +2 -2
- package/dist/lib/extension-context.d.ts.map +1 -1
- package/dist/lib/extension-context.js +1 -4
- package/dist/lib/extension-context.js.map +1 -1
- package/dist/lib/extension-route-wrapper.d.ts +1 -1
- package/dist/lib/extension-route-wrapper.d.ts.map +1 -1
- package/dist/lib/extension-route-wrapper.js +17 -55
- package/dist/lib/extension-route-wrapper.js.map +1 -1
- package/dist/lib/extension-validator.js +3 -6
- package/dist/lib/extension-validator.js.map +1 -1
- package/dist/lib/feature-flags.d.ts +5 -2
- package/dist/lib/feature-flags.d.ts.map +1 -1
- package/dist/lib/feature-flags.js +15 -48
- package/dist/lib/feature-flags.js.map +1 -1
- package/dist/lib/feature-toggle-global-client.d.ts +6 -0
- package/dist/lib/feature-toggle-global-client.d.ts.map +1 -0
- package/dist/lib/feature-toggle-global-client.js +73 -0
- package/dist/lib/feature-toggle-global-client.js.map +1 -0
- package/dist/lib/feature-toggle-service.d.ts +137 -27
- package/dist/lib/feature-toggle-service.d.ts.map +1 -1
- package/dist/lib/feature-toggle-service.js +302 -119
- package/dist/lib/feature-toggle-service.js.map +1 -1
- package/dist/lib/feed-handler.d.ts +8 -8
- package/dist/lib/feed-handler.d.ts.map +1 -1
- package/dist/lib/feed-handler.js +33 -62
- package/dist/lib/feed-handler.js.map +1 -1
- package/dist/lib/feed-pagination.d.ts +26 -0
- package/dist/lib/feed-pagination.d.ts.map +1 -1
- package/dist/lib/feed-pagination.js +31 -11
- package/dist/lib/feed-pagination.js.map +1 -1
- package/dist/lib/feed-personalization.d.ts +1 -1
- package/dist/lib/feed-personalization.d.ts.map +1 -1
- package/dist/lib/feed-personalization.js +6 -43
- package/dist/lib/feed-personalization.js.map +1 -1
- package/dist/lib/followers-events.js +8 -13
- package/dist/lib/followers-events.js.map +1 -1
- package/dist/lib/friends-handler.d.ts +2 -2
- package/dist/lib/friends-handler.d.ts.map +1 -1
- package/dist/lib/friends-handler.js +9 -46
- package/dist/lib/friends-handler.js.map +1 -1
- package/dist/lib/geo/entity-geo-repository.d.ts +67 -0
- package/dist/lib/geo/entity-geo-repository.d.ts.map +1 -0
- package/dist/lib/geo/entity-geo-repository.js +91 -0
- package/dist/lib/geo/entity-geo-repository.js.map +1 -0
- package/dist/lib/graph/errors.d.ts.map +1 -1
- package/dist/lib/graph/errors.js +13 -18
- package/dist/lib/graph/errors.js.map +1 -1
- package/dist/lib/graph/graph-factory.d.ts +12 -53
- package/dist/lib/graph/graph-factory.d.ts.map +1 -1
- package/dist/lib/graph/graph-factory.js +67 -162
- package/dist/lib/graph/graph-factory.js.map +1 -1
- package/dist/lib/graph/graph-service.d.ts +1 -1
- package/dist/lib/graph/graph-service.d.ts.map +1 -1
- package/dist/lib/graph/graph-service.js +1 -2
- package/dist/lib/graph/graph-service.js.map +1 -1
- package/dist/lib/graph/index.d.ts +10 -14
- package/dist/lib/graph/index.d.ts.map +1 -1
- package/dist/lib/graph/index.js +12 -46
- package/dist/lib/graph/index.js.map +1 -1
- package/dist/lib/graph/postgres/_shared.d.ts +18 -0
- package/dist/lib/graph/postgres/_shared.d.ts.map +1 -0
- package/dist/lib/graph/postgres/_shared.js +24 -0
- package/dist/lib/graph/postgres/_shared.js.map +1 -0
- package/dist/lib/graph/postgres/circles.d.ts +66 -0
- package/dist/lib/graph/postgres/circles.d.ts.map +1 -0
- package/dist/lib/graph/postgres/circles.js +513 -0
- package/dist/lib/graph/postgres/circles.js.map +1 -0
- package/dist/lib/graph/postgres/discovery.d.ts +165 -0
- package/dist/lib/graph/postgres/discovery.d.ts.map +1 -0
- package/dist/lib/graph/postgres/discovery.js +579 -0
- package/dist/lib/graph/postgres/discovery.js.map +1 -0
- package/dist/lib/graph/postgres/entity-relationships.d.ts +53 -0
- package/dist/lib/graph/postgres/entity-relationships.d.ts.map +1 -0
- package/dist/lib/graph/postgres/entity-relationships.js +304 -0
- package/dist/lib/graph/postgres/entity-relationships.js.map +1 -0
- package/dist/lib/graph/postgres/interaction-events.d.ts +106 -0
- package/dist/lib/graph/postgres/interaction-events.d.ts.map +1 -0
- package/dist/lib/graph/postgres/interaction-events.js +162 -0
- package/dist/lib/graph/postgres/interaction-events.js.map +1 -0
- package/dist/lib/graph/postgres/postgres-graph-service.d.ts +74 -0
- package/dist/lib/graph/postgres/postgres-graph-service.d.ts.map +1 -0
- package/dist/lib/graph/postgres/postgres-graph-service.js +167 -0
- package/dist/lib/graph/postgres/postgres-graph-service.js.map +1 -0
- package/dist/lib/graph/postgres/relationships.d.ts +58 -0
- package/dist/lib/graph/postgres/relationships.d.ts.map +1 -0
- package/dist/lib/graph/postgres/relationships.js +314 -0
- package/dist/lib/graph/postgres/relationships.js.map +1 -0
- package/dist/lib/graph/postgres/scoring.d.ts +74 -0
- package/dist/lib/graph/postgres/scoring.d.ts.map +1 -0
- package/dist/lib/graph/postgres/scoring.js +297 -0
- package/dist/lib/graph/postgres/scoring.js.map +1 -0
- package/dist/lib/graph/postgres/sync.d.ts +149 -0
- package/dist/lib/graph/postgres/sync.d.ts.map +1 -0
- package/dist/lib/graph/postgres/sync.js +269 -0
- package/dist/lib/graph/postgres/sync.js.map +1 -0
- package/dist/lib/graph/scoring-engine.d.ts +7 -1
- package/dist/lib/graph/scoring-engine.d.ts.map +1 -1
- package/dist/lib/graph/scoring-engine.js +29 -35
- package/dist/lib/graph/scoring-engine.js.map +1 -1
- package/dist/lib/graph/types.d.ts +18 -1
- package/dist/lib/graph/types.d.ts.map +1 -1
- package/dist/lib/graph/types.js +1 -2
- package/dist/lib/graph/types.js.map +1 -1
- package/dist/lib/hook-dispatcher.d.ts +1 -1
- package/dist/lib/hook-dispatcher.d.ts.map +1 -1
- package/dist/lib/hook-dispatcher.js +8 -12
- package/dist/lib/hook-dispatcher.js.map +1 -1
- package/dist/lib/input-sanitizer.js +1 -5
- package/dist/lib/input-sanitizer.js.map +1 -1
- package/dist/lib/internal-docs-handler.d.ts +2 -2
- package/dist/lib/internal-docs-handler.d.ts.map +1 -1
- package/dist/lib/internal-docs-handler.js +20 -28
- package/dist/lib/internal-docs-handler.js.map +1 -1
- package/dist/lib/internal-docs-navigation.js +2 -6
- package/dist/lib/internal-docs-navigation.js.map +1 -1
- package/dist/lib/invitation-handler.d.ts +2 -2
- package/dist/lib/invitation-handler.d.ts.map +1 -1
- package/dist/lib/invitation-handler.js +41 -82
- package/dist/lib/invitation-handler.js.map +1 -1
- package/dist/lib/ip-scrubber.js +3 -8
- package/dist/lib/ip-scrubber.js.map +1 -1
- package/dist/lib/link-security-handler.d.ts +3 -2
- package/dist/lib/link-security-handler.d.ts.map +1 -1
- package/dist/lib/link-security-handler.js +8 -44
- package/dist/lib/link-security-handler.js.map +1 -1
- package/dist/lib/logger.d.ts +31 -82
- package/dist/lib/logger.d.ts.map +1 -1
- package/dist/lib/logger.js +43 -185
- package/dist/lib/logger.js.map +1 -1
- package/dist/lib/media-cleanup-handler.d.ts +2 -2
- package/dist/lib/media-cleanup-handler.d.ts.map +1 -1
- package/dist/lib/media-cleanup-handler.js +7 -11
- package/dist/lib/media-cleanup-handler.js.map +1 -1
- package/dist/lib/media-handler.d.ts +1 -1
- package/dist/lib/media-handler.d.ts.map +1 -1
- package/dist/lib/media-handler.js +36 -73
- package/dist/lib/media-handler.js.map +1 -1
- package/dist/lib/media-metadata-extractor.d.ts +1 -1
- package/dist/lib/media-metadata-extractor.d.ts.map +1 -1
- package/dist/lib/media-metadata-extractor.js +3 -7
- package/dist/lib/media-metadata-extractor.js.map +1 -1
- package/dist/lib/media-metrics.d.ts +2 -2
- package/dist/lib/media-metrics.d.ts.map +1 -1
- package/dist/lib/media-metrics.js +3 -7
- package/dist/lib/media-metrics.js.map +1 -1
- package/dist/lib/metadata/index.d.ts +5 -5
- package/dist/lib/metadata/index.d.ts.map +1 -1
- package/dist/lib/metadata/index.js +5 -21
- package/dist/lib/metadata/index.js.map +1 -1
- package/dist/lib/metadata/metadata-config.js +2 -5
- package/dist/lib/metadata/metadata-config.js.map +1 -1
- package/dist/lib/metadata/metadata-errors.js +2 -7
- package/dist/lib/metadata/metadata-errors.js.map +1 -1
- package/dist/lib/metadata/metadata-extractor.d.ts +1 -1
- package/dist/lib/metadata/metadata-extractor.d.ts.map +1 -1
- package/dist/lib/metadata/metadata-extractor.js +42 -82
- package/dist/lib/metadata/metadata-extractor.js.map +1 -1
- package/dist/lib/metadata/metadata-sanitizer.js +17 -24
- package/dist/lib/metadata/metadata-sanitizer.js.map +1 -1
- package/dist/lib/metadata/metadata-schemas.d.ts +16 -100
- package/dist/lib/metadata/metadata-schemas.d.ts.map +1 -1
- package/dist/lib/metadata/metadata-schemas.js +31 -34
- package/dist/lib/metadata/metadata-schemas.js.map +1 -1
- package/dist/lib/mfa/mfa-handler.d.ts +1 -1
- package/dist/lib/mfa/mfa-handler.d.ts.map +1 -1
- package/dist/lib/mfa/mfa-handler.js +13 -17
- package/dist/lib/mfa/mfa-handler.js.map +1 -1
- package/dist/lib/mfa/totp-service.js +8 -18
- package/dist/lib/mfa/totp-service.js.map +1 -1
- package/dist/lib/middleware/comment-rate-limit.d.ts +1 -1
- package/dist/lib/middleware/comment-rate-limit.d.ts.map +1 -1
- package/dist/lib/middleware/comment-rate-limit.js +7 -10
- package/dist/lib/middleware/comment-rate-limit.js.map +1 -1
- package/dist/lib/middleware/feature-toggle-rate-limit.d.ts +1 -1
- package/dist/lib/middleware/feature-toggle-rate-limit.d.ts.map +1 -1
- package/dist/lib/middleware/feature-toggle-rate-limit.js +8 -13
- package/dist/lib/middleware/feature-toggle-rate-limit.js.map +1 -1
- package/dist/lib/middleware/idempotency-store.js +20 -26
- package/dist/lib/middleware/idempotency-store.js.map +1 -1
- package/dist/lib/middleware/idempotency.d.ts +2 -2
- package/dist/lib/middleware/idempotency.d.ts.map +1 -1
- package/dist/lib/middleware/idempotency.js +12 -50
- package/dist/lib/middleware/idempotency.js.map +1 -1
- package/dist/lib/middleware.d.ts +22 -9
- package/dist/lib/middleware.d.ts.map +1 -1
- package/dist/lib/middleware.js +72 -153
- package/dist/lib/middleware.js.map +1 -1
- package/dist/lib/moderation-handler.d.ts +1 -1
- package/dist/lib/moderation-handler.d.ts.map +1 -1
- package/dist/lib/moderation-handler.js +15 -54
- package/dist/lib/moderation-handler.js.map +1 -1
- package/dist/lib/net/trusted-client-ip.d.ts +8 -30
- package/dist/lib/net/trusted-client-ip.d.ts.map +1 -1
- package/dist/lib/net/trusted-client-ip.js +13 -94
- package/dist/lib/net/trusted-client-ip.js.map +1 -1
- package/dist/lib/notification-handler.d.ts +1 -1
- package/dist/lib/notification-handler.d.ts.map +1 -1
- package/dist/lib/notification-handler.js +10 -15
- package/dist/lib/notification-handler.js.map +1 -1
- package/dist/lib/notification-preferences-handler.d.ts +1 -1
- package/dist/lib/notification-preferences-handler.d.ts.map +1 -1
- package/dist/lib/notification-preferences-handler.js +7 -11
- package/dist/lib/notification-preferences-handler.js.map +1 -1
- package/dist/lib/oauth/cognito-issuer.d.ts +1 -1
- package/dist/lib/oauth/cognito-issuer.d.ts.map +1 -1
- package/dist/lib/oauth/cognito-issuer.js +5 -10
- package/dist/lib/oauth/cognito-issuer.js.map +1 -1
- package/dist/lib/oauth/device-authorization.d.ts +1 -1
- package/dist/lib/oauth/device-authorization.d.ts.map +1 -1
- package/dist/lib/oauth/device-authorization.js +62 -77
- package/dist/lib/oauth/device-authorization.js.map +1 -1
- package/dist/lib/oauth/envelope-crypto.d.ts +2 -2
- package/dist/lib/oauth/envelope-crypto.js +22 -34
- package/dist/lib/oauth/envelope-crypto.js.map +1 -1
- package/dist/lib/oauth/refresh-detection.js +42 -52
- package/dist/lib/oauth/refresh-detection.js.map +1 -1
- package/dist/lib/openai-budget.d.ts.map +1 -1
- package/dist/lib/openai-budget.js +7 -44
- package/dist/lib/openai-budget.js.map +1 -1
- package/dist/lib/openapi/generator.d.ts +1 -1
- package/dist/lib/openapi/generator.d.ts.map +1 -1
- package/dist/lib/openapi/generator.js +2 -6
- package/dist/lib/openapi/generator.js.map +1 -1
- package/dist/lib/orphaned-media-handler.d.ts +1 -1
- package/dist/lib/orphaned-media-handler.d.ts.map +1 -1
- package/dist/lib/orphaned-media-handler.js +9 -46
- package/dist/lib/orphaned-media-handler.js.map +1 -1
- package/dist/lib/parental-control-handler.d.ts +2 -2
- package/dist/lib/parental-control-handler.d.ts.map +1 -1
- package/dist/lib/parental-control-handler.js +18 -55
- package/dist/lib/parental-control-handler.js.map +1 -1
- package/dist/lib/parental-link-handler.d.ts +8 -8
- package/dist/lib/parental-link-handler.d.ts.map +1 -1
- package/dist/lib/parental-link-handler.js +10 -14
- package/dist/lib/parental-link-handler.js.map +1 -1
- package/dist/lib/performance-metrics.d.ts +1 -1
- package/dist/lib/performance-metrics.d.ts.map +1 -1
- package/dist/lib/performance-metrics.js +3 -6
- package/dist/lib/performance-metrics.js.map +1 -1
- package/dist/lib/post-handler.d.ts +9 -9
- package/dist/lib/post-handler.d.ts.map +1 -1
- package/dist/lib/post-handler.js +67 -101
- package/dist/lib/post-handler.js.map +1 -1
- package/dist/lib/privacy-defaults.js +3 -8
- package/dist/lib/privacy-defaults.js.map +1 -1
- package/dist/lib/privacy-handler.d.ts +2 -2
- package/dist/lib/privacy-handler.d.ts.map +1 -1
- package/dist/lib/privacy-handler.js +6 -10
- package/dist/lib/privacy-handler.js.map +1 -1
- package/dist/lib/pseudonym.d.ts +56 -0
- package/dist/lib/pseudonym.d.ts.map +1 -0
- package/dist/lib/pseudonym.js +85 -0
- package/dist/lib/pseudonym.js.map +1 -0
- package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts +2 -2
- package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts.map +1 -1
- package/dist/lib/queue-consumers/media-reconciliation-consumer.js +5 -8
- package/dist/lib/queue-consumers/media-reconciliation-consumer.js.map +1 -1
- package/dist/lib/quiet-hours.js +2 -6
- package/dist/lib/quiet-hours.js.map +1 -1
- package/dist/lib/rate-limit.d.ts +58 -47
- package/dist/lib/rate-limit.d.ts.map +1 -1
- package/dist/lib/rate-limit.js +168 -157
- package/dist/lib/rate-limit.js.map +1 -1
- package/dist/lib/reaction-handler.d.ts +10 -10
- package/dist/lib/reaction-handler.d.ts.map +1 -1
- package/dist/lib/reaction-handler.js +44 -80
- package/dist/lib/reaction-handler.js.map +1 -1
- package/dist/lib/recaptcha.js +6 -9
- package/dist/lib/recaptcha.js.map +1 -1
- package/dist/lib/redirect-resolver.d.ts +2 -2
- package/dist/lib/redirect-resolver.d.ts.map +1 -1
- package/dist/lib/redirect-resolver.js +5 -9
- package/dist/lib/redirect-resolver.js.map +1 -1
- package/dist/lib/region-config.d.ts +3 -3
- package/dist/lib/region-config.d.ts.map +1 -1
- package/dist/lib/region-config.js +15 -58
- package/dist/lib/region-config.js.map +1 -1
- package/dist/lib/region-detection.d.ts +55 -24
- package/dist/lib/region-detection.d.ts.map +1 -1
- package/dist/lib/region-detection.js +140 -199
- package/dist/lib/region-detection.js.map +1 -1
- package/dist/lib/region-registry.d.ts +49 -0
- package/dist/lib/region-registry.d.ts.map +1 -0
- package/dist/lib/region-registry.js +112 -0
- package/dist/lib/region-registry.js.map +1 -0
- package/dist/lib/relationship-handler.d.ts +9 -9
- package/dist/lib/relationship-handler.d.ts.map +1 -1
- package/dist/lib/relationship-handler.js +12 -49
- package/dist/lib/relationship-handler.js.map +1 -1
- package/dist/lib/request-context.d.ts +16 -16
- package/dist/lib/request-context.d.ts.map +1 -1
- package/dist/lib/request-context.js +14 -22
- package/dist/lib/request-context.js.map +1 -1
- package/dist/lib/route-helpers.d.ts +3 -4
- package/dist/lib/route-helpers.d.ts.map +1 -1
- package/dist/lib/route-helpers.js +20 -75
- package/dist/lib/route-helpers.js.map +1 -1
- package/dist/lib/routes/activitypub/actor.d.ts +1 -1
- package/dist/lib/routes/activitypub/actor.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/actor.js +20 -23
- package/dist/lib/routes/activitypub/actor.js.map +1 -1
- package/dist/lib/routes/activitypub/audiences.d.ts +1 -1
- package/dist/lib/routes/activitypub/audiences.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/audiences.js +76 -80
- package/dist/lib/routes/activitypub/audiences.js.map +1 -1
- package/dist/lib/routes/activitypub/collections.d.ts +1 -1
- package/dist/lib/routes/activitypub/collections.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/collections.js +24 -26
- package/dist/lib/routes/activitypub/collections.js.map +1 -1
- package/dist/lib/routes/activitypub/entity-profile.d.ts +1 -1
- package/dist/lib/routes/activitypub/entity-profile.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/entity-profile.js +36 -39
- package/dist/lib/routes/activitypub/entity-profile.js.map +1 -1
- package/dist/lib/routes/activitypub/friends.d.ts +1 -1
- package/dist/lib/routes/activitypub/friends.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/friends.js +9 -12
- package/dist/lib/routes/activitypub/friends.js.map +1 -1
- package/dist/lib/routes/activitypub/group.d.ts +1 -1
- package/dist/lib/routes/activitypub/group.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/group.js +91 -94
- package/dist/lib/routes/activitypub/group.js.map +1 -1
- package/dist/lib/routes/activitypub/inbox.d.ts +1 -1
- package/dist/lib/routes/activitypub/inbox.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/inbox.js +30 -33
- package/dist/lib/routes/activitypub/inbox.js.map +1 -1
- package/dist/lib/routes/activitypub/messages.d.ts +1 -1
- package/dist/lib/routes/activitypub/messages.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/messages.js +79 -83
- package/dist/lib/routes/activitypub/messages.js.map +1 -1
- package/dist/lib/routes/activitypub/outbox.d.ts +1 -1
- package/dist/lib/routes/activitypub/outbox.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/outbox.js +9 -12
- package/dist/lib/routes/activitypub/outbox.js.map +1 -1
- package/dist/lib/routes/activitypub/post.d.ts +1 -1
- package/dist/lib/routes/activitypub/post.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/post.js +32 -35
- package/dist/lib/routes/activitypub/post.js.map +1 -1
- package/dist/lib/routes/activitypub/webfinger.d.ts +1 -1
- package/dist/lib/routes/activitypub/webfinger.d.ts.map +1 -1
- package/dist/lib/routes/activitypub/webfinger.js +5 -8
- package/dist/lib/routes/activitypub/webfinger.js.map +1 -1
- package/dist/lib/routes/admin-costs.d.ts +1 -1
- package/dist/lib/routes/admin-costs.d.ts.map +1 -1
- package/dist/lib/routes/admin-costs.js +22 -26
- package/dist/lib/routes/admin-costs.js.map +1 -1
- package/dist/lib/routes/admin.d.ts +1 -1
- package/dist/lib/routes/admin.d.ts.map +1 -1
- package/dist/lib/routes/admin.js +290 -269
- package/dist/lib/routes/admin.js.map +1 -1
- package/dist/lib/routes/agent-authorize.d.ts +5 -5
- package/dist/lib/routes/agent-authorize.d.ts.map +1 -1
- package/dist/lib/routes/agent-authorize.js +68 -74
- package/dist/lib/routes/agent-authorize.js.map +1 -1
- package/dist/lib/routes/agent-sessions.d.ts +4 -4
- package/dist/lib/routes/agent-sessions.d.ts.map +1 -1
- package/dist/lib/routes/agent-sessions.js +30 -35
- package/dist/lib/routes/agent-sessions.js.map +1 -1
- package/dist/lib/routes/agent-surface.d.ts +2 -2
- package/dist/lib/routes/agent-surface.d.ts.map +1 -1
- package/dist/lib/routes/agent-surface.js +20 -24
- package/dist/lib/routes/agent-surface.js.map +1 -1
- package/dist/lib/routes/auth-discover.d.ts +1 -1
- package/dist/lib/routes/auth-discover.d.ts.map +1 -1
- package/dist/lib/routes/auth-discover.js +20 -56
- package/dist/lib/routes/auth-discover.js.map +1 -1
- package/dist/lib/routes/auth.d.ts +1 -1
- package/dist/lib/routes/auth.d.ts.map +1 -1
- package/dist/lib/routes/auth.js +13 -16
- package/dist/lib/routes/auth.js.map +1 -1
- package/dist/lib/routes/badges.d.ts +1 -1
- package/dist/lib/routes/badges.d.ts.map +1 -1
- package/dist/lib/routes/badges.js +20 -23
- package/dist/lib/routes/badges.js.map +1 -1
- package/dist/lib/routes/circles.d.ts +1 -1
- package/dist/lib/routes/circles.d.ts.map +1 -1
- package/dist/lib/routes/circles.js +40 -44
- package/dist/lib/routes/circles.js.map +1 -1
- package/dist/lib/routes/comments.d.ts +1 -1
- package/dist/lib/routes/comments.d.ts.map +1 -1
- package/dist/lib/routes/comments.js +67 -71
- package/dist/lib/routes/comments.js.map +1 -1
- package/dist/lib/routes/connection-codes.d.ts +1 -1
- package/dist/lib/routes/connection-codes.d.ts.map +1 -1
- package/dist/lib/routes/connection-codes.js +30 -34
- package/dist/lib/routes/connection-codes.js.map +1 -1
- package/dist/lib/routes/content-discovery.d.ts +1 -1
- package/dist/lib/routes/content-discovery.d.ts.map +1 -1
- package/dist/lib/routes/content-discovery.js +31 -34
- package/dist/lib/routes/content-discovery.js.map +1 -1
- package/dist/lib/routes/dashboard.d.ts +1 -1
- package/dist/lib/routes/dashboard.d.ts.map +1 -1
- package/dist/lib/routes/dashboard.js +251 -288
- package/dist/lib/routes/dashboard.js.map +1 -1
- package/dist/lib/routes/deletion.d.ts +1 -1
- package/dist/lib/routes/deletion.d.ts.map +1 -1
- package/dist/lib/routes/deletion.js +37 -74
- package/dist/lib/routes/deletion.js.map +1 -1
- package/dist/lib/routes/discovery.d.ts +1 -1
- package/dist/lib/routes/discovery.d.ts.map +1 -1
- package/dist/lib/routes/discovery.js +20 -24
- package/dist/lib/routes/discovery.js.map +1 -1
- package/dist/lib/routes/employees.d.ts +1 -1
- package/dist/lib/routes/employees.d.ts.map +1 -1
- package/dist/lib/routes/employees.js +15 -52
- package/dist/lib/routes/employees.js.map +1 -1
- package/dist/lib/routes/entities.d.ts +1 -1
- package/dist/lib/routes/entities.d.ts.map +1 -1
- package/dist/lib/routes/entities.js +133 -137
- package/dist/lib/routes/entities.js.map +1 -1
- package/dist/lib/routes/entity-relationships.d.ts +1 -1
- package/dist/lib/routes/entity-relationships.d.ts.map +1 -1
- package/dist/lib/routes/entity-relationships.js +35 -39
- package/dist/lib/routes/entity-relationships.js.map +1 -1
- package/dist/lib/routes/errors.d.ts +1 -1
- package/dist/lib/routes/errors.d.ts.map +1 -1
- package/dist/lib/routes/errors.js +4 -10
- package/dist/lib/routes/errors.js.map +1 -1
- package/dist/lib/routes/export.d.ts +1 -1
- package/dist/lib/routes/export.d.ts.map +1 -1
- package/dist/lib/routes/export.js +31 -35
- package/dist/lib/routes/export.js.map +1 -1
- package/dist/lib/routes/feature-flags.d.ts +1 -1
- package/dist/lib/routes/feature-flags.d.ts.map +1 -1
- package/dist/lib/routes/feature-flags.js +20 -23
- package/dist/lib/routes/feature-flags.js.map +1 -1
- package/dist/lib/routes/feeds.d.ts +1 -1
- package/dist/lib/routes/feeds.d.ts.map +1 -1
- package/dist/lib/routes/feeds.js +42 -46
- package/dist/lib/routes/feeds.js.map +1 -1
- package/dist/lib/routes/friends.d.ts +1 -1
- package/dist/lib/routes/friends.d.ts.map +1 -1
- package/dist/lib/routes/friends.js +35 -39
- package/dist/lib/routes/friends.js.map +1 -1
- package/dist/lib/routes/health.d.ts +1 -1
- package/dist/lib/routes/health.d.ts.map +1 -1
- package/dist/lib/routes/health.js +23 -27
- package/dist/lib/routes/health.js.map +1 -1
- package/dist/lib/routes/index.d.ts +2 -7
- package/dist/lib/routes/index.d.ts.map +1 -1
- package/dist/lib/routes/index.js +137 -158
- package/dist/lib/routes/index.js.map +1 -1
- package/dist/lib/routes/internal-docs.d.ts +1 -1
- package/dist/lib/routes/internal-docs.d.ts.map +1 -1
- package/dist/lib/routes/internal-docs.js +13 -16
- package/dist/lib/routes/internal-docs.js.map +1 -1
- package/dist/lib/routes/invitations.d.ts +1 -1
- package/dist/lib/routes/invitations.d.ts.map +1 -1
- package/dist/lib/routes/invitations.js +19 -22
- package/dist/lib/routes/invitations.js.map +1 -1
- package/dist/lib/routes/link-reports.d.ts +2 -2
- package/dist/lib/routes/link-reports.d.ts.map +1 -1
- package/dist/lib/routes/link-reports.js +86 -48
- package/dist/lib/routes/link-reports.js.map +1 -1
- package/dist/lib/routes/map.d.ts +1 -1
- package/dist/lib/routes/map.d.ts.map +1 -1
- package/dist/lib/routes/map.js +5 -8
- package/dist/lib/routes/map.js.map +1 -1
- package/dist/lib/routes/media-metadata-visibility.d.ts +1 -1
- package/dist/lib/routes/media-metadata-visibility.d.ts.map +1 -1
- package/dist/lib/routes/media-metadata-visibility.js +30 -67
- package/dist/lib/routes/media-metadata-visibility.js.map +1 -1
- package/dist/lib/routes/media.d.ts +1 -1
- package/dist/lib/routes/media.d.ts.map +1 -1
- package/dist/lib/routes/media.js +156 -193
- package/dist/lib/routes/media.js.map +1 -1
- package/dist/lib/routes/mfa.d.ts +1 -1
- package/dist/lib/routes/mfa.d.ts.map +1 -1
- package/dist/lib/routes/mfa.js +60 -64
- package/dist/lib/routes/mfa.js.map +1 -1
- package/dist/lib/routes/notifications.d.ts +1 -1
- package/dist/lib/routes/notifications.d.ts.map +1 -1
- package/dist/lib/routes/notifications.js +68 -72
- package/dist/lib/routes/notifications.js.map +1 -1
- package/dist/lib/routes/oauth.d.ts +1 -1
- package/dist/lib/routes/oauth.d.ts.map +1 -1
- package/dist/lib/routes/oauth.js +20 -23
- package/dist/lib/routes/oauth.js.map +1 -1
- package/dist/lib/routes/orphaned-media-health.d.ts +1 -1
- package/dist/lib/routes/orphaned-media-health.d.ts.map +1 -1
- package/dist/lib/routes/orphaned-media-health.js +10 -13
- package/dist/lib/routes/orphaned-media-health.js.map +1 -1
- package/dist/lib/routes/orphaned-media.d.ts +1 -1
- package/dist/lib/routes/orphaned-media.d.ts.map +1 -1
- package/dist/lib/routes/orphaned-media.js +20 -57
- package/dist/lib/routes/orphaned-media.js.map +1 -1
- package/dist/lib/routes/out.d.ts +1 -1
- package/dist/lib/routes/out.d.ts.map +1 -1
- package/dist/lib/routes/out.js +21 -24
- package/dist/lib/routes/out.js.map +1 -1
- package/dist/lib/routes/parental-controls.d.ts +1 -1
- package/dist/lib/routes/parental-controls.d.ts.map +1 -1
- package/dist/lib/routes/parental-controls.js +91 -95
- package/dist/lib/routes/parental-controls.js.map +1 -1
- package/dist/lib/routes/posts.d.ts +1 -1
- package/dist/lib/routes/posts.d.ts.map +1 -1
- package/dist/lib/routes/posts.js +101 -105
- package/dist/lib/routes/posts.js.map +1 -1
- package/dist/lib/routes/privacy.d.ts +1 -1
- package/dist/lib/routes/privacy.d.ts.map +1 -1
- package/dist/lib/routes/privacy.js +21 -25
- package/dist/lib/routes/privacy.js.map +1 -1
- package/dist/lib/routes/products.d.ts +1 -1
- package/dist/lib/routes/products.d.ts.map +1 -1
- package/dist/lib/routes/products.js +44 -48
- package/dist/lib/routes/products.js.map +1 -1
- package/dist/lib/routes/relationships.d.ts +1 -1
- package/dist/lib/routes/relationships.d.ts.map +1 -1
- package/dist/lib/routes/relationships.js +35 -39
- package/dist/lib/routes/relationships.js.map +1 -1
- package/dist/lib/routes/sentiments.d.ts +1 -1
- package/dist/lib/routes/sentiments.d.ts.map +1 -1
- package/dist/lib/routes/sentiments.js +71 -75
- package/dist/lib/routes/sentiments.js.map +1 -1
- package/dist/lib/routes/setup-status.d.ts +1 -1
- package/dist/lib/routes/setup-status.d.ts.map +1 -1
- package/dist/lib/routes/setup-status.js +17 -20
- package/dist/lib/routes/setup-status.js.map +1 -1
- package/dist/lib/routes/taxonomy-analytics.d.ts +1 -1
- package/dist/lib/routes/taxonomy-analytics.d.ts.map +1 -1
- package/dist/lib/routes/taxonomy-analytics.js +29 -33
- package/dist/lib/routes/taxonomy-analytics.js.map +1 -1
- package/dist/lib/routes/taxonomy.d.ts +1 -1
- package/dist/lib/routes/taxonomy.d.ts.map +1 -1
- package/dist/lib/routes/taxonomy.js +48 -51
- package/dist/lib/routes/taxonomy.js.map +1 -1
- package/dist/lib/routes/tenant-audit.d.ts +1 -1
- package/dist/lib/routes/tenant-audit.d.ts.map +1 -1
- package/dist/lib/routes/tenant-audit.js +35 -92
- package/dist/lib/routes/tenant-audit.js.map +1 -1
- package/dist/lib/routes/tenant-compliance.d.ts +1 -1
- package/dist/lib/routes/tenant-compliance.d.ts.map +1 -1
- package/dist/lib/routes/tenant-compliance.js +16 -52
- package/dist/lib/routes/tenant-compliance.js.map +1 -1
- package/dist/lib/routes/tenant-domains.d.ts +1 -1
- package/dist/lib/routes/tenant-domains.d.ts.map +1 -1
- package/dist/lib/routes/tenant-domains.js +27 -30
- package/dist/lib/routes/tenant-domains.js.map +1 -1
- package/dist/lib/routes/tenant-idp.d.ts +1 -1
- package/dist/lib/routes/tenant-idp.d.ts.map +1 -1
- package/dist/lib/routes/tenant-idp.js +27 -30
- package/dist/lib/routes/tenant-idp.js.map +1 -1
- package/dist/lib/routes/tenant-members.d.ts +1 -1
- package/dist/lib/routes/tenant-members.d.ts.map +1 -1
- package/dist/lib/routes/tenant-members.js +21 -24
- package/dist/lib/routes/tenant-members.js.map +1 -1
- package/dist/lib/routes/tenant-role-mappings.d.ts +1 -1
- package/dist/lib/routes/tenant-role-mappings.d.ts.map +1 -1
- package/dist/lib/routes/tenant-role-mappings.js +27 -30
- package/dist/lib/routes/tenant-role-mappings.js.map +1 -1
- package/dist/lib/routes/tenants.d.ts +1 -1
- package/dist/lib/routes/tenants.d.ts.map +1 -1
- package/dist/lib/routes/tenants.js +37 -40
- package/dist/lib/routes/tenants.js.map +1 -1
- package/dist/lib/routes/types.d.ts +10 -5
- package/dist/lib/routes/types.d.ts.map +1 -1
- package/dist/lib/routes/types.js +1 -2
- package/dist/lib/routes/types.js.map +1 -1
- package/dist/lib/routes/upload-sessions.d.ts +1 -1
- package/dist/lib/routes/upload-sessions.d.ts.map +1 -1
- package/dist/lib/routes/upload-sessions.js +57 -94
- package/dist/lib/routes/upload-sessions.js.map +1 -1
- package/dist/lib/routes/user.d.ts +1 -1
- package/dist/lib/routes/user.d.ts.map +1 -1
- package/dist/lib/routes/user.js +137 -85
- package/dist/lib/routes/user.js.map +1 -1
- package/dist/lib/routes.d.ts +2 -2
- package/dist/lib/routes.d.ts.map +1 -1
- package/dist/lib/routes.js +2 -7
- package/dist/lib/routes.js.map +1 -1
- package/dist/lib/scaling-health.d.ts.map +1 -1
- package/dist/lib/scaling-health.js +6 -9
- package/dist/lib/scaling-health.js.map +1 -1
- package/dist/lib/scheduled/media-stale-cleanup.js +5 -8
- package/dist/lib/scheduled/media-stale-cleanup.js.map +1 -1
- package/dist/lib/scheduled/orphaned-media-monitor.d.ts +1 -1
- package/dist/lib/scheduled/orphaned-media-monitor.d.ts.map +1 -1
- package/dist/lib/scheduled/orphaned-media-monitor.js +5 -42
- package/dist/lib/scheduled/orphaned-media-monitor.js.map +1 -1
- package/dist/lib/schemas.d.ts +85 -204
- package/dist/lib/schemas.d.ts.map +1 -1
- package/dist/lib/schemas.js +71 -74
- package/dist/lib/schemas.js.map +1 -1
- package/dist/lib/secrets/idp-secrets.d.ts +1 -1
- package/dist/lib/secrets/idp-secrets.js +13 -19
- package/dist/lib/secrets/idp-secrets.js.map +1 -1
- package/dist/lib/security-event-cleaner.js +1 -5
- package/dist/lib/security-event-cleaner.js.map +1 -1
- package/dist/lib/security-headers.js +1 -5
- package/dist/lib/security-headers.js.map +1 -1
- package/dist/lib/security-monitor.d.ts +4 -2
- package/dist/lib/security-monitor.d.ts.map +1 -1
- package/dist/lib/security-monitor.js +16 -18
- package/dist/lib/security-monitor.js.map +1 -1
- package/dist/lib/sentiment-digest.d.ts +1 -1
- package/dist/lib/sentiment-digest.d.ts.map +1 -1
- package/dist/lib/sentiment-digest.js +5 -8
- package/dist/lib/sentiment-digest.js.map +1 -1
- package/dist/lib/sentiment-display.js +3 -7
- package/dist/lib/sentiment-display.js.map +1 -1
- package/dist/lib/services/image-normalizer.js +1 -5
- package/dist/lib/services/image-normalizer.js.map +1 -1
- package/dist/lib/services/media-reconciliation-service.d.ts +1 -1
- package/dist/lib/services/media-reconciliation-service.d.ts.map +1 -1
- package/dist/lib/services/media-reconciliation-service.js +7 -11
- package/dist/lib/services/media-reconciliation-service.js.map +1 -1
- package/dist/lib/services/media-upload-service.d.ts +1 -1
- package/dist/lib/services/media-upload-service.d.ts.map +1 -1
- package/dist/lib/services/media-upload-service.js +4 -8
- package/dist/lib/services/media-upload-service.js.map +1 -1
- package/dist/lib/services/user-data-deletion.d.ts +45 -2
- package/dist/lib/services/user-data-deletion.d.ts.map +1 -1
- package/dist/lib/services/user-data-deletion.js +87 -9
- package/dist/lib/services/user-data-deletion.js.map +1 -1
- package/dist/lib/session-awareness.js +2 -6
- package/dist/lib/session-awareness.js.map +1 -1
- package/dist/lib/session-config.js +8 -17
- package/dist/lib/session-config.js.map +1 -1
- package/dist/lib/{session-manager.d.ts → session-cookie.d.ts} +58 -15
- package/dist/lib/session-cookie.d.ts.map +1 -0
- package/dist/lib/session-cookie.js +0 -0
- package/dist/lib/session-cookie.js.map +1 -0
- package/dist/lib/signup-metadata.d.ts +129 -0
- package/dist/lib/signup-metadata.d.ts.map +1 -0
- package/dist/lib/signup-metadata.js +127 -0
- package/dist/lib/signup-metadata.js.map +1 -0
- package/dist/lib/sso-auth-handler.js +1 -5
- package/dist/lib/sso-auth-handler.js.map +1 -1
- package/dist/lib/tag-suggestions-handler.d.ts +1 -1
- package/dist/lib/tag-suggestions-handler.d.ts.map +1 -1
- package/dist/lib/tag-suggestions-handler.js +1 -5
- package/dist/lib/tag-suggestions-handler.js.map +1 -1
- package/dist/lib/taxonomy-handler-factory.d.ts +2 -2
- package/dist/lib/taxonomy-handler-factory.d.ts.map +1 -1
- package/dist/lib/taxonomy-handler-factory.js +7 -10
- package/dist/lib/taxonomy-handler-factory.js.map +1 -1
- package/dist/lib/taxonomy-handler.d.ts +2 -2
- package/dist/lib/taxonomy-handler.d.ts.map +1 -1
- package/dist/lib/taxonomy-handler.js +8 -8
- package/dist/lib/taxonomy-handler.js.map +1 -1
- package/dist/lib/taxonomy-metrics.js +5 -9
- package/dist/lib/taxonomy-metrics.js.map +1 -1
- package/dist/lib/taxonomy-search-metrics.d.ts +2 -2
- package/dist/lib/taxonomy-search-metrics.d.ts.map +1 -1
- package/dist/lib/taxonomy-search-metrics.js +3 -7
- package/dist/lib/taxonomy-search-metrics.js.map +1 -1
- package/dist/lib/tenant/audit-emit.d.ts +18 -8
- package/dist/lib/tenant/audit-emit.d.ts.map +1 -1
- package/dist/lib/tenant/audit-emit.js +50 -11
- package/dist/lib/tenant/audit-emit.js.map +1 -1
- package/dist/lib/tenant/derive-domain.js +1 -4
- package/dist/lib/tenant/derive-domain.js.map +1 -1
- package/dist/lib/tenant/domain-handler.d.ts +2 -2
- package/dist/lib/tenant/domain-handler.d.ts.map +1 -1
- package/dist/lib/tenant/domain-handler.js +50 -62
- package/dist/lib/tenant/domain-handler.js.map +1 -1
- package/dist/lib/tenant/domain-validator.d.ts +1 -1
- package/dist/lib/tenant/domain-validator.js +10 -13
- package/dist/lib/tenant/domain-validator.js.map +1 -1
- package/dist/lib/tenant/domain-verifier.d.ts +3 -3
- package/dist/lib/tenant/domain-verifier.js +8 -11
- package/dist/lib/tenant/domain-verifier.js.map +1 -1
- package/dist/lib/tenant/idp-handler.d.ts +4 -4
- package/dist/lib/tenant/idp-handler.d.ts.map +1 -1
- package/dist/lib/tenant/idp-handler.js +45 -82
- package/dist/lib/tenant/idp-handler.js.map +1 -1
- package/dist/lib/tenant/idp-name.js +1 -4
- package/dist/lib/tenant/idp-name.js.map +1 -1
- package/dist/lib/tenant/member-handler.d.ts +2 -2
- package/dist/lib/tenant/member-handler.d.ts.map +1 -1
- package/dist/lib/tenant/member-handler.js +30 -67
- package/dist/lib/tenant/member-handler.js.map +1 -1
- package/dist/lib/tenant/reserved-slugs.d.ts +1 -1
- package/dist/lib/tenant/reserved-slugs.d.ts.map +1 -1
- package/dist/lib/tenant/reserved-slugs.js +8 -14
- package/dist/lib/tenant/reserved-slugs.js.map +1 -1
- package/dist/lib/tenant/resolve-role.js +1 -4
- package/dist/lib/tenant/resolve-role.js.map +1 -1
- package/dist/lib/tenant/role-mapping-handler.d.ts +2 -2
- package/dist/lib/tenant/role-mapping-handler.d.ts.map +1 -1
- package/dist/lib/tenant/role-mapping-handler.js +24 -61
- package/dist/lib/tenant/role-mapping-handler.js.map +1 -1
- package/dist/lib/tenant/setup-status.d.ts +1 -1
- package/dist/lib/tenant/setup-status.d.ts.map +1 -1
- package/dist/lib/tenant/setup-status.js +3 -40
- package/dist/lib/tenant/setup-status.js.map +1 -1
- package/dist/lib/tenant/slug-validator.js +3 -6
- package/dist/lib/tenant/slug-validator.js.map +1 -1
- package/dist/lib/tenant/tenant-handler.d.ts +2 -2
- package/dist/lib/tenant/tenant-handler.d.ts.map +1 -1
- package/dist/lib/tenant/tenant-handler.js +31 -68
- package/dist/lib/tenant/tenant-handler.js.map +1 -1
- package/dist/lib/tenant/transfer-ownership.js +2 -6
- package/dist/lib/tenant/transfer-ownership.js.map +1 -1
- package/dist/lib/tenant-scope.d.ts +97 -0
- package/dist/lib/tenant-scope.d.ts.map +1 -0
- package/dist/lib/tenant-scope.js +270 -0
- package/dist/lib/tenant-scope.js.map +1 -0
- package/dist/lib/terminology.d.ts.map +1 -1
- package/dist/lib/terminology.js +7 -9
- package/dist/lib/terminology.js.map +1 -1
- package/dist/lib/theme.js +2 -6
- package/dist/lib/theme.js.map +1 -1
- package/dist/lib/threat-intel-service.d.ts +2 -2
- package/dist/lib/threat-intel-service.d.ts.map +1 -1
- package/dist/lib/threat-intel-service.js +3 -7
- package/dist/lib/threat-intel-service.js.map +1 -1
- package/dist/lib/types/media-reconciliation.js +1 -2
- package/dist/lib/types/media-reconciliation.js.map +1 -1
- package/dist/lib/upload-session-handler.d.ts +1 -1
- package/dist/lib/upload-session-handler.d.ts.map +1 -1
- package/dist/lib/upload-session-handler.js +13 -50
- package/dist/lib/upload-session-handler.js.map +1 -1
- package/dist/lib/user/derive-handle.js +2 -6
- package/dist/lib/user/derive-handle.js.map +1 -1
- package/dist/lib/user-badge.js +6 -14
- package/dist/lib/user-badge.js.map +1 -1
- package/dist/lib/user-deletion-handler-enhanced.d.ts +2 -2
- package/dist/lib/user-deletion-handler-enhanced.d.ts.map +1 -1
- package/dist/lib/user-deletion-handler-enhanced.js +16 -53
- package/dist/lib/user-deletion-handler-enhanced.js.map +1 -1
- package/dist/lib/user-deprovisioning.d.ts +1 -1
- package/dist/lib/user-deprovisioning.d.ts.map +1 -1
- package/dist/lib/user-deprovisioning.js +16 -20
- package/dist/lib/user-deprovisioning.js.map +1 -1
- package/dist/lib/user-export-handler.d.ts +4 -4
- package/dist/lib/user-export-handler.d.ts.map +1 -1
- package/dist/lib/user-export-handler.js +11 -15
- package/dist/lib/user-export-handler.js.map +1 -1
- package/dist/lib/validate-request.js +8 -13
- package/dist/lib/validate-request.js.map +1 -1
- package/dist/lib/validation/feature-toggle-schemas.d.ts +130 -249
- package/dist/lib/validation/feature-toggle-schemas.d.ts.map +1 -1
- package/dist/lib/validation/feature-toggle-schemas.js +50 -59
- package/dist/lib/validation/feature-toggle-schemas.js.map +1 -1
- package/dist/lib/validation/validate-request.d.ts.map +1 -1
- package/dist/lib/validation/validate-request.js +12 -23
- package/dist/lib/validation/validate-request.js.map +1 -1
- package/dist/lib/validation.js +1 -5
- package/dist/lib/validation.js.map +1 -1
- package/dist/lib/version.js +3 -8
- package/dist/lib/version.js.map +1 -1
- package/dist/server.d.ts +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +29 -69
- package/dist/server.js.map +1 -1
- package/dist/types/cloudflare-compat.d.ts +3 -93
- package/dist/types/cloudflare-compat.d.ts.map +1 -1
- package/dist/types/cloudflare-compat.js +1 -2
- package/dist/types/cloudflare-compat.js.map +1 -1
- package/dist/worker.d.ts +6 -6
- package/dist/worker.d.ts.map +1 -1
- package/dist/worker.js +6 -13
- package/dist/worker.js.map +1 -1
- package/package.json +30 -17
- package/prisma/migrations/20260602054730_add_entity_geo_and_pending_schema/migration.sql +113 -0
- package/prisma/migrations/20260602162901_research_foundations/migration.sql +65 -0
- package/prisma/migrations/20260604130000_surveillance_phase0_enablers/migration.sql +107 -0
- package/prisma/migrations/20260604140000_fold_link_reports_into_reports/migration.sql +23 -0
- package/prisma/migrations/20260604140000_fold_link_reports_into_reports/rollback.reference.sql +31 -0
- package/prisma/schema.prisma +419 -68
- package/src/lambda/cleanup-cron.ts +10 -7
- package/src/lambda/create-auth-challenge.ts +6 -3
- package/src/lambda/delete-account-worker.ts +17 -12
- package/src/lambda/diagnostics-proxy.ts +9 -6
- package/src/lambda/e2e-sweeper.ts +17 -23
- package/src/lambda/federation-outbox-worker.ts +4 -1
- package/src/lambda/followers-events-worker.ts +4 -1
- package/src/lambda/hourly-cron.ts +112 -20
- package/src/lambda/link-check-worker.ts +4 -1
- package/src/lambda/maintenance-cron.ts +24 -13
- package/src/lambda/media-processing-worker.ts +5 -2
- package/src/lambda/media-reconciliation-worker.ts +4 -1
- package/src/lambda/nightly-cron.ts +53 -54
- package/src/lambda/post-confirmation.ts +188 -62
- package/src/lambda/pre-token-generation.ts +39 -44
- package/src/lambda/verify-auth-challenge.ts +4 -1
- package/dist/lib/audit/emit.d.ts +0 -56
- package/dist/lib/audit/emit.d.ts.map +0 -1
- package/dist/lib/audit/emit.js +0 -124
- package/dist/lib/audit/emit.js.map +0 -1
- package/dist/lib/audit/event-types.d.ts +0 -36
- package/dist/lib/audit/event-types.d.ts.map +0 -1
- package/dist/lib/audit/event-types.js +0 -69
- package/dist/lib/audit/event-types.js.map +0 -1
- package/dist/lib/audit-logger.d.ts +0 -142
- package/dist/lib/audit-logger.d.ts.map +0 -1
- package/dist/lib/audit-logger.js +0 -326
- package/dist/lib/audit-logger.js.map +0 -1
- package/dist/lib/circuit-breaker.d.ts +0 -27
- package/dist/lib/circuit-breaker.d.ts.map +0 -1
- package/dist/lib/circuit-breaker.js +0 -63
- package/dist/lib/circuit-breaker.js.map +0 -1
- package/dist/lib/graph/dual-write-service.d.ts +0 -116
- package/dist/lib/graph/dual-write-service.d.ts.map +0 -1
- package/dist/lib/graph/dual-write-service.js +0 -332
- package/dist/lib/graph/dual-write-service.js.map +0 -1
- package/dist/lib/graph/dual-write.d.ts +0 -396
- package/dist/lib/graph/dual-write.d.ts.map +0 -1
- package/dist/lib/graph/dual-write.js +0 -53
- package/dist/lib/graph/dual-write.js.map +0 -1
- package/dist/lib/graph/graph-schema-init.d.ts +0 -31
- package/dist/lib/graph/graph-schema-init.d.ts.map +0 -1
- package/dist/lib/graph/graph-schema-init.js +0 -105
- package/dist/lib/graph/graph-schema-init.js.map +0 -1
- package/dist/lib/graph/neo4j-graph-service.d.ts +0 -186
- package/dist/lib/graph/neo4j-graph-service.d.ts.map +0 -1
- package/dist/lib/graph/neo4j-graph-service.js +0 -1625
- package/dist/lib/graph/neo4j-graph-service.js.map +0 -1
- package/dist/lib/graph/reconciliation-service.d.ts +0 -113
- package/dist/lib/graph/reconciliation-service.d.ts.map +0 -1
- package/dist/lib/graph/reconciliation-service.js +0 -533
- package/dist/lib/graph/reconciliation-service.js.map +0 -1
- package/dist/lib/id-generator.d.ts +0 -29
- package/dist/lib/id-generator.d.ts.map +0 -1
- package/dist/lib/id-generator.js +0 -51
- package/dist/lib/id-generator.js.map +0 -1
- package/dist/lib/kv/dynamodb-kv.d.ts +0 -39
- package/dist/lib/kv/dynamodb-kv.d.ts.map +0 -1
- package/dist/lib/kv/dynamodb-kv.js +0 -239
- package/dist/lib/kv/dynamodb-kv.js.map +0 -1
- package/dist/lib/queue/sqs-queue.d.ts +0 -16
- package/dist/lib/queue/sqs-queue.d.ts.map +0 -1
- package/dist/lib/queue/sqs-queue.js +0 -39
- package/dist/lib/queue/sqs-queue.js.map +0 -1
- package/dist/lib/route-matcher.d.ts +0 -24
- package/dist/lib/route-matcher.d.ts.map +0 -1
- package/dist/lib/route-matcher.js +0 -96
- package/dist/lib/route-matcher.js.map +0 -1
- package/dist/lib/router.d.ts +0 -26
- package/dist/lib/router.d.ts.map +0 -1
- package/dist/lib/router.js +0 -90
- package/dist/lib/router.js.map +0 -1
- package/dist/lib/routes-all.d.ts +0 -9
- package/dist/lib/routes-all.d.ts.map +0 -1
- package/dist/lib/routes-all.js +0 -170
- package/dist/lib/routes-all.js.map +0 -1
- package/dist/lib/secret-resolver.d.ts +0 -88
- package/dist/lib/secret-resolver.d.ts.map +0 -1
- package/dist/lib/secret-resolver.js +0 -183
- package/dist/lib/secret-resolver.js.map +0 -1
- package/dist/lib/session-manager.d.ts.map +0 -1
- package/dist/lib/session-manager.js +0 -492
- package/dist/lib/session-manager.js.map +0 -1
- package/dist/lib/storage/s3-storage.d.ts +0 -29
- package/dist/lib/storage/s3-storage.d.ts.map +0 -1
- package/dist/lib/storage/s3-storage.js +0 -135
- package/dist/lib/storage/s3-storage.js.map +0 -1
- package/dist/lib/tenant-context.d.ts +0 -35
- package/dist/lib/tenant-context.d.ts.map +0 -1
- package/dist/lib/tenant-context.js +0 -54
- package/dist/lib/tenant-context.js.map +0 -1
|
@@ -1,82 +1,45 @@
|
|
|
1
|
-
"use strict";
|
|
2
1
|
/**
|
|
3
2
|
* Dashboard Routes
|
|
4
3
|
*
|
|
5
4
|
* Routes for internal dashboard, partner dashboard, and admin features
|
|
6
5
|
*/
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}));
|
|
18
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
19
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
20
|
-
}) : function(o, v) {
|
|
21
|
-
o["default"] = v;
|
|
22
|
-
});
|
|
23
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
24
|
-
var ownKeys = function(o) {
|
|
25
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
26
|
-
var ar = [];
|
|
27
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
28
|
-
return ar;
|
|
29
|
-
};
|
|
30
|
-
return ownKeys(o);
|
|
31
|
-
};
|
|
32
|
-
return function (mod) {
|
|
33
|
-
if (mod && mod.__esModule) return mod;
|
|
34
|
-
var result = {};
|
|
35
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
36
|
-
__setModuleDefault(result, mod);
|
|
37
|
-
return result;
|
|
38
|
-
};
|
|
39
|
-
})();
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
exports.dashboardRoutes = void 0;
|
|
42
|
-
const db_1 = require("../../db");
|
|
43
|
-
const worker_1 = require("../../worker");
|
|
44
|
-
const database_connection_manager_1 = require("../database-connection-manager");
|
|
45
|
-
const db_query_helper_1 = require("../db-query-helper");
|
|
46
|
-
const logger_1 = require("../logger");
|
|
47
|
-
const middleware_1 = require("../middleware");
|
|
48
|
-
const region_detection_1 = require("../region-detection");
|
|
49
|
-
const secret_resolver_1 = require("../secret-resolver");
|
|
50
|
-
const security_headers_1 = require("../security-headers");
|
|
51
|
-
const session_manager_1 = require("../session-manager");
|
|
52
|
-
exports.dashboardRoutes = [
|
|
6
|
+
import { createPrisma } from "../../db.js";
|
|
7
|
+
import { addCorsHeaders } from "../../worker.js";
|
|
8
|
+
import { sharedDatabaseConnectionManager } from "../database-connection-manager.js";
|
|
9
|
+
import { QueryTimeoutPresets, withQueryTimeoutAndRetry, } from "../db-query-helper.js";
|
|
10
|
+
import { getLogger } from "../logger.js";
|
|
11
|
+
import { corsMiddleware, csrfMiddleware } from "../middleware.js";
|
|
12
|
+
import { detectRegionSync } from "../region-detection.js";
|
|
13
|
+
import { SecurityHeaders } from "../security-headers.js";
|
|
14
|
+
import { SessionManager } from "../session-cookie.js";
|
|
15
|
+
export const dashboardRoutes = [
|
|
53
16
|
// Internal Dashboard - Statistics
|
|
54
17
|
{
|
|
55
18
|
path: "/api/dashboard/metrics/users",
|
|
56
19
|
method: "GET",
|
|
57
20
|
handler: async (request, env) => {
|
|
58
|
-
const sessionManager = new
|
|
59
|
-
const securityHeaders = new
|
|
60
|
-
const logger =
|
|
61
|
-
const session = await sessionManager.getSession(request,
|
|
21
|
+
const sessionManager = new SessionManager();
|
|
22
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
23
|
+
const logger = getLogger();
|
|
24
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
62
25
|
if (!session) {
|
|
63
26
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
64
|
-
return
|
|
27
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
65
28
|
}
|
|
66
29
|
try {
|
|
67
30
|
// Check user role - must be INTERNAL
|
|
68
|
-
const region =
|
|
69
|
-
const dbManager =
|
|
70
|
-
const user = await
|
|
31
|
+
const region = detectRegionSync(request, env);
|
|
32
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
33
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
71
34
|
return db.user.findUnique({
|
|
72
35
|
where: { id: session.userId },
|
|
73
36
|
select: { role: true },
|
|
74
37
|
});
|
|
75
|
-
},
|
|
38
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
76
39
|
if (!user ||
|
|
77
40
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
78
41
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
79
|
-
return
|
|
42
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
80
43
|
}
|
|
81
44
|
// Parse query parameters
|
|
82
45
|
const url = new URL(request.url);
|
|
@@ -141,49 +104,49 @@ exports.dashboardRoutes = [
|
|
|
141
104
|
changeType,
|
|
142
105
|
trend,
|
|
143
106
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
144
|
-
return
|
|
107
|
+
return addCorsHeaders(response, request, env);
|
|
145
108
|
}
|
|
146
109
|
catch (error) {
|
|
147
110
|
logger.error("[Dashboard] Error getting user metrics:", error);
|
|
148
111
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get user metrics" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
149
|
-
return
|
|
112
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
150
113
|
}
|
|
151
114
|
},
|
|
152
|
-
middleware: [
|
|
115
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
153
116
|
description: "Get user metrics (DAU/WAU/MAU)",
|
|
154
117
|
},
|
|
155
118
|
{
|
|
156
119
|
path: "/api/dashboard/system/health",
|
|
157
120
|
method: "GET",
|
|
158
121
|
handler: async (request, env) => {
|
|
159
|
-
const sessionManager = new
|
|
160
|
-
const securityHeaders = new
|
|
161
|
-
const logger =
|
|
162
|
-
const session = await sessionManager.getSession(request,
|
|
122
|
+
const sessionManager = new SessionManager();
|
|
123
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
124
|
+
const logger = getLogger();
|
|
125
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
163
126
|
if (!session) {
|
|
164
127
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
165
|
-
return
|
|
128
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
166
129
|
}
|
|
167
130
|
try {
|
|
168
131
|
// Check user role - must be INTERNAL
|
|
169
|
-
const region =
|
|
170
|
-
const dbManager =
|
|
171
|
-
const user = await
|
|
132
|
+
const region = detectRegionSync(request, env);
|
|
133
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
134
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
172
135
|
return db.user.findUnique({
|
|
173
136
|
where: { id: session.userId },
|
|
174
137
|
select: { role: true },
|
|
175
138
|
});
|
|
176
|
-
},
|
|
139
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
177
140
|
if (!user ||
|
|
178
141
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
179
142
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
180
|
-
return
|
|
143
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
181
144
|
}
|
|
182
145
|
// Test database connection
|
|
183
146
|
let dbStatus = "healthy";
|
|
184
147
|
let dbUptime = 99.9;
|
|
185
148
|
try {
|
|
186
|
-
await
|
|
149
|
+
await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
187
150
|
await db.user.count();
|
|
188
151
|
}, { timeoutMs: 2000, retryTimeoutMs: 1000 });
|
|
189
152
|
}
|
|
@@ -208,43 +171,43 @@ exports.dashboardRoutes = [
|
|
|
208
171
|
},
|
|
209
172
|
],
|
|
210
173
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
211
|
-
return
|
|
174
|
+
return addCorsHeaders(response, request, env);
|
|
212
175
|
}
|
|
213
176
|
catch (error) {
|
|
214
177
|
logger.error("[Dashboard] Error getting system health:", error);
|
|
215
178
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get system health" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
216
|
-
return
|
|
179
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
217
180
|
}
|
|
218
181
|
},
|
|
219
|
-
middleware: [
|
|
182
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
220
183
|
description: "Get system health status",
|
|
221
184
|
},
|
|
222
185
|
{
|
|
223
186
|
path: "/api/dashboard/metrics/performance",
|
|
224
187
|
method: "GET",
|
|
225
188
|
handler: async (request, env) => {
|
|
226
|
-
const sessionManager = new
|
|
227
|
-
const securityHeaders = new
|
|
228
|
-
const logger =
|
|
229
|
-
const session = await sessionManager.getSession(request,
|
|
189
|
+
const sessionManager = new SessionManager();
|
|
190
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
191
|
+
const logger = getLogger();
|
|
192
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
230
193
|
if (!session) {
|
|
231
194
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
232
|
-
return
|
|
195
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
233
196
|
}
|
|
234
197
|
try {
|
|
235
198
|
// Check user role - must be INTERNAL
|
|
236
|
-
const region =
|
|
237
|
-
const dbManager =
|
|
238
|
-
const user = await
|
|
199
|
+
const region = detectRegionSync(request, env);
|
|
200
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
201
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
239
202
|
return db.user.findUnique({
|
|
240
203
|
where: { id: session.userId },
|
|
241
204
|
select: { role: true },
|
|
242
205
|
});
|
|
243
|
-
},
|
|
206
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
244
207
|
if (!user ||
|
|
245
208
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
246
209
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
247
|
-
return
|
|
210
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
248
211
|
}
|
|
249
212
|
// Parse query parameters
|
|
250
213
|
const url = new URL(request.url);
|
|
@@ -263,15 +226,15 @@ exports.dashboardRoutes = [
|
|
|
263
226
|
errorRate: [],
|
|
264
227
|
},
|
|
265
228
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
266
|
-
return
|
|
229
|
+
return addCorsHeaders(response, request, env);
|
|
267
230
|
}
|
|
268
231
|
catch (error) {
|
|
269
232
|
logger.error("[Dashboard] Error getting performance metrics:", error);
|
|
270
233
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get performance metrics" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
271
|
-
return
|
|
234
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
272
235
|
}
|
|
273
236
|
},
|
|
274
|
-
middleware: [
|
|
237
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
275
238
|
description: "Get API performance metrics",
|
|
276
239
|
},
|
|
277
240
|
// User Management
|
|
@@ -279,28 +242,28 @@ exports.dashboardRoutes = [
|
|
|
279
242
|
path: "/api/dashboard/users",
|
|
280
243
|
method: "GET",
|
|
281
244
|
handler: async (request, env) => {
|
|
282
|
-
const sessionManager = new
|
|
283
|
-
const securityHeaders = new
|
|
284
|
-
const logger =
|
|
285
|
-
const session = await sessionManager.getSession(request,
|
|
245
|
+
const sessionManager = new SessionManager();
|
|
246
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
247
|
+
const logger = getLogger();
|
|
248
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
286
249
|
if (!session) {
|
|
287
250
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
288
|
-
return
|
|
251
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
289
252
|
}
|
|
290
253
|
try {
|
|
291
254
|
// Check user role - must be INTERNAL
|
|
292
|
-
const region =
|
|
293
|
-
const dbManager =
|
|
294
|
-
const user = await
|
|
255
|
+
const region = detectRegionSync(request, env);
|
|
256
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
257
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
295
258
|
return db.user.findUnique({
|
|
296
259
|
where: { id: session.userId },
|
|
297
260
|
select: { role: true },
|
|
298
261
|
});
|
|
299
|
-
},
|
|
262
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
300
263
|
if (!user ||
|
|
301
264
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
302
265
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
303
|
-
return
|
|
266
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
304
267
|
}
|
|
305
268
|
// Parse query parameters
|
|
306
269
|
const url = new URL(request.url);
|
|
@@ -329,7 +292,7 @@ exports.dashboardRoutes = [
|
|
|
329
292
|
}
|
|
330
293
|
// Get users
|
|
331
294
|
const [users, total] = await Promise.all([
|
|
332
|
-
|
|
295
|
+
withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
333
296
|
return db.user.findMany({
|
|
334
297
|
where,
|
|
335
298
|
select: {
|
|
@@ -343,10 +306,10 @@ exports.dashboardRoutes = [
|
|
|
343
306
|
skip: offset,
|
|
344
307
|
orderBy: { createdAt: "desc" },
|
|
345
308
|
});
|
|
346
|
-
},
|
|
347
|
-
|
|
309
|
+
}, QueryTimeoutPresets.STANDARD),
|
|
310
|
+
withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
348
311
|
return db.user.count({ where });
|
|
349
|
-
},
|
|
312
|
+
}, QueryTimeoutPresets.STANDARD),
|
|
350
313
|
]);
|
|
351
314
|
const response = securityHeaders.createSecureResponse(JSON.stringify({
|
|
352
315
|
users: users.map((u) => ({
|
|
@@ -358,53 +321,53 @@ exports.dashboardRoutes = [
|
|
|
358
321
|
})),
|
|
359
322
|
total,
|
|
360
323
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
361
|
-
return
|
|
324
|
+
return addCorsHeaders(response, request, env);
|
|
362
325
|
}
|
|
363
326
|
catch (error) {
|
|
364
327
|
logger.error("[Dashboard] Error listing users:", error);
|
|
365
328
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to list users" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
366
|
-
return
|
|
329
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
367
330
|
}
|
|
368
331
|
},
|
|
369
|
-
middleware: [
|
|
332
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
370
333
|
description: "List users with search and filtering",
|
|
371
334
|
},
|
|
372
335
|
{
|
|
373
336
|
path: /^\/api\/dashboard\/users\/(.+)$/,
|
|
374
337
|
method: "GET",
|
|
375
338
|
handler: async (request, env, { pathname }) => {
|
|
376
|
-
const sessionManager = new
|
|
377
|
-
const securityHeaders = new
|
|
378
|
-
const logger =
|
|
379
|
-
const session = await sessionManager.getSession(request,
|
|
339
|
+
const sessionManager = new SessionManager();
|
|
340
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
341
|
+
const logger = getLogger();
|
|
342
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
380
343
|
if (!session) {
|
|
381
344
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
382
|
-
return
|
|
345
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
383
346
|
}
|
|
384
347
|
try {
|
|
385
348
|
// Check user role - must be INTERNAL
|
|
386
|
-
const region =
|
|
387
|
-
const dbManager =
|
|
388
|
-
const user = await
|
|
349
|
+
const region = detectRegionSync(request, env);
|
|
350
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
351
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
389
352
|
return db.user.findUnique({
|
|
390
353
|
where: { id: session.userId },
|
|
391
354
|
select: { role: true },
|
|
392
355
|
});
|
|
393
|
-
},
|
|
356
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
394
357
|
if (!user ||
|
|
395
358
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
396
359
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
397
|
-
return
|
|
360
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
398
361
|
}
|
|
399
362
|
// Extract user ID from path
|
|
400
363
|
const userIdMatch = pathname.match(/^\/api\/dashboard\/users\/(.+)$/);
|
|
401
364
|
if (!userIdMatch) {
|
|
402
365
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid user ID" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
403
|
-
return
|
|
366
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
404
367
|
}
|
|
405
368
|
const userId = userIdMatch[1];
|
|
406
369
|
// Get user details
|
|
407
|
-
const targetUser = await
|
|
370
|
+
const targetUser = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
408
371
|
return db.user.findUnique({
|
|
409
372
|
where: { id: userId },
|
|
410
373
|
select: {
|
|
@@ -415,10 +378,10 @@ exports.dashboardRoutes = [
|
|
|
415
378
|
createdAt: true,
|
|
416
379
|
},
|
|
417
380
|
});
|
|
418
|
-
},
|
|
381
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
419
382
|
if (!targetUser) {
|
|
420
383
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "User not found" }), { status: 404, headers: { "content-type": "application/json" } });
|
|
421
|
-
return
|
|
384
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
422
385
|
}
|
|
423
386
|
// Get user stats (post count, comment count, etc.)
|
|
424
387
|
// TODO: Implement actual stats calculation
|
|
@@ -434,49 +397,49 @@ exports.dashboardRoutes = [
|
|
|
434
397
|
createdAt: targetUser.createdAt.toISOString(),
|
|
435
398
|
stats,
|
|
436
399
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
437
|
-
return
|
|
400
|
+
return addCorsHeaders(response, request, env);
|
|
438
401
|
}
|
|
439
402
|
catch (error) {
|
|
440
403
|
logger.error("[Dashboard] Error getting user details:", error);
|
|
441
404
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get user details" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
442
|
-
return
|
|
405
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
443
406
|
}
|
|
444
407
|
},
|
|
445
|
-
middleware: [
|
|
408
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
446
409
|
description: "Get detailed user information",
|
|
447
410
|
},
|
|
448
411
|
{
|
|
449
412
|
path: /^\/api\/dashboard\/users\/(.+)$/,
|
|
450
413
|
method: "PATCH",
|
|
451
414
|
handler: async (request, env, { pathname }) => {
|
|
452
|
-
const sessionManager = new
|
|
453
|
-
const securityHeaders = new
|
|
454
|
-
const logger =
|
|
455
|
-
const session = await sessionManager.getSession(request,
|
|
415
|
+
const sessionManager = new SessionManager();
|
|
416
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
417
|
+
const logger = getLogger();
|
|
418
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
456
419
|
if (!session) {
|
|
457
420
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
458
|
-
return
|
|
421
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
459
422
|
}
|
|
460
423
|
try {
|
|
461
424
|
// Check user role - must be INTERNAL
|
|
462
|
-
const region =
|
|
463
|
-
const dbManager =
|
|
464
|
-
const user = await
|
|
425
|
+
const region = detectRegionSync(request, env);
|
|
426
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
427
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
465
428
|
return db.user.findUnique({
|
|
466
429
|
where: { id: session.userId },
|
|
467
430
|
select: { role: true },
|
|
468
431
|
});
|
|
469
|
-
},
|
|
432
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
470
433
|
if (!user ||
|
|
471
434
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
472
435
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
473
|
-
return
|
|
436
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
474
437
|
}
|
|
475
438
|
// Extract user ID from path
|
|
476
439
|
const userIdMatch = pathname.match(/^\/api\/dashboard\/users\/(.+)$/);
|
|
477
440
|
if (!userIdMatch) {
|
|
478
441
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid user ID" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
479
|
-
return
|
|
442
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
480
443
|
}
|
|
481
444
|
const userId = userIdMatch[1];
|
|
482
445
|
// Parse request body
|
|
@@ -496,7 +459,7 @@ exports.dashboardRoutes = [
|
|
|
496
459
|
];
|
|
497
460
|
if (!validRoles.includes(role)) {
|
|
498
461
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid role" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
499
|
-
return
|
|
462
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
500
463
|
}
|
|
501
464
|
updateData.role = role;
|
|
502
465
|
}
|
|
@@ -510,10 +473,10 @@ exports.dashboardRoutes = [
|
|
|
510
473
|
}
|
|
511
474
|
if (Object.keys(updateData).length === 0) {
|
|
512
475
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "No valid fields to update" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
513
|
-
return
|
|
476
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
514
477
|
}
|
|
515
478
|
// Update user
|
|
516
|
-
const updatedUser = await
|
|
479
|
+
const updatedUser = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
517
480
|
return db.user.update({
|
|
518
481
|
where: { id: userId },
|
|
519
482
|
data: updateData,
|
|
@@ -525,7 +488,7 @@ exports.dashboardRoutes = [
|
|
|
525
488
|
createdAt: true,
|
|
526
489
|
},
|
|
527
490
|
});
|
|
528
|
-
},
|
|
491
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
529
492
|
const response = securityHeaders.createSecureResponse(JSON.stringify({
|
|
530
493
|
id: updatedUser.id,
|
|
531
494
|
email: updatedUser.email,
|
|
@@ -533,63 +496,63 @@ exports.dashboardRoutes = [
|
|
|
533
496
|
status: updatedUser.suspended ? "suspended" : "active",
|
|
534
497
|
updatedAt: new Date().toISOString(),
|
|
535
498
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
536
|
-
return
|
|
499
|
+
return addCorsHeaders(response, request, env);
|
|
537
500
|
}
|
|
538
501
|
catch (error) {
|
|
539
502
|
logger.error("[Dashboard] Error updating user:", error);
|
|
540
503
|
if (error.code === "P2025" ||
|
|
541
504
|
error.message?.includes("Record to update not found")) {
|
|
542
505
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "User not found" }), { status: 404, headers: { "content-type": "application/json" } });
|
|
543
|
-
return
|
|
506
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
544
507
|
}
|
|
545
508
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to update user" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
546
|
-
return
|
|
509
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
547
510
|
}
|
|
548
511
|
},
|
|
549
|
-
middleware: [
|
|
512
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
550
513
|
description: "Update user (role, status, etc.)",
|
|
551
514
|
},
|
|
552
515
|
{
|
|
553
516
|
path: /^\/api\/dashboard\/users\/(.+)$/,
|
|
554
517
|
method: "DELETE",
|
|
555
518
|
handler: async (request, env, { pathname }) => {
|
|
556
|
-
const sessionManager = new
|
|
557
|
-
const securityHeaders = new
|
|
558
|
-
const logger =
|
|
559
|
-
const session = await sessionManager.getSession(request,
|
|
519
|
+
const sessionManager = new SessionManager();
|
|
520
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
521
|
+
const logger = getLogger();
|
|
522
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
560
523
|
if (!session) {
|
|
561
524
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
562
|
-
return
|
|
525
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
563
526
|
}
|
|
564
527
|
try {
|
|
565
528
|
// Check user role - must be INTERNAL
|
|
566
|
-
const region =
|
|
567
|
-
const dbManager =
|
|
568
|
-
const user = await
|
|
529
|
+
const region = detectRegionSync(request, env);
|
|
530
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
531
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
569
532
|
return db.user.findUnique({
|
|
570
533
|
where: { id: session.userId },
|
|
571
534
|
select: { role: true },
|
|
572
535
|
});
|
|
573
|
-
},
|
|
536
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
574
537
|
if (!user ||
|
|
575
538
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
576
539
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
577
|
-
return
|
|
540
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
578
541
|
}
|
|
579
542
|
// Extract user ID from path
|
|
580
543
|
const userIdMatch = pathname.match(/^\/api\/dashboard\/users\/(.+)$/);
|
|
581
544
|
if (!userIdMatch) {
|
|
582
545
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid user ID" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
583
|
-
return
|
|
546
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
584
547
|
}
|
|
585
548
|
const userId = userIdMatch[1];
|
|
586
549
|
// Prevent self-deletion
|
|
587
550
|
if (userId === session.userId) {
|
|
588
551
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Cannot delete your own account" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
589
|
-
return
|
|
552
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
590
553
|
}
|
|
591
554
|
// Delete user (soft delete by setting deletion flags)
|
|
592
|
-
await
|
|
555
|
+
await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
593
556
|
return db.user.update({
|
|
594
557
|
where: { id: userId },
|
|
595
558
|
data: {
|
|
@@ -597,25 +560,25 @@ exports.dashboardRoutes = [
|
|
|
597
560
|
deletionScheduledAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days
|
|
598
561
|
},
|
|
599
562
|
});
|
|
600
|
-
},
|
|
563
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
601
564
|
const response = securityHeaders.createSecureResponse(JSON.stringify({
|
|
602
565
|
success: true,
|
|
603
566
|
message: "User deleted successfully",
|
|
604
567
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
605
|
-
return
|
|
568
|
+
return addCorsHeaders(response, request, env);
|
|
606
569
|
}
|
|
607
570
|
catch (error) {
|
|
608
571
|
logger.error("[Dashboard] Error deleting user:", error);
|
|
609
572
|
if (error.code === "P2025" ||
|
|
610
573
|
error.message?.includes("Record to update not found")) {
|
|
611
574
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "User not found" }), { status: 404, headers: { "content-type": "application/json" } });
|
|
612
|
-
return
|
|
575
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
613
576
|
}
|
|
614
577
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to delete user" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
615
|
-
return
|
|
578
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
616
579
|
}
|
|
617
580
|
},
|
|
618
|
-
middleware: [
|
|
581
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
619
582
|
description: "Delete user account",
|
|
620
583
|
},
|
|
621
584
|
// Content Moderation
|
|
@@ -623,28 +586,28 @@ exports.dashboardRoutes = [
|
|
|
623
586
|
path: "/api/dashboard/moderation/posts",
|
|
624
587
|
method: "GET",
|
|
625
588
|
handler: async (request, env) => {
|
|
626
|
-
const sessionManager = new
|
|
627
|
-
const securityHeaders = new
|
|
628
|
-
const logger =
|
|
629
|
-
const session = await sessionManager.getSession(request,
|
|
589
|
+
const sessionManager = new SessionManager();
|
|
590
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
591
|
+
const logger = getLogger();
|
|
592
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
630
593
|
if (!session) {
|
|
631
594
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
632
|
-
return
|
|
595
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
633
596
|
}
|
|
634
597
|
try {
|
|
635
598
|
// Check user role - must be INTERNAL
|
|
636
|
-
const region =
|
|
637
|
-
const dbManager =
|
|
638
|
-
const user = await
|
|
599
|
+
const region = detectRegionSync(request, env);
|
|
600
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
601
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
639
602
|
return db.user.findUnique({
|
|
640
603
|
where: { id: session.userId },
|
|
641
604
|
select: { role: true },
|
|
642
605
|
});
|
|
643
|
-
},
|
|
606
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
644
607
|
if (!user ||
|
|
645
608
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
646
609
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
647
|
-
return
|
|
610
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
648
611
|
}
|
|
649
612
|
// Parse query parameters
|
|
650
613
|
const url = new URL(request.url);
|
|
@@ -657,49 +620,49 @@ exports.dashboardRoutes = [
|
|
|
657
620
|
posts: [],
|
|
658
621
|
total: 0,
|
|
659
622
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
660
|
-
return
|
|
623
|
+
return addCorsHeaders(response, request, env);
|
|
661
624
|
}
|
|
662
625
|
catch (error) {
|
|
663
626
|
logger.error("[Dashboard] Error listing moderation posts:", error);
|
|
664
627
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to list moderation posts" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
665
|
-
return
|
|
628
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
666
629
|
}
|
|
667
630
|
},
|
|
668
|
-
middleware: [
|
|
631
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
669
632
|
description: "List posts requiring moderation",
|
|
670
633
|
},
|
|
671
634
|
{
|
|
672
635
|
path: /^\/api\/dashboard\/moderation\/posts\/(.+)\/action$/,
|
|
673
636
|
method: "POST",
|
|
674
637
|
handler: async (request, env, { pathname }) => {
|
|
675
|
-
const sessionManager = new
|
|
676
|
-
const securityHeaders = new
|
|
677
|
-
const logger =
|
|
678
|
-
const session = await sessionManager.getSession(request,
|
|
638
|
+
const sessionManager = new SessionManager();
|
|
639
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
640
|
+
const logger = getLogger();
|
|
641
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
679
642
|
if (!session) {
|
|
680
643
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
681
|
-
return
|
|
644
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
682
645
|
}
|
|
683
646
|
try {
|
|
684
647
|
// Check user role - must be INTERNAL
|
|
685
|
-
const region =
|
|
686
|
-
const dbManager =
|
|
687
|
-
const user = await
|
|
648
|
+
const region = detectRegionSync(request, env);
|
|
649
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
650
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
688
651
|
return db.user.findUnique({
|
|
689
652
|
where: { id: session.userId },
|
|
690
653
|
select: { role: true },
|
|
691
654
|
});
|
|
692
|
-
},
|
|
655
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
693
656
|
if (!user ||
|
|
694
657
|
(user.role !== "INTERNAL" && user.role !== "SUPER_ADMIN")) {
|
|
695
658
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Internal access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
696
|
-
return
|
|
659
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
697
660
|
}
|
|
698
661
|
// Extract post ID from path
|
|
699
662
|
const postIdMatch = pathname.match(/^\/api\/dashboard\/moderation\/posts\/(.+)\/action$/);
|
|
700
663
|
if (!postIdMatch) {
|
|
701
664
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid post ID" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
702
|
-
return
|
|
665
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
703
666
|
}
|
|
704
667
|
const postId = postIdMatch[1];
|
|
705
668
|
// Parse request body
|
|
@@ -710,7 +673,7 @@ exports.dashboardRoutes = [
|
|
|
710
673
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({
|
|
711
674
|
error: 'Invalid action. Must be "approve", "reject", or "delete"',
|
|
712
675
|
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
713
|
-
return
|
|
676
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
714
677
|
}
|
|
715
678
|
// TODO: Implement actual moderation actions
|
|
716
679
|
// For now, return success as placeholder
|
|
@@ -718,15 +681,15 @@ exports.dashboardRoutes = [
|
|
|
718
681
|
success: true,
|
|
719
682
|
message: `Post ${action}d successfully`,
|
|
720
683
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
721
|
-
return
|
|
684
|
+
return addCorsHeaders(response, request, env);
|
|
722
685
|
}
|
|
723
686
|
catch (error) {
|
|
724
687
|
logger.error("[Dashboard] Error moderating post:", error);
|
|
725
688
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to moderate post" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
726
|
-
return
|
|
689
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
727
690
|
}
|
|
728
691
|
},
|
|
729
|
-
middleware: [
|
|
692
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
730
693
|
description: "Moderate a post (approve/reject/delete)",
|
|
731
694
|
},
|
|
732
695
|
// Partner Dashboard APIs
|
|
@@ -734,28 +697,28 @@ exports.dashboardRoutes = [
|
|
|
734
697
|
path: "/api/dashboard/b2b/usage/requests",
|
|
735
698
|
method: "GET",
|
|
736
699
|
handler: async (request, env) => {
|
|
737
|
-
const sessionManager = new
|
|
738
|
-
const securityHeaders = new
|
|
739
|
-
const logger =
|
|
740
|
-
const session = await sessionManager.getSession(request,
|
|
700
|
+
const sessionManager = new SessionManager();
|
|
701
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
702
|
+
const logger = getLogger();
|
|
703
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
741
704
|
if (!session) {
|
|
742
705
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
743
|
-
return
|
|
706
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
744
707
|
}
|
|
745
708
|
try {
|
|
746
709
|
// Check user role - must be PARTNER
|
|
747
|
-
const region =
|
|
748
|
-
const dbManager =
|
|
749
|
-
const user = await
|
|
710
|
+
const region = detectRegionSync(request, env);
|
|
711
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
712
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
750
713
|
return db.user.findUnique({
|
|
751
714
|
where: { id: session.userId },
|
|
752
715
|
select: { role: true /* T3 will replace partnerId with tenant context */ },
|
|
753
716
|
});
|
|
754
|
-
},
|
|
717
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
755
718
|
if (!user ||
|
|
756
719
|
(user.role !== "B2B_PARTNER" && user.role !== "PARTNER_ADMIN")) {
|
|
757
720
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Partner access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
758
|
-
return
|
|
721
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
759
722
|
}
|
|
760
723
|
// Parse query parameters
|
|
761
724
|
const url = new URL(request.url);
|
|
@@ -783,43 +746,43 @@ exports.dashboardRoutes = [
|
|
|
783
746
|
byEndpoint: [],
|
|
784
747
|
},
|
|
785
748
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
786
|
-
return
|
|
749
|
+
return addCorsHeaders(response, request, env);
|
|
787
750
|
}
|
|
788
751
|
catch (error) {
|
|
789
752
|
logger.error("[Dashboard] Error getting partner usage:", error);
|
|
790
753
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get partner usage" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
791
|
-
return
|
|
754
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
792
755
|
}
|
|
793
756
|
},
|
|
794
|
-
middleware: [
|
|
757
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
795
758
|
description: "Get API request volume for partner",
|
|
796
759
|
},
|
|
797
760
|
{
|
|
798
761
|
path: "/api/dashboard/b2b/usage/rate-limits",
|
|
799
762
|
method: "GET",
|
|
800
763
|
handler: async (request, env) => {
|
|
801
|
-
const sessionManager = new
|
|
802
|
-
const securityHeaders = new
|
|
803
|
-
const logger =
|
|
804
|
-
const session = await sessionManager.getSession(request,
|
|
764
|
+
const sessionManager = new SessionManager();
|
|
765
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
766
|
+
const logger = getLogger();
|
|
767
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
805
768
|
if (!session) {
|
|
806
769
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
807
|
-
return
|
|
770
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
808
771
|
}
|
|
809
772
|
try {
|
|
810
773
|
// Check user role - must be PARTNER
|
|
811
|
-
const region =
|
|
812
|
-
const dbManager =
|
|
813
|
-
const user = await
|
|
774
|
+
const region = detectRegionSync(request, env);
|
|
775
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
776
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
814
777
|
return db.user.findUnique({
|
|
815
778
|
where: { id: session.userId },
|
|
816
779
|
select: { role: true },
|
|
817
780
|
});
|
|
818
|
-
},
|
|
781
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
819
782
|
if (!user ||
|
|
820
783
|
(user.role !== "B2B_PARTNER" && user.role !== "PARTNER_ADMIN")) {
|
|
821
784
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Partner access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
822
|
-
return
|
|
785
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
823
786
|
}
|
|
824
787
|
// TODO: Implement actual rate limit tracking
|
|
825
788
|
// Placeholder response
|
|
@@ -831,43 +794,43 @@ exports.dashboardRoutes = [
|
|
|
831
794
|
window: "hourly",
|
|
832
795
|
history: [],
|
|
833
796
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
834
|
-
return
|
|
797
|
+
return addCorsHeaders(response, request, env);
|
|
835
798
|
}
|
|
836
799
|
catch (error) {
|
|
837
800
|
logger.error("[Dashboard] Error getting rate limits:", error);
|
|
838
801
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get rate limits" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
839
|
-
return
|
|
802
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
840
803
|
}
|
|
841
804
|
},
|
|
842
|
-
middleware: [
|
|
805
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
843
806
|
description: "Get rate limit status for partner",
|
|
844
807
|
},
|
|
845
808
|
{
|
|
846
809
|
path: "/api/dashboard/b2b/performance",
|
|
847
810
|
method: "GET",
|
|
848
811
|
handler: async (request, env) => {
|
|
849
|
-
const sessionManager = new
|
|
850
|
-
const securityHeaders = new
|
|
851
|
-
const logger =
|
|
852
|
-
const session = await sessionManager.getSession(request,
|
|
812
|
+
const sessionManager = new SessionManager();
|
|
813
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
814
|
+
const logger = getLogger();
|
|
815
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
853
816
|
if (!session) {
|
|
854
817
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
855
|
-
return
|
|
818
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
856
819
|
}
|
|
857
820
|
try {
|
|
858
821
|
// Check user role - must be PARTNER
|
|
859
|
-
const region =
|
|
860
|
-
const dbManager =
|
|
861
|
-
const user = await
|
|
822
|
+
const region = detectRegionSync(request, env);
|
|
823
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
824
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
862
825
|
return db.user.findUnique({
|
|
863
826
|
where: { id: session.userId },
|
|
864
827
|
select: { role: true },
|
|
865
828
|
});
|
|
866
|
-
},
|
|
829
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
867
830
|
if (!user ||
|
|
868
831
|
(user.role !== "B2B_PARTNER" && user.role !== "PARTNER_ADMIN")) {
|
|
869
832
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Partner access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
870
|
-
return
|
|
833
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
871
834
|
}
|
|
872
835
|
// Parse query parameters
|
|
873
836
|
const url = new URL(request.url);
|
|
@@ -886,15 +849,15 @@ exports.dashboardRoutes = [
|
|
|
886
849
|
errorRate: [],
|
|
887
850
|
},
|
|
888
851
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
889
|
-
return
|
|
852
|
+
return addCorsHeaders(response, request, env);
|
|
890
853
|
}
|
|
891
854
|
catch (error) {
|
|
892
855
|
logger.error("[Dashboard] Error getting partner performance:", error);
|
|
893
856
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get partner performance" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
894
|
-
return
|
|
857
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
895
858
|
}
|
|
896
859
|
},
|
|
897
|
-
middleware: [
|
|
860
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
898
861
|
description: "Get API performance metrics for partner",
|
|
899
862
|
},
|
|
900
863
|
// Scaling Health
|
|
@@ -902,31 +865,31 @@ exports.dashboardRoutes = [
|
|
|
902
865
|
path: "/api/dashboard/scaling-health",
|
|
903
866
|
method: "GET",
|
|
904
867
|
handler: async (request, env) => {
|
|
905
|
-
const sessionManager = new
|
|
906
|
-
const securityHeaders = new
|
|
907
|
-
const logger =
|
|
908
|
-
const session = await sessionManager.getSession(request,
|
|
868
|
+
const sessionManager = new SessionManager();
|
|
869
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
870
|
+
const logger = getLogger();
|
|
871
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
909
872
|
if (!session) {
|
|
910
873
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
911
|
-
return
|
|
874
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
912
875
|
}
|
|
913
876
|
try {
|
|
914
|
-
const region =
|
|
915
|
-
const dbManager =
|
|
916
|
-
const user = await
|
|
877
|
+
const region = detectRegionSync(request, env);
|
|
878
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
879
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
917
880
|
return db.user.findUnique({
|
|
918
881
|
where: { id: session.userId },
|
|
919
882
|
select: { role: true },
|
|
920
883
|
});
|
|
921
|
-
},
|
|
884
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
922
885
|
if (!user || user.role !== "SUPER_ADMIN") {
|
|
923
886
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({
|
|
924
887
|
error: "Forbidden: Super-admin access required",
|
|
925
888
|
}), { status: 403, headers: { "content-type": "application/json" } });
|
|
926
|
-
return
|
|
889
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
927
890
|
}
|
|
928
891
|
// Get user counts from database
|
|
929
|
-
const counts = await
|
|
892
|
+
const counts = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
930
893
|
const thirtyDaysAgo = new Date(Date.now() - 30 * 24 * 60 * 60 * 1000);
|
|
931
894
|
const [totalUsers, recentUsers] = await Promise.all([
|
|
932
895
|
db.user.count(),
|
|
@@ -935,19 +898,19 @@ exports.dashboardRoutes = [
|
|
|
935
898
|
}),
|
|
936
899
|
]);
|
|
937
900
|
return { totalUsers, recentActiveUsers: recentUsers };
|
|
938
|
-
},
|
|
939
|
-
const { evaluateScalingHealth } = await
|
|
901
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
902
|
+
const { evaluateScalingHealth } = await import("../scaling-health.js");
|
|
940
903
|
const result = await evaluateScalingHealth(env, counts.totalUsers, counts.recentActiveUsers);
|
|
941
904
|
const response = securityHeaders.createSecureResponse(JSON.stringify(result), { status: 200, headers: { "content-type": "application/json" } });
|
|
942
|
-
return
|
|
905
|
+
return addCorsHeaders(response, request, env);
|
|
943
906
|
}
|
|
944
907
|
catch (error) {
|
|
945
908
|
logger.error("[Dashboard] Error getting scaling health:", error);
|
|
946
909
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get scaling health" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
947
|
-
return
|
|
910
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
948
911
|
}
|
|
949
912
|
},
|
|
950
|
-
middleware: [
|
|
913
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
951
914
|
description: "Get scaling health indicators (SUPER_ADMIN only)",
|
|
952
915
|
},
|
|
953
916
|
// Abuse Metrics
|
|
@@ -955,43 +918,43 @@ exports.dashboardRoutes = [
|
|
|
955
918
|
path: "/api/dashboard/abuse-metrics",
|
|
956
919
|
method: "GET",
|
|
957
920
|
handler: async (request, env) => {
|
|
958
|
-
const sessionManager = new
|
|
959
|
-
const securityHeaders = new
|
|
960
|
-
const logger =
|
|
961
|
-
const session = await sessionManager.getSession(request,
|
|
921
|
+
const sessionManager = new SessionManager();
|
|
922
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
923
|
+
const logger = getLogger();
|
|
924
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
962
925
|
if (!session) {
|
|
963
926
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
964
|
-
return
|
|
927
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
965
928
|
}
|
|
966
929
|
try {
|
|
967
|
-
const region =
|
|
968
|
-
const dbManager =
|
|
969
|
-
const user = await
|
|
930
|
+
const region = detectRegionSync(request, env);
|
|
931
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
932
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
970
933
|
return db.user.findUnique({
|
|
971
934
|
where: { id: session.userId },
|
|
972
935
|
select: { role: true },
|
|
973
936
|
});
|
|
974
|
-
},
|
|
937
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
975
938
|
if (!user || user.role !== "SUPER_ADMIN") {
|
|
976
939
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({
|
|
977
940
|
error: "Forbidden: Super-admin access required",
|
|
978
941
|
}), { status: 403, headers: { "content-type": "application/json" } });
|
|
979
|
-
return
|
|
942
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
980
943
|
}
|
|
981
944
|
const url = new URL(request.url);
|
|
982
945
|
const timeRange = url.searchParams.get("timeRange") || "24h";
|
|
983
|
-
const { evaluateAbuseMetrics } = await
|
|
946
|
+
const { evaluateAbuseMetrics } = await import("../abuse-metrics.js");
|
|
984
947
|
const result = await evaluateAbuseMetrics(env, timeRange);
|
|
985
948
|
const response = securityHeaders.createSecureResponse(JSON.stringify(result), { status: 200, headers: { "content-type": "application/json" } });
|
|
986
|
-
return
|
|
949
|
+
return addCorsHeaders(response, request, env);
|
|
987
950
|
}
|
|
988
951
|
catch (error) {
|
|
989
952
|
logger.error("[Dashboard] Error getting abuse metrics:", error);
|
|
990
953
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to get abuse metrics" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
991
|
-
return
|
|
954
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
992
955
|
}
|
|
993
956
|
},
|
|
994
|
-
middleware: [
|
|
957
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
995
958
|
description: "Get abuse metrics and WAF effectiveness (SUPER_ADMIN only)",
|
|
996
959
|
},
|
|
997
960
|
// Role Management APIs
|
|
@@ -999,30 +962,30 @@ exports.dashboardRoutes = [
|
|
|
999
962
|
path: "/api/admin/roles",
|
|
1000
963
|
method: "GET",
|
|
1001
964
|
handler: async (request, env) => {
|
|
1002
|
-
const sessionManager = new
|
|
1003
|
-
const securityHeaders = new
|
|
1004
|
-
const logger =
|
|
1005
|
-
const session = await sessionManager.getSession(request,
|
|
965
|
+
const sessionManager = new SessionManager();
|
|
966
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
967
|
+
const logger = getLogger();
|
|
968
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
1006
969
|
if (!session) {
|
|
1007
970
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
1008
|
-
return
|
|
971
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1009
972
|
}
|
|
1010
973
|
try {
|
|
1011
974
|
// Check user role - must be SUPER_ADMIN
|
|
1012
|
-
const region =
|
|
1013
|
-
const dbManager =
|
|
1014
|
-
const user = await
|
|
975
|
+
const region = detectRegionSync(request, env);
|
|
976
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
977
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
1015
978
|
return db.user.findUnique({
|
|
1016
979
|
where: { id: session.userId },
|
|
1017
980
|
select: { role: true },
|
|
1018
981
|
});
|
|
1019
|
-
},
|
|
982
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
1020
983
|
if (!user || user.role !== "SUPER_ADMIN") {
|
|
1021
984
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Super-admin access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
1022
|
-
return
|
|
985
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1023
986
|
}
|
|
1024
987
|
// Get role metadata
|
|
1025
|
-
const db =
|
|
988
|
+
const db = createPrisma(env);
|
|
1026
989
|
const roles = await db.roleMetadata.findMany({
|
|
1027
990
|
where: { isActive: true },
|
|
1028
991
|
orderBy: { role: "asc" },
|
|
@@ -1036,48 +999,48 @@ exports.dashboardRoutes = [
|
|
|
1036
999
|
permissions: r.permissions || [],
|
|
1037
1000
|
})),
|
|
1038
1001
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
1039
|
-
return
|
|
1002
|
+
return addCorsHeaders(response, request, env);
|
|
1040
1003
|
}
|
|
1041
1004
|
catch (error) {
|
|
1042
1005
|
logger.error("[Admin] Error listing roles:", error);
|
|
1043
1006
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to list roles" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
1044
|
-
return
|
|
1007
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1045
1008
|
}
|
|
1046
1009
|
},
|
|
1047
|
-
middleware: [
|
|
1010
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
1048
1011
|
description: "List all available roles",
|
|
1049
1012
|
},
|
|
1050
1013
|
{
|
|
1051
1014
|
path: /^\/api\/admin\/users\/(.+)\/role$/,
|
|
1052
1015
|
method: "PATCH",
|
|
1053
1016
|
handler: async (request, env, { pathname }) => {
|
|
1054
|
-
const sessionManager = new
|
|
1055
|
-
const securityHeaders = new
|
|
1056
|
-
const logger =
|
|
1057
|
-
const session = await sessionManager.getSession(request,
|
|
1017
|
+
const sessionManager = new SessionManager();
|
|
1018
|
+
const securityHeaders = new SecurityHeaders(env);
|
|
1019
|
+
const logger = getLogger();
|
|
1020
|
+
const session = await sessionManager.getSession(request, env.SESSION_SECRET, env);
|
|
1058
1021
|
if (!session) {
|
|
1059
1022
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Unauthorized" }), { status: 401, headers: { "content-type": "application/json" } });
|
|
1060
|
-
return
|
|
1023
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1061
1024
|
}
|
|
1062
1025
|
try {
|
|
1063
1026
|
// Check user role - must be SUPER_ADMIN
|
|
1064
|
-
const region =
|
|
1065
|
-
const dbManager =
|
|
1066
|
-
const user = await
|
|
1027
|
+
const region = detectRegionSync(request, env);
|
|
1028
|
+
const dbManager = sharedDatabaseConnectionManager;
|
|
1029
|
+
const user = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
1067
1030
|
return db.user.findUnique({
|
|
1068
1031
|
where: { id: session.userId },
|
|
1069
1032
|
select: { role: true },
|
|
1070
1033
|
});
|
|
1071
|
-
},
|
|
1034
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
1072
1035
|
if (!user || user.role !== "SUPER_ADMIN") {
|
|
1073
1036
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Forbidden: Super-admin access required" }), { status: 403, headers: { "content-type": "application/json" } });
|
|
1074
|
-
return
|
|
1037
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1075
1038
|
}
|
|
1076
1039
|
// Extract user ID from path
|
|
1077
1040
|
const userIdMatch = pathname.match(/^\/api\/admin\/users\/(.+)\/role$/);
|
|
1078
1041
|
if (!userIdMatch) {
|
|
1079
1042
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid user ID" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
1080
|
-
return
|
|
1043
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1081
1044
|
}
|
|
1082
1045
|
const userId = userIdMatch[1];
|
|
1083
1046
|
// Parse request body
|
|
@@ -1085,7 +1048,7 @@ exports.dashboardRoutes = [
|
|
|
1085
1048
|
const { role } = body;
|
|
1086
1049
|
if (!role) {
|
|
1087
1050
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Role is required" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
1088
|
-
return
|
|
1051
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1089
1052
|
}
|
|
1090
1053
|
// Validate role
|
|
1091
1054
|
const validRoles = [
|
|
@@ -1098,10 +1061,10 @@ exports.dashboardRoutes = [
|
|
|
1098
1061
|
];
|
|
1099
1062
|
if (!validRoles.includes(role)) {
|
|
1100
1063
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Invalid role" }), { status: 400, headers: { "content-type": "application/json" } });
|
|
1101
|
-
return
|
|
1064
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1102
1065
|
}
|
|
1103
1066
|
// Update user role
|
|
1104
|
-
const updatedUser = await
|
|
1067
|
+
const updatedUser = await withQueryTimeoutAndRetry(dbManager, region, env, async (db) => {
|
|
1105
1068
|
return db.user.update({
|
|
1106
1069
|
where: { id: userId },
|
|
1107
1070
|
data: { role: role },
|
|
@@ -1112,27 +1075,27 @@ exports.dashboardRoutes = [
|
|
|
1112
1075
|
createdAt: true,
|
|
1113
1076
|
},
|
|
1114
1077
|
});
|
|
1115
|
-
},
|
|
1078
|
+
}, QueryTimeoutPresets.STANDARD);
|
|
1116
1079
|
const response = securityHeaders.createSecureResponse(JSON.stringify({
|
|
1117
1080
|
id: updatedUser.id,
|
|
1118
1081
|
email: updatedUser.email,
|
|
1119
1082
|
role: updatedUser.role,
|
|
1120
1083
|
updatedAt: new Date().toISOString(),
|
|
1121
1084
|
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
1122
|
-
return
|
|
1085
|
+
return addCorsHeaders(response, request, env);
|
|
1123
1086
|
}
|
|
1124
1087
|
catch (error) {
|
|
1125
1088
|
logger.error("[Admin] Error changing user role:", error);
|
|
1126
1089
|
if (error.code === "P2025" ||
|
|
1127
1090
|
error.message?.includes("Record to update not found")) {
|
|
1128
1091
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "User not found" }), { status: 404, headers: { "content-type": "application/json" } });
|
|
1129
|
-
return
|
|
1092
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1130
1093
|
}
|
|
1131
1094
|
const errorResponse = securityHeaders.createSecureResponse(JSON.stringify({ error: "Failed to change user role" }), { status: 500, headers: { "content-type": "application/json" } });
|
|
1132
|
-
return
|
|
1095
|
+
return addCorsHeaders(errorResponse, request, env);
|
|
1133
1096
|
}
|
|
1134
1097
|
},
|
|
1135
|
-
middleware: [
|
|
1098
|
+
middleware: [corsMiddleware(), csrfMiddleware()],
|
|
1136
1099
|
description: "Change user role",
|
|
1137
1100
|
},
|
|
1138
1101
|
];
|