@de-otio/trellis 0.4.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/dist/db.d.ts +36 -0
- package/dist/db.d.ts.map +1 -0
- package/dist/db.js +39 -0
- package/dist/db.js.map +1 -0
- package/dist/env.d.ts +107 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +268 -0
- package/dist/env.js.map +1 -0
- package/dist/extensions.d.ts +15 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +35 -0
- package/dist/extensions.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/lambda/cleanup-cron.d.ts +2 -0
- package/dist/lambda/cleanup-cron.d.ts.map +1 -0
- package/dist/lambda/cleanup-cron.js +38 -0
- package/dist/lambda/cleanup-cron.js.map +1 -0
- package/dist/lambda/create-auth-challenge.d.ts +2 -0
- package/dist/lambda/create-auth-challenge.d.ts.map +1 -0
- package/dist/lambda/create-auth-challenge.js +108 -0
- package/dist/lambda/create-auth-challenge.js.map +1 -0
- package/dist/lambda/custom-message.d.ts +3 -0
- package/dist/lambda/custom-message.d.ts.map +1 -0
- package/dist/lambda/custom-message.js +29 -0
- package/dist/lambda/custom-message.js.map +1 -0
- package/dist/lambda/define-auth-challenge.d.ts +2 -0
- package/dist/lambda/define-auth-challenge.d.ts.map +1 -0
- package/dist/lambda/define-auth-challenge.js +27 -0
- package/dist/lambda/define-auth-challenge.js.map +1 -0
- package/dist/lambda/delete-account-worker.d.ts +3 -0
- package/dist/lambda/delete-account-worker.d.ts.map +1 -0
- package/dist/lambda/delete-account-worker.js +122 -0
- package/dist/lambda/delete-account-worker.js.map +1 -0
- package/dist/lambda/diagnostics-proxy.d.ts +6 -0
- package/dist/lambda/diagnostics-proxy.d.ts.map +1 -0
- package/dist/lambda/diagnostics-proxy.js +154 -0
- package/dist/lambda/diagnostics-proxy.js.map +1 -0
- package/dist/lambda/e2e-sweeper.d.ts +18 -0
- package/dist/lambda/e2e-sweeper.d.ts.map +1 -0
- package/dist/lambda/e2e-sweeper.js +127 -0
- package/dist/lambda/e2e-sweeper.js.map +1 -0
- package/dist/lambda/federation-outbox-worker.d.ts +3 -0
- package/dist/lambda/federation-outbox-worker.d.ts.map +1 -0
- package/dist/lambda/federation-outbox-worker.js +11 -0
- package/dist/lambda/federation-outbox-worker.js.map +1 -0
- package/dist/lambda/followers-events-worker.d.ts +3 -0
- package/dist/lambda/followers-events-worker.d.ts.map +1 -0
- package/dist/lambda/followers-events-worker.js +11 -0
- package/dist/lambda/followers-events-worker.js.map +1 -0
- package/dist/lambda/hourly-cron.d.ts +2 -0
- package/dist/lambda/hourly-cron.d.ts.map +1 -0
- package/dist/lambda/hourly-cron.js +101 -0
- package/dist/lambda/hourly-cron.js.map +1 -0
- package/dist/lambda/link-check-worker.d.ts +3 -0
- package/dist/lambda/link-check-worker.d.ts.map +1 -0
- package/dist/lambda/link-check-worker.js +11 -0
- package/dist/lambda/link-check-worker.js.map +1 -0
- package/dist/lambda/maintenance-cron.d.ts +2 -0
- package/dist/lambda/maintenance-cron.d.ts.map +1 -0
- package/dist/lambda/maintenance-cron.js +127 -0
- package/dist/lambda/maintenance-cron.js.map +1 -0
- package/dist/lambda/media-processing-worker.d.ts +3 -0
- package/dist/lambda/media-processing-worker.d.ts.map +1 -0
- package/dist/lambda/media-processing-worker.js +95 -0
- package/dist/lambda/media-processing-worker.js.map +1 -0
- package/dist/lambda/media-reconciliation-worker.d.ts +3 -0
- package/dist/lambda/media-reconciliation-worker.d.ts.map +1 -0
- package/dist/lambda/media-reconciliation-worker.js +11 -0
- package/dist/lambda/media-reconciliation-worker.js.map +1 -0
- package/dist/lambda/nightly-cron.d.ts +2 -0
- package/dist/lambda/nightly-cron.d.ts.map +1 -0
- package/dist/lambda/nightly-cron.js +348 -0
- package/dist/lambda/nightly-cron.js.map +1 -0
- package/dist/lambda/post-confirmation.d.ts +3 -0
- package/dist/lambda/post-confirmation.d.ts.map +1 -0
- package/dist/lambda/post-confirmation.js +79 -0
- package/dist/lambda/post-confirmation.js.map +1 -0
- package/dist/lambda/pre-signup.d.ts +3 -0
- package/dist/lambda/pre-signup.d.ts.map +1 -0
- package/dist/lambda/pre-signup.js +35 -0
- package/dist/lambda/pre-signup.js.map +1 -0
- package/dist/lambda/pre-token-generation.d.ts +3 -0
- package/dist/lambda/pre-token-generation.d.ts.map +1 -0
- package/dist/lambda/pre-token-generation.js +79 -0
- package/dist/lambda/pre-token-generation.js.map +1 -0
- package/dist/lambda/tools/check-health.d.ts +6 -0
- package/dist/lambda/tools/check-health.d.ts.map +1 -0
- package/dist/lambda/tools/check-health.js +24 -0
- package/dist/lambda/tools/check-health.js.map +1 -0
- package/dist/lambda/tools/describe-services.d.ts +20 -0
- package/dist/lambda/tools/describe-services.d.ts.map +1 -0
- package/dist/lambda/tools/describe-services.js +41 -0
- package/dist/lambda/tools/describe-services.js.map +1 -0
- package/dist/lambda/tools/get-cost-report.d.ts +16 -0
- package/dist/lambda/tools/get-cost-report.d.ts.map +1 -0
- package/dist/lambda/tools/get-cost-report.js +54 -0
- package/dist/lambda/tools/get-cost-report.js.map +1 -0
- package/dist/lambda/tools/get-errors.d.ts +11 -0
- package/dist/lambda/tools/get-errors.d.ts.map +1 -0
- package/dist/lambda/tools/get-errors.js +62 -0
- package/dist/lambda/tools/get-errors.js.map +1 -0
- package/dist/lambda/tools/get-feature-flags.d.ts +8 -0
- package/dist/lambda/tools/get-feature-flags.d.ts.map +1 -0
- package/dist/lambda/tools/get-feature-flags.js +23 -0
- package/dist/lambda/tools/get-feature-flags.js.map +1 -0
- package/dist/lambda/tools/get-queue-status.d.ts +9 -0
- package/dist/lambda/tools/get-queue-status.d.ts.map +1 -0
- package/dist/lambda/tools/get-queue-status.js +46 -0
- package/dist/lambda/tools/get-queue-status.js.map +1 -0
- package/dist/lambda/tools/search-logs.d.ts +19 -0
- package/dist/lambda/tools/search-logs.d.ts.map +1 -0
- package/dist/lambda/tools/search-logs.js +55 -0
- package/dist/lambda/tools/search-logs.js.map +1 -0
- package/dist/lambda/tools/send-alert.d.ts +8 -0
- package/dist/lambda/tools/send-alert.d.ts.map +1 -0
- package/dist/lambda/tools/send-alert.js +29 -0
- package/dist/lambda/tools/send-alert.js.map +1 -0
- package/dist/lambda/verify-auth-challenge.d.ts +2 -0
- package/dist/lambda/verify-auth-challenge.d.ts.map +1 -0
- package/dist/lambda/verify-auth-challenge.js +35 -0
- package/dist/lambda/verify-auth-challenge.js.map +1 -0
- package/dist/lib/abuse-metrics.d.ts +44 -0
- package/dist/lib/abuse-metrics.d.ts.map +1 -0
- package/dist/lib/abuse-metrics.js +322 -0
- package/dist/lib/abuse-metrics.js.map +1 -0
- package/dist/lib/activitypub/activity-processor.d.ts +89 -0
- package/dist/lib/activitypub/activity-processor.d.ts.map +1 -0
- package/dist/lib/activitypub/activity-processor.js +709 -0
- package/dist/lib/activitypub/activity-processor.js.map +1 -0
- package/dist/lib/activitypub/activity-service.d.ts +47 -0
- package/dist/lib/activitypub/activity-service.d.ts.map +1 -0
- package/dist/lib/activitypub/activity-service.js +165 -0
- package/dist/lib/activitypub/activity-service.js.map +1 -0
- package/dist/lib/activitypub/actor.d.ts +44 -0
- package/dist/lib/activitypub/actor.d.ts.map +1 -0
- package/dist/lib/activitypub/actor.js +116 -0
- package/dist/lib/activitypub/actor.js.map +1 -0
- package/dist/lib/activitypub/audience-service.d.ts +52 -0
- package/dist/lib/activitypub/audience-service.d.ts.map +1 -0
- package/dist/lib/activitypub/audience-service.js +245 -0
- package/dist/lib/activitypub/audience-service.js.map +1 -0
- package/dist/lib/activitypub/crypto.d.ts +42 -0
- package/dist/lib/activitypub/crypto.d.ts.map +1 -0
- package/dist/lib/activitypub/crypto.js +129 -0
- package/dist/lib/activitypub/crypto.js.map +1 -0
- package/dist/lib/activitypub/delivery-service.d.ts +44 -0
- package/dist/lib/activitypub/delivery-service.d.ts.map +1 -0
- package/dist/lib/activitypub/delivery-service.js +259 -0
- package/dist/lib/activitypub/delivery-service.js.map +1 -0
- package/dist/lib/activitypub/dispatchers/entity-actor.d.ts +50 -0
- package/dist/lib/activitypub/dispatchers/entity-actor.d.ts.map +1 -0
- package/dist/lib/activitypub/dispatchers/entity-actor.js +247 -0
- package/dist/lib/activitypub/dispatchers/entity-actor.js.map +1 -0
- package/dist/lib/activitypub/dispatchers/group-actor.d.ts +47 -0
- package/dist/lib/activitypub/dispatchers/group-actor.d.ts.map +1 -0
- package/dist/lib/activitypub/dispatchers/group-actor.js +202 -0
- package/dist/lib/activitypub/dispatchers/group-actor.js.map +1 -0
- package/dist/lib/activitypub/dispatchers/user-actor.d.ts +47 -0
- package/dist/lib/activitypub/dispatchers/user-actor.d.ts.map +1 -0
- package/dist/lib/activitypub/dispatchers/user-actor.js +207 -0
- package/dist/lib/activitypub/dispatchers/user-actor.js.map +1 -0
- package/dist/lib/activitypub/dm-service.d.ts +35 -0
- package/dist/lib/activitypub/dm-service.d.ts.map +1 -0
- package/dist/lib/activitypub/dm-service.js +73 -0
- package/dist/lib/activitypub/dm-service.js.map +1 -0
- package/dist/lib/activitypub/entity-profile-service.d.ts +43 -0
- package/dist/lib/activitypub/entity-profile-service.d.ts.map +1 -0
- package/dist/lib/activitypub/entity-profile-service.js +80 -0
- package/dist/lib/activitypub/entity-profile-service.js.map +1 -0
- package/dist/lib/activitypub/fedify/config.d.ts +15 -0
- package/dist/lib/activitypub/fedify/config.d.ts.map +1 -0
- package/dist/lib/activitypub/fedify/config.js +38 -0
- package/dist/lib/activitypub/fedify/config.js.map +1 -0
- package/dist/lib/activitypub/fedify/context.d.ts +21 -0
- package/dist/lib/activitypub/fedify/context.d.ts.map +1 -0
- package/dist/lib/activitypub/fedify/context.js +67 -0
- package/dist/lib/activitypub/fedify/context.js.map +1 -0
- package/dist/lib/activitypub/fedify/runtime.d.ts +18 -0
- package/dist/lib/activitypub/fedify/runtime.d.ts.map +1 -0
- package/dist/lib/activitypub/fedify/runtime.js +26 -0
- package/dist/lib/activitypub/fedify/runtime.js.map +1 -0
- package/dist/lib/activitypub/friendship-service.d.ts +15 -0
- package/dist/lib/activitypub/friendship-service.d.ts.map +1 -0
- package/dist/lib/activitypub/friendship-service.js +26 -0
- package/dist/lib/activitypub/friendship-service.js.map +1 -0
- package/dist/lib/activitypub/group-service.d.ts +83 -0
- package/dist/lib/activitypub/group-service.d.ts.map +1 -0
- package/dist/lib/activitypub/group-service.js +301 -0
- package/dist/lib/activitypub/group-service.js.map +1 -0
- package/dist/lib/activitypub/http-signatures.d.ts +41 -0
- package/dist/lib/activitypub/http-signatures.d.ts.map +1 -0
- package/dist/lib/activitypub/http-signatures.js +284 -0
- package/dist/lib/activitypub/http-signatures.js.map +1 -0
- package/dist/lib/activitypub/jsonld.d.ts +39 -0
- package/dist/lib/activitypub/jsonld.d.ts.map +1 -0
- package/dist/lib/activitypub/jsonld.js +97 -0
- package/dist/lib/activitypub/jsonld.js.map +1 -0
- package/dist/lib/activitypub/listeners/friends-collection.d.ts +20 -0
- package/dist/lib/activitypub/listeners/friends-collection.d.ts.map +1 -0
- package/dist/lib/activitypub/listeners/friends-collection.js +105 -0
- package/dist/lib/activitypub/listeners/friends-collection.js.map +1 -0
- package/dist/lib/activitypub/listeners/http-signatures.d.ts +29 -0
- package/dist/lib/activitypub/listeners/http-signatures.d.ts.map +1 -0
- package/dist/lib/activitypub/listeners/http-signatures.js +208 -0
- package/dist/lib/activitypub/listeners/http-signatures.js.map +1 -0
- package/dist/lib/activitypub/listeners/inbox.d.ts +34 -0
- package/dist/lib/activitypub/listeners/inbox.d.ts.map +1 -0
- package/dist/lib/activitypub/listeners/inbox.js +226 -0
- package/dist/lib/activitypub/listeners/inbox.js.map +1 -0
- package/dist/lib/activitypub/listeners/outbox.d.ts +20 -0
- package/dist/lib/activitypub/listeners/outbox.d.ts.map +1 -0
- package/dist/lib/activitypub/listeners/outbox.js +117 -0
- package/dist/lib/activitypub/listeners/outbox.js.map +1 -0
- package/dist/lib/activitypub/remote-fetch-service.d.ts +108 -0
- package/dist/lib/activitypub/remote-fetch-service.d.ts.map +1 -0
- package/dist/lib/activitypub/remote-fetch-service.js +364 -0
- package/dist/lib/activitypub/remote-fetch-service.js.map +1 -0
- package/dist/lib/activitypub/services/abuse-prevention.d.ts +52 -0
- package/dist/lib/activitypub/services/abuse-prevention.d.ts.map +1 -0
- package/dist/lib/activitypub/services/abuse-prevention.js +118 -0
- package/dist/lib/activitypub/services/abuse-prevention.js.map +1 -0
- package/dist/lib/activitypub/services/dm-service-fedify.d.ts +46 -0
- package/dist/lib/activitypub/services/dm-service-fedify.d.ts.map +1 -0
- package/dist/lib/activitypub/services/dm-service-fedify.js +168 -0
- package/dist/lib/activitypub/services/dm-service-fedify.js.map +1 -0
- package/dist/lib/activitypub/services/fedify-converters.d.ts +51 -0
- package/dist/lib/activitypub/services/fedify-converters.d.ts.map +1 -0
- package/dist/lib/activitypub/services/fedify-converters.js +109 -0
- package/dist/lib/activitypub/services/fedify-converters.js.map +1 -0
- package/dist/lib/activitypub/services/fedify-delivery.d.ts +41 -0
- package/dist/lib/activitypub/services/fedify-delivery.d.ts.map +1 -0
- package/dist/lib/activitypub/services/fedify-delivery.js +186 -0
- package/dist/lib/activitypub/services/fedify-delivery.js.map +1 -0
- package/dist/lib/activitypub/services/follow-activity-service.d.ts +34 -0
- package/dist/lib/activitypub/services/follow-activity-service.d.ts.map +1 -0
- package/dist/lib/activitypub/services/follow-activity-service.js +64 -0
- package/dist/lib/activitypub/services/follow-activity-service.js.map +1 -0
- package/dist/lib/activitypub/services/post-service-fedify.d.ts +49 -0
- package/dist/lib/activitypub/services/post-service-fedify.d.ts.map +1 -0
- package/dist/lib/activitypub/services/post-service-fedify.js +281 -0
- package/dist/lib/activitypub/services/post-service-fedify.js.map +1 -0
- package/dist/lib/activitypub/services/remote-activity-handler.d.ts +22 -0
- package/dist/lib/activitypub/services/remote-activity-handler.d.ts.map +1 -0
- package/dist/lib/activitypub/services/remote-activity-handler.js +136 -0
- package/dist/lib/activitypub/services/remote-activity-handler.js.map +1 -0
- package/dist/lib/activitypub/standalone-mode.d.ts +34 -0
- package/dist/lib/activitypub/standalone-mode.d.ts.map +1 -0
- package/dist/lib/activitypub/standalone-mode.js +127 -0
- package/dist/lib/activitypub/standalone-mode.js.map +1 -0
- package/dist/lib/activitypub/webfinger/server.d.ts +16 -0
- package/dist/lib/activitypub/webfinger/server.d.ts.map +1 -0
- package/dist/lib/activitypub/webfinger/server.js +221 -0
- package/dist/lib/activitypub/webfinger/server.js.map +1 -0
- package/dist/lib/age-gate-middleware.d.ts +19 -0
- package/dist/lib/age-gate-middleware.d.ts.map +1 -0
- package/dist/lib/age-gate-middleware.js +26 -0
- package/dist/lib/age-gate-middleware.js.map +1 -0
- package/dist/lib/age-gate.d.ts +37 -0
- package/dist/lib/age-gate.d.ts.map +1 -0
- package/dist/lib/age-gate.js +96 -0
- package/dist/lib/age-gate.js.map +1 -0
- package/dist/lib/age-tier-transition.d.ts +21 -0
- package/dist/lib/age-tier-transition.d.ts.map +1 -0
- package/dist/lib/age-tier-transition.js +190 -0
- package/dist/lib/age-tier-transition.js.map +1 -0
- package/dist/lib/audit-logger.d.ts +142 -0
- package/dist/lib/audit-logger.d.ts.map +1 -0
- package/dist/lib/audit-logger.js +326 -0
- package/dist/lib/audit-logger.js.map +1 -0
- package/dist/lib/auth/cognito-jwt.d.ts +20 -0
- package/dist/lib/auth/cognito-jwt.d.ts.map +1 -0
- package/dist/lib/auth/cognito-jwt.js +56 -0
- package/dist/lib/auth/cognito-jwt.js.map +1 -0
- package/dist/lib/auth-context-manager.d.ts +116 -0
- package/dist/lib/auth-context-manager.d.ts.map +1 -0
- package/dist/lib/auth-context-manager.js +130 -0
- package/dist/lib/auth-context-manager.js.map +1 -0
- package/dist/lib/auth-handler.d.ts +19 -0
- package/dist/lib/auth-handler.d.ts.map +1 -0
- package/dist/lib/auth-handler.js +76 -0
- package/dist/lib/auth-handler.js.map +1 -0
- package/dist/lib/badge-handler.d.ts +20 -0
- package/dist/lib/badge-handler.d.ts.map +1 -0
- package/dist/lib/badge-handler.js +142 -0
- package/dist/lib/badge-handler.js.map +1 -0
- package/dist/lib/circle-handler.d.ts +22 -0
- package/dist/lib/circle-handler.d.ts.map +1 -0
- package/dist/lib/circle-handler.js +224 -0
- package/dist/lib/circle-handler.js.map +1 -0
- package/dist/lib/circuit-breaker.d.ts +27 -0
- package/dist/lib/circuit-breaker.d.ts.map +1 -0
- package/dist/lib/circuit-breaker.js +63 -0
- package/dist/lib/circuit-breaker.js.map +1 -0
- package/dist/lib/comment-handler.d.ts +77 -0
- package/dist/lib/comment-handler.d.ts.map +1 -0
- package/dist/lib/comment-handler.js +953 -0
- package/dist/lib/comment-handler.js.map +1 -0
- package/dist/lib/connection-code-handler.d.ts +17 -0
- package/dist/lib/connection-code-handler.d.ts.map +1 -0
- package/dist/lib/connection-code-handler.js +293 -0
- package/dist/lib/connection-code-handler.js.map +1 -0
- package/dist/lib/content-discovery.d.ts +113 -0
- package/dist/lib/content-discovery.d.ts.map +1 -0
- package/dist/lib/content-discovery.js +519 -0
- package/dist/lib/content-discovery.js.map +1 -0
- package/dist/lib/context-aware-data-access.d.ts +89 -0
- package/dist/lib/context-aware-data-access.d.ts.map +1 -0
- package/dist/lib/context-aware-data-access.js +97 -0
- package/dist/lib/context-aware-data-access.js.map +1 -0
- package/dist/lib/cors-handler.d.ts +29 -0
- package/dist/lib/cors-handler.d.ts.map +1 -0
- package/dist/lib/cors-handler.js +225 -0
- package/dist/lib/cors-handler.js.map +1 -0
- package/dist/lib/cost-accumulator.d.ts +58 -0
- package/dist/lib/cost-accumulator.d.ts.map +1 -0
- package/dist/lib/cost-accumulator.js +173 -0
- package/dist/lib/cost-accumulator.js.map +1 -0
- package/dist/lib/crypto/encryption-service.d.ts +100 -0
- package/dist/lib/crypto/encryption-service.d.ts.map +1 -0
- package/dist/lib/crypto/encryption-service.js +293 -0
- package/dist/lib/crypto/encryption-service.js.map +1 -0
- package/dist/lib/crypto/index.d.ts +22 -0
- package/dist/lib/crypto/index.d.ts.map +1 -0
- package/dist/lib/crypto/index.js +28 -0
- package/dist/lib/crypto/index.js.map +1 -0
- package/dist/lib/crypto/types.d.ts +71 -0
- package/dist/lib/crypto/types.d.ts.map +1 -0
- package/dist/lib/crypto/types.js +3 -0
- package/dist/lib/crypto/types.js.map +1 -0
- package/dist/lib/crypto/versioning.d.ts +112 -0
- package/dist/lib/crypto/versioning.d.ts.map +1 -0
- package/dist/lib/crypto/versioning.js +148 -0
- package/dist/lib/crypto/versioning.js.map +1 -0
- package/dist/lib/crypto/voting/elgamal-encryption.d.ts +156 -0
- package/dist/lib/crypto/voting/elgamal-encryption.d.ts.map +1 -0
- package/dist/lib/crypto/voting/elgamal-encryption.js +172 -0
- package/dist/lib/crypto/voting/elgamal-encryption.js.map +1 -0
- package/dist/lib/crypto/voting/encryption-scheme.d.ts +138 -0
- package/dist/lib/crypto/voting/encryption-scheme.d.ts.map +1 -0
- package/dist/lib/crypto/voting/encryption-scheme.js +13 -0
- package/dist/lib/crypto/voting/encryption-scheme.js.map +1 -0
- package/dist/lib/crypto/voting/hash-utils.d.ts +58 -0
- package/dist/lib/crypto/voting/hash-utils.d.ts.map +1 -0
- package/dist/lib/crypto/voting/hash-utils.js +73 -0
- package/dist/lib/crypto/voting/hash-utils.js.map +1 -0
- package/dist/lib/crypto/voting/hybrid-encryption.d.ts +109 -0
- package/dist/lib/crypto/voting/hybrid-encryption.d.ts.map +1 -0
- package/dist/lib/crypto/voting/hybrid-encryption.js +134 -0
- package/dist/lib/crypto/voting/hybrid-encryption.js.map +1 -0
- package/dist/lib/crypto/voting/index.d.ts +18 -0
- package/dist/lib/crypto/voting/index.d.ts.map +1 -0
- package/dist/lib/crypto/voting/index.js +27 -0
- package/dist/lib/crypto/voting/index.js.map +1 -0
- package/dist/lib/crypto/voting/post-quantum-encryption.d.ts +107 -0
- package/dist/lib/crypto/voting/post-quantum-encryption.d.ts.map +1 -0
- package/dist/lib/crypto/voting/post-quantum-encryption.js +123 -0
- package/dist/lib/crypto/voting/post-quantum-encryption.js.map +1 -0
- package/dist/lib/csrf.d.ts +95 -0
- package/dist/lib/csrf.d.ts.map +1 -0
- package/dist/lib/csrf.js +174 -0
- package/dist/lib/csrf.js.map +1 -0
- package/dist/lib/data-router.d.ts +209 -0
- package/dist/lib/data-router.d.ts.map +1 -0
- package/dist/lib/data-router.js +792 -0
- package/dist/lib/data-router.js.map +1 -0
- package/dist/lib/database-circuit-breaker.d.ts +75 -0
- package/dist/lib/database-circuit-breaker.d.ts.map +1 -0
- package/dist/lib/database-circuit-breaker.js +155 -0
- package/dist/lib/database-circuit-breaker.js.map +1 -0
- package/dist/lib/database-config.d.ts +20 -0
- package/dist/lib/database-config.d.ts.map +1 -0
- package/dist/lib/database-config.js +46 -0
- package/dist/lib/database-config.js.map +1 -0
- package/dist/lib/database-connection-manager.d.ts +99 -0
- package/dist/lib/database-connection-manager.d.ts.map +1 -0
- package/dist/lib/database-connection-manager.js +495 -0
- package/dist/lib/database-connection-manager.js.map +1 -0
- package/dist/lib/database-monitor.d.ts +89 -0
- package/dist/lib/database-monitor.d.ts.map +1 -0
- package/dist/lib/database-monitor.js +199 -0
- package/dist/lib/database-monitor.js.map +1 -0
- package/dist/lib/database-rate-limiter.d.ts +41 -0
- package/dist/lib/database-rate-limiter.d.ts.map +1 -0
- package/dist/lib/database-rate-limiter.js +90 -0
- package/dist/lib/database-rate-limiter.js.map +1 -0
- package/dist/lib/database-wrapper-helper.d.ts +44 -0
- package/dist/lib/database-wrapper-helper.d.ts.map +1 -0
- package/dist/lib/database-wrapper-helper.js +104 -0
- package/dist/lib/database-wrapper-helper.js.map +1 -0
- package/dist/lib/database-wrapper.d.ts +51 -0
- package/dist/lib/database-wrapper.d.ts.map +1 -0
- package/dist/lib/database-wrapper.js +109 -0
- package/dist/lib/database-wrapper.js.map +1 -0
- package/dist/lib/db-query-helper.d.ts +130 -0
- package/dist/lib/db-query-helper.d.ts.map +1 -0
- package/dist/lib/db-query-helper.js +105 -0
- package/dist/lib/db-query-helper.js.map +1 -0
- package/dist/lib/discovery-handler.d.ts +19 -0
- package/dist/lib/discovery-handler.d.ts.map +1 -0
- package/dist/lib/discovery-handler.js +195 -0
- package/dist/lib/discovery-handler.js.map +1 -0
- package/dist/lib/domain-reputation-service.d.ts +112 -0
- package/dist/lib/domain-reputation-service.d.ts.map +1 -0
- package/dist/lib/domain-reputation-service.js +344 -0
- package/dist/lib/domain-reputation-service.js.map +1 -0
- package/dist/lib/email-privacy.d.ts +54 -0
- package/dist/lib/email-privacy.d.ts.map +1 -0
- package/dist/lib/email-privacy.js +72 -0
- package/dist/lib/email-privacy.js.map +1 -0
- package/dist/lib/email-provider.d.ts +133 -0
- package/dist/lib/email-provider.d.ts.map +1 -0
- package/dist/lib/email-provider.js +391 -0
- package/dist/lib/email-provider.js.map +1 -0
- package/dist/lib/encryption-key-service.d.ts +115 -0
- package/dist/lib/encryption-key-service.d.ts.map +1 -0
- package/dist/lib/encryption-key-service.js +272 -0
- package/dist/lib/encryption-key-service.js.map +1 -0
- package/dist/lib/entity-handler.d.ts +59 -0
- package/dist/lib/entity-handler.d.ts.map +1 -0
- package/dist/lib/entity-handler.js +866 -0
- package/dist/lib/entity-handler.js.map +1 -0
- package/dist/lib/entity-relationship-handler.d.ts +19 -0
- package/dist/lib/entity-relationship-handler.d.ts.map +1 -0
- package/dist/lib/entity-relationship-handler.js +242 -0
- package/dist/lib/entity-relationship-handler.js.map +1 -0
- package/dist/lib/entity-tagging-errors.d.ts +32 -0
- package/dist/lib/entity-tagging-errors.d.ts.map +1 -0
- package/dist/lib/entity-tagging-errors.js +53 -0
- package/dist/lib/entity-tagging-errors.js.map +1 -0
- package/dist/lib/entity-tagging-validator.d.ts +47 -0
- package/dist/lib/entity-tagging-validator.d.ts.map +1 -0
- package/dist/lib/entity-tagging-validator.js +84 -0
- package/dist/lib/entity-tagging-validator.js.map +1 -0
- package/dist/lib/exif-stripper.d.ts +37 -0
- package/dist/lib/exif-stripper.d.ts.map +1 -0
- package/dist/lib/exif-stripper.js +62 -0
- package/dist/lib/exif-stripper.js.map +1 -0
- package/dist/lib/extension-context.d.ts +19 -0
- package/dist/lib/extension-context.d.ts.map +1 -0
- package/dist/lib/extension-context.js +78 -0
- package/dist/lib/extension-context.js.map +1 -0
- package/dist/lib/extension-route-wrapper.d.ts +21 -0
- package/dist/lib/extension-route-wrapper.d.ts.map +1 -0
- package/dist/lib/extension-route-wrapper.js +113 -0
- package/dist/lib/extension-route-wrapper.js.map +1 -0
- package/dist/lib/extension-validator.d.ts +12 -0
- package/dist/lib/extension-validator.d.ts.map +1 -0
- package/dist/lib/extension-validator.js +60 -0
- package/dist/lib/extension-validator.js.map +1 -0
- package/dist/lib/feature-flags.d.ts +56 -0
- package/dist/lib/feature-flags.d.ts.map +1 -0
- package/dist/lib/feature-flags.js +140 -0
- package/dist/lib/feature-flags.js.map +1 -0
- package/dist/lib/feature-toggle-service.d.ts +48 -0
- package/dist/lib/feature-toggle-service.d.ts.map +1 -0
- package/dist/lib/feature-toggle-service.js +167 -0
- package/dist/lib/feature-toggle-service.js.map +1 -0
- package/dist/lib/feed-handler.d.ts +152 -0
- package/dist/lib/feed-handler.d.ts.map +1 -0
- package/dist/lib/feed-handler.js +784 -0
- package/dist/lib/feed-handler.js.map +1 -0
- package/dist/lib/feed-pagination.d.ts +42 -0
- package/dist/lib/feed-pagination.d.ts.map +1 -0
- package/dist/lib/feed-pagination.js +54 -0
- package/dist/lib/feed-pagination.js.map +1 -0
- package/dist/lib/feed-personalization.d.ts +52 -0
- package/dist/lib/feed-personalization.d.ts.map +1 -0
- package/dist/lib/feed-personalization.js +105 -0
- package/dist/lib/feed-personalization.js.map +1 -0
- package/dist/lib/followers-events.d.ts +37 -0
- package/dist/lib/followers-events.d.ts.map +1 -0
- package/dist/lib/followers-events.js +149 -0
- package/dist/lib/followers-events.js.map +1 -0
- package/dist/lib/followers-handler.d.ts +21 -0
- package/dist/lib/followers-handler.d.ts.map +1 -0
- package/dist/lib/followers-handler.js +35 -0
- package/dist/lib/followers-handler.js.map +1 -0
- package/dist/lib/friends-handler.d.ts +78 -0
- package/dist/lib/friends-handler.d.ts.map +1 -0
- package/dist/lib/friends-handler.js +390 -0
- package/dist/lib/friends-handler.js.map +1 -0
- package/dist/lib/graph/dual-write-service.d.ts +116 -0
- package/dist/lib/graph/dual-write-service.d.ts.map +1 -0
- package/dist/lib/graph/dual-write-service.js +332 -0
- package/dist/lib/graph/dual-write-service.js.map +1 -0
- package/dist/lib/graph/dual-write.d.ts +396 -0
- package/dist/lib/graph/dual-write.d.ts.map +1 -0
- package/dist/lib/graph/dual-write.js +53 -0
- package/dist/lib/graph/dual-write.js.map +1 -0
- package/dist/lib/graph/errors.d.ts +90 -0
- package/dist/lib/graph/errors.d.ts.map +1 -0
- package/dist/lib/graph/errors.js +131 -0
- package/dist/lib/graph/errors.js.map +1 -0
- package/dist/lib/graph/graph-factory.d.ts +64 -0
- package/dist/lib/graph/graph-factory.d.ts.map +1 -0
- package/dist/lib/graph/graph-factory.js +190 -0
- package/dist/lib/graph/graph-factory.js.map +1 -0
- package/dist/lib/graph/graph-schema-init.d.ts +31 -0
- package/dist/lib/graph/graph-schema-init.d.ts.map +1 -0
- package/dist/lib/graph/graph-schema-init.js +105 -0
- package/dist/lib/graph/graph-schema-init.js.map +1 -0
- package/dist/lib/graph/graph-service.d.ts +479 -0
- package/dist/lib/graph/graph-service.d.ts.map +1 -0
- package/dist/lib/graph/graph-service.js +21 -0
- package/dist/lib/graph/graph-service.js.map +1 -0
- package/dist/lib/graph/index.d.ts +40 -0
- package/dist/lib/graph/index.d.ts.map +1 -0
- package/dist/lib/graph/index.js +74 -0
- package/dist/lib/graph/index.js.map +1 -0
- package/dist/lib/graph/neo4j-graph-service.d.ts +186 -0
- package/dist/lib/graph/neo4j-graph-service.d.ts.map +1 -0
- package/dist/lib/graph/neo4j-graph-service.js +1625 -0
- package/dist/lib/graph/neo4j-graph-service.js.map +1 -0
- package/dist/lib/graph/reconciliation-service.d.ts +113 -0
- package/dist/lib/graph/reconciliation-service.d.ts.map +1 -0
- package/dist/lib/graph/reconciliation-service.js +533 -0
- package/dist/lib/graph/reconciliation-service.js.map +1 -0
- package/dist/lib/graph/scoring-engine.d.ts +154 -0
- package/dist/lib/graph/scoring-engine.d.ts.map +1 -0
- package/dist/lib/graph/scoring-engine.js +286 -0
- package/dist/lib/graph/scoring-engine.js.map +1 -0
- package/dist/lib/graph/types.d.ts +480 -0
- package/dist/lib/graph/types.d.ts.map +1 -0
- package/dist/lib/graph/types.js +10 -0
- package/dist/lib/graph/types.js.map +1 -0
- package/dist/lib/hook-dispatcher.d.ts +21 -0
- package/dist/lib/hook-dispatcher.d.ts.map +1 -0
- package/dist/lib/hook-dispatcher.js +62 -0
- package/dist/lib/hook-dispatcher.js.map +1 -0
- package/dist/lib/id-generator.d.ts +29 -0
- package/dist/lib/id-generator.d.ts.map +1 -0
- package/dist/lib/id-generator.js +51 -0
- package/dist/lib/id-generator.js.map +1 -0
- package/dist/lib/input-sanitizer.d.ts +55 -0
- package/dist/lib/input-sanitizer.d.ts.map +1 -0
- package/dist/lib/input-sanitizer.js +167 -0
- package/dist/lib/input-sanitizer.js.map +1 -0
- package/dist/lib/internal-docs-dashboard.json +112 -0
- package/dist/lib/internal-docs-handler.d.ts +60 -0
- package/dist/lib/internal-docs-handler.d.ts.map +1 -0
- package/dist/lib/internal-docs-handler.js +570 -0
- package/dist/lib/internal-docs-handler.js.map +1 -0
- package/dist/lib/internal-docs-navigation.d.ts +42 -0
- package/dist/lib/internal-docs-navigation.d.ts.map +1 -0
- package/dist/lib/internal-docs-navigation.js +73 -0
- package/dist/lib/internal-docs-navigation.js.map +1 -0
- package/dist/lib/internal-docs-navigation.json +169 -0
- package/dist/lib/invitation-handler.d.ts +133 -0
- package/dist/lib/invitation-handler.d.ts.map +1 -0
- package/dist/lib/invitation-handler.js +1335 -0
- package/dist/lib/invitation-handler.js.map +1 -0
- package/dist/lib/ip-scrubber.d.ts +59 -0
- package/dist/lib/ip-scrubber.d.ts.map +1 -0
- package/dist/lib/ip-scrubber.js +101 -0
- package/dist/lib/ip-scrubber.js.map +1 -0
- package/dist/lib/kv/dynamodb-kv.d.ts +39 -0
- package/dist/lib/kv/dynamodb-kv.d.ts.map +1 -0
- package/dist/lib/kv/dynamodb-kv.js +239 -0
- package/dist/lib/kv/dynamodb-kv.js.map +1 -0
- package/dist/lib/link-security-handler.d.ts +140 -0
- package/dist/lib/link-security-handler.d.ts.map +1 -0
- package/dist/lib/link-security-handler.js +460 -0
- package/dist/lib/link-security-handler.js.map +1 -0
- package/dist/lib/logger.d.ts +100 -0
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/lib/logger.js +201 -0
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/media-cleanup-handler.d.ts +46 -0
- package/dist/lib/media-cleanup-handler.d.ts.map +1 -0
- package/dist/lib/media-cleanup-handler.js +190 -0
- package/dist/lib/media-cleanup-handler.js.map +1 -0
- package/dist/lib/media-handler.d.ts +150 -0
- package/dist/lib/media-handler.d.ts.map +1 -0
- package/dist/lib/media-handler.js +1544 -0
- package/dist/lib/media-handler.js.map +1 -0
- package/dist/lib/media-metadata-extractor.d.ts +71 -0
- package/dist/lib/media-metadata-extractor.d.ts.map +1 -0
- package/dist/lib/media-metadata-extractor.js +278 -0
- package/dist/lib/media-metadata-extractor.js.map +1 -0
- package/dist/lib/media-metrics.d.ts +57 -0
- package/dist/lib/media-metrics.d.ts.map +1 -0
- package/dist/lib/media-metrics.js +202 -0
- package/dist/lib/media-metrics.js.map +1 -0
- package/dist/lib/metadata/index.d.ts +6 -0
- package/dist/lib/metadata/index.d.ts.map +1 -0
- package/dist/lib/metadata/index.js +22 -0
- package/dist/lib/metadata/index.js.map +1 -0
- package/dist/lib/metadata/metadata-config.d.ts +17 -0
- package/dist/lib/metadata/metadata-config.d.ts.map +1 -0
- package/dist/lib/metadata/metadata-config.js +23 -0
- package/dist/lib/metadata/metadata-config.js.map +1 -0
- package/dist/lib/metadata/metadata-errors.d.ts +18 -0
- package/dist/lib/metadata/metadata-errors.d.ts.map +1 -0
- package/dist/lib/metadata/metadata-errors.js +26 -0
- package/dist/lib/metadata/metadata-errors.js.map +1 -0
- package/dist/lib/metadata/metadata-extractor.d.ts +17 -0
- package/dist/lib/metadata/metadata-extractor.d.ts.map +1 -0
- package/dist/lib/metadata/metadata-extractor.js +264 -0
- package/dist/lib/metadata/metadata-extractor.js.map +1 -0
- package/dist/lib/metadata/metadata-sanitizer.d.ts +9 -0
- package/dist/lib/metadata/metadata-sanitizer.d.ts.map +1 -0
- package/dist/lib/metadata/metadata-sanitizer.js +100 -0
- package/dist/lib/metadata/metadata-sanitizer.js.map +1 -0
- package/dist/lib/metadata/metadata-schemas.d.ts +131 -0
- package/dist/lib/metadata/metadata-schemas.d.ts.map +1 -0
- package/dist/lib/metadata/metadata-schemas.js +71 -0
- package/dist/lib/metadata/metadata-schemas.js.map +1 -0
- package/dist/lib/mfa/mfa-handler.d.ts +60 -0
- package/dist/lib/mfa/mfa-handler.d.ts.map +1 -0
- package/dist/lib/mfa/mfa-handler.js +150 -0
- package/dist/lib/mfa/mfa-handler.js.map +1 -0
- package/dist/lib/mfa/totp-service.d.ts +41 -0
- package/dist/lib/mfa/totp-service.d.ts.map +1 -0
- package/dist/lib/mfa/totp-service.js +183 -0
- package/dist/lib/mfa/totp-service.js.map +1 -0
- package/dist/lib/middleware/comment-rate-limit.d.ts +19 -0
- package/dist/lib/middleware/comment-rate-limit.d.ts.map +1 -0
- package/dist/lib/middleware/comment-rate-limit.js +113 -0
- package/dist/lib/middleware/comment-rate-limit.js.map +1 -0
- package/dist/lib/middleware/feature-toggle-rate-limit.d.ts +53 -0
- package/dist/lib/middleware/feature-toggle-rate-limit.d.ts.map +1 -0
- package/dist/lib/middleware/feature-toggle-rate-limit.js +164 -0
- package/dist/lib/middleware/feature-toggle-rate-limit.js.map +1 -0
- package/dist/lib/middleware.d.ts +70 -0
- package/dist/lib/middleware.d.ts.map +1 -0
- package/dist/lib/middleware.js +375 -0
- package/dist/lib/middleware.js.map +1 -0
- package/dist/lib/moderation-handler.d.ts +55 -0
- package/dist/lib/moderation-handler.d.ts.map +1 -0
- package/dist/lib/moderation-handler.js +230 -0
- package/dist/lib/moderation-handler.js.map +1 -0
- package/dist/lib/notification-handler.d.ts +65 -0
- package/dist/lib/notification-handler.d.ts.map +1 -0
- package/dist/lib/notification-handler.js +236 -0
- package/dist/lib/notification-handler.js.map +1 -0
- package/dist/lib/notification-preferences-handler.d.ts +27 -0
- package/dist/lib/notification-preferences-handler.d.ts.map +1 -0
- package/dist/lib/notification-preferences-handler.js +119 -0
- package/dist/lib/notification-preferences-handler.js.map +1 -0
- package/dist/lib/openai-budget.d.ts +45 -0
- package/dist/lib/openai-budget.d.ts.map +1 -0
- package/dist/lib/openai-budget.js +175 -0
- package/dist/lib/openai-budget.js.map +1 -0
- package/dist/lib/orphaned-media-handler.d.ts +60 -0
- package/dist/lib/orphaned-media-handler.d.ts.map +1 -0
- package/dist/lib/orphaned-media-handler.js +487 -0
- package/dist/lib/orphaned-media-handler.js.map +1 -0
- package/dist/lib/parental-control-handler.d.ts +42 -0
- package/dist/lib/parental-control-handler.d.ts.map +1 -0
- package/dist/lib/parental-control-handler.js +327 -0
- package/dist/lib/parental-control-handler.js.map +1 -0
- package/dist/lib/parental-link-handler.d.ts +38 -0
- package/dist/lib/parental-link-handler.d.ts.map +1 -0
- package/dist/lib/parental-link-handler.js +217 -0
- package/dist/lib/parental-link-handler.js.map +1 -0
- package/dist/lib/performance-metrics.d.ts +125 -0
- package/dist/lib/performance-metrics.d.ts.map +1 -0
- package/dist/lib/performance-metrics.js +277 -0
- package/dist/lib/performance-metrics.js.map +1 -0
- package/dist/lib/post-handler.d.ts +94 -0
- package/dist/lib/post-handler.d.ts.map +1 -0
- package/dist/lib/post-handler.js +1346 -0
- package/dist/lib/post-handler.js.map +1 -0
- package/dist/lib/privacy-defaults.d.ts +32 -0
- package/dist/lib/privacy-defaults.d.ts.map +1 -0
- package/dist/lib/privacy-defaults.js +85 -0
- package/dist/lib/privacy-defaults.js.map +1 -0
- package/dist/lib/privacy-handler.d.ts +43 -0
- package/dist/lib/privacy-handler.d.ts.map +1 -0
- package/dist/lib/privacy-handler.js +124 -0
- package/dist/lib/privacy-handler.js.map +1 -0
- package/dist/lib/queue/sqs-queue.d.ts +16 -0
- package/dist/lib/queue/sqs-queue.d.ts.map +1 -0
- package/dist/lib/queue/sqs-queue.js +39 -0
- package/dist/lib/queue/sqs-queue.js.map +1 -0
- package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts +9 -0
- package/dist/lib/queue-consumers/media-reconciliation-consumer.d.ts.map +1 -0
- package/dist/lib/queue-consumers/media-reconciliation-consumer.js +37 -0
- package/dist/lib/queue-consumers/media-reconciliation-consumer.js.map +1 -0
- package/dist/lib/quiet-hours.d.ts +33 -0
- package/dist/lib/quiet-hours.d.ts.map +1 -0
- package/dist/lib/quiet-hours.js +51 -0
- package/dist/lib/quiet-hours.js.map +1 -0
- package/dist/lib/rate-limit.d.ts +95 -0
- package/dist/lib/rate-limit.d.ts.map +1 -0
- package/dist/lib/rate-limit.js +247 -0
- package/dist/lib/rate-limit.js.map +1 -0
- package/dist/lib/reaction-handler.d.ts +68 -0
- package/dist/lib/reaction-handler.d.ts.map +1 -0
- package/dist/lib/reaction-handler.js +858 -0
- package/dist/lib/reaction-handler.js.map +1 -0
- package/dist/lib/recaptcha.d.ts +16 -0
- package/dist/lib/recaptcha.d.ts.map +1 -0
- package/dist/lib/recaptcha.js +71 -0
- package/dist/lib/recaptcha.js.map +1 -0
- package/dist/lib/redirect-resolver.d.ts +78 -0
- package/dist/lib/redirect-resolver.d.ts.map +1 -0
- package/dist/lib/redirect-resolver.js +276 -0
- package/dist/lib/redirect-resolver.js.map +1 -0
- package/dist/lib/region-config.d.ts +179 -0
- package/dist/lib/region-config.d.ts.map +1 -0
- package/dist/lib/region-config.js +474 -0
- package/dist/lib/region-config.js.map +1 -0
- package/dist/lib/region-detection.d.ts +110 -0
- package/dist/lib/region-detection.d.ts.map +1 -0
- package/dist/lib/region-detection.js +408 -0
- package/dist/lib/region-detection.js.map +1 -0
- package/dist/lib/relationship-handler.d.ts +19 -0
- package/dist/lib/relationship-handler.d.ts.map +1 -0
- package/dist/lib/relationship-handler.js +233 -0
- package/dist/lib/relationship-handler.js.map +1 -0
- package/dist/lib/request-context.d.ts +103 -0
- package/dist/lib/request-context.d.ts.map +1 -0
- package/dist/lib/request-context.js +179 -0
- package/dist/lib/request-context.js.map +1 -0
- package/dist/lib/route-helpers.d.ts +74 -0
- package/dist/lib/route-helpers.d.ts.map +1 -0
- package/dist/lib/route-helpers.js +190 -0
- package/dist/lib/route-helpers.js.map +1 -0
- package/dist/lib/route-matcher.d.ts +24 -0
- package/dist/lib/route-matcher.d.ts.map +1 -0
- package/dist/lib/route-matcher.js +96 -0
- package/dist/lib/route-matcher.js.map +1 -0
- package/dist/lib/router.d.ts +26 -0
- package/dist/lib/router.d.ts.map +1 -0
- package/dist/lib/router.js +90 -0
- package/dist/lib/router.js.map +1 -0
- package/dist/lib/routes/activitypub/actor.d.ts +12 -0
- package/dist/lib/routes/activitypub/actor.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/actor.js +141 -0
- package/dist/lib/routes/activitypub/actor.js.map +1 -0
- package/dist/lib/routes/activitypub/audiences.d.ts +12 -0
- package/dist/lib/routes/activitypub/audiences.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/audiences.js +325 -0
- package/dist/lib/routes/activitypub/audiences.js.map +1 -0
- package/dist/lib/routes/activitypub/collections.d.ts +12 -0
- package/dist/lib/routes/activitypub/collections.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/collections.js +127 -0
- package/dist/lib/routes/activitypub/collections.js.map +1 -0
- package/dist/lib/routes/activitypub/entity-profile.d.ts +9 -0
- package/dist/lib/routes/activitypub/entity-profile.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/entity-profile.js +136 -0
- package/dist/lib/routes/activitypub/entity-profile.js.map +1 -0
- package/dist/lib/routes/activitypub/friends.d.ts +15 -0
- package/dist/lib/routes/activitypub/friends.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/friends.js +33 -0
- package/dist/lib/routes/activitypub/friends.js.map +1 -0
- package/dist/lib/routes/activitypub/group.d.ts +8 -0
- package/dist/lib/routes/activitypub/group.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/group.js +436 -0
- package/dist/lib/routes/activitypub/group.js.map +1 -0
- package/dist/lib/routes/activitypub/inbox.d.ts +15 -0
- package/dist/lib/routes/activitypub/inbox.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/inbox.js +125 -0
- package/dist/lib/routes/activitypub/inbox.js.map +1 -0
- package/dist/lib/routes/activitypub/messages.d.ts +12 -0
- package/dist/lib/routes/activitypub/messages.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/messages.js +374 -0
- package/dist/lib/routes/activitypub/messages.js.map +1 -0
- package/dist/lib/routes/activitypub/outbox.d.ts +15 -0
- package/dist/lib/routes/activitypub/outbox.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/outbox.js +33 -0
- package/dist/lib/routes/activitypub/outbox.js.map +1 -0
- package/dist/lib/routes/activitypub/post.d.ts +12 -0
- package/dist/lib/routes/activitypub/post.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/post.js +213 -0
- package/dist/lib/routes/activitypub/post.js.map +1 -0
- package/dist/lib/routes/activitypub/webfinger.d.ts +11 -0
- package/dist/lib/routes/activitypub/webfinger.d.ts.map +1 -0
- package/dist/lib/routes/activitypub/webfinger.js +27 -0
- package/dist/lib/routes/activitypub/webfinger.js.map +1 -0
- package/dist/lib/routes/admin-costs.d.ts +8 -0
- package/dist/lib/routes/admin-costs.d.ts.map +1 -0
- package/dist/lib/routes/admin-costs.js +89 -0
- package/dist/lib/routes/admin-costs.js.map +1 -0
- package/dist/lib/routes/admin.d.ts +6 -0
- package/dist/lib/routes/admin.d.ts.map +1 -0
- package/dist/lib/routes/admin.js +1450 -0
- package/dist/lib/routes/admin.js.map +1 -0
- package/dist/lib/routes/auth.d.ts +6 -0
- package/dist/lib/routes/auth.d.ts.map +1 -0
- package/dist/lib/routes/auth.js +49 -0
- package/dist/lib/routes/auth.js.map +1 -0
- package/dist/lib/routes/badges.d.ts +6 -0
- package/dist/lib/routes/badges.d.ts.map +1 -0
- package/dist/lib/routes/badges.js +66 -0
- package/dist/lib/routes/badges.js.map +1 -0
- package/dist/lib/routes/circles.d.ts +8 -0
- package/dist/lib/routes/circles.d.ts.map +1 -0
- package/dist/lib/routes/circles.js +135 -0
- package/dist/lib/routes/circles.js.map +1 -0
- package/dist/lib/routes/comments.d.ts +6 -0
- package/dist/lib/routes/comments.d.ts.map +1 -0
- package/dist/lib/routes/comments.js +228 -0
- package/dist/lib/routes/comments.js.map +1 -0
- package/dist/lib/routes/connection-codes.d.ts +8 -0
- package/dist/lib/routes/connection-codes.d.ts.map +1 -0
- package/dist/lib/routes/connection-codes.js +84 -0
- package/dist/lib/routes/connection-codes.js.map +1 -0
- package/dist/lib/routes/content-discovery.d.ts +11 -0
- package/dist/lib/routes/content-discovery.d.ts.map +1 -0
- package/dist/lib/routes/content-discovery.js +211 -0
- package/dist/lib/routes/content-discovery.js.map +1 -0
- package/dist/lib/routes/dashboard.d.ts +8 -0
- package/dist/lib/routes/dashboard.d.ts.map +1 -0
- package/dist/lib/routes/dashboard.js +1139 -0
- package/dist/lib/routes/dashboard.js.map +1 -0
- package/dist/lib/routes/deletion.d.ts +6 -0
- package/dist/lib/routes/deletion.d.ts.map +1 -0
- package/dist/lib/routes/deletion.js +213 -0
- package/dist/lib/routes/deletion.js.map +1 -0
- package/dist/lib/routes/discovery.d.ts +8 -0
- package/dist/lib/routes/discovery.d.ts.map +1 -0
- package/dist/lib/routes/discovery.js +67 -0
- package/dist/lib/routes/discovery.js.map +1 -0
- package/dist/lib/routes/employees.d.ts +6 -0
- package/dist/lib/routes/employees.d.ts.map +1 -0
- package/dist/lib/routes/employees.js +82 -0
- package/dist/lib/routes/employees.js.map +1 -0
- package/dist/lib/routes/entities.d.ts +8 -0
- package/dist/lib/routes/entities.d.ts.map +1 -0
- package/dist/lib/routes/entities.js +467 -0
- package/dist/lib/routes/entities.js.map +1 -0
- package/dist/lib/routes/entity-relationships.d.ts +8 -0
- package/dist/lib/routes/entity-relationships.d.ts.map +1 -0
- package/dist/lib/routes/entity-relationships.js +118 -0
- package/dist/lib/routes/entity-relationships.js.map +1 -0
- package/dist/lib/routes/export.d.ts +6 -0
- package/dist/lib/routes/export.d.ts.map +1 -0
- package/dist/lib/routes/export.js +118 -0
- package/dist/lib/routes/export.js.map +1 -0
- package/dist/lib/routes/feature-flags.d.ts +8 -0
- package/dist/lib/routes/feature-flags.d.ts.map +1 -0
- package/dist/lib/routes/feature-flags.js +75 -0
- package/dist/lib/routes/feature-flags.js.map +1 -0
- package/dist/lib/routes/feeds.d.ts +6 -0
- package/dist/lib/routes/feeds.d.ts.map +1 -0
- package/dist/lib/routes/feeds.js +131 -0
- package/dist/lib/routes/feeds.js.map +1 -0
- package/dist/lib/routes/followers.d.ts +6 -0
- package/dist/lib/routes/followers.d.ts.map +1 -0
- package/dist/lib/routes/followers.js +405 -0
- package/dist/lib/routes/followers.js.map +1 -0
- package/dist/lib/routes/friends.d.ts +6 -0
- package/dist/lib/routes/friends.d.ts.map +1 -0
- package/dist/lib/routes/friends.js +116 -0
- package/dist/lib/routes/friends.js.map +1 -0
- package/dist/lib/routes/health.d.ts +6 -0
- package/dist/lib/routes/health.d.ts.map +1 -0
- package/dist/lib/routes/health.js +129 -0
- package/dist/lib/routes/health.js.map +1 -0
- package/dist/lib/routes/index.d.ts +21 -0
- package/dist/lib/routes/index.d.ts.map +1 -0
- package/dist/lib/routes/index.js +212 -0
- package/dist/lib/routes/index.js.map +1 -0
- package/dist/lib/routes/internal-docs.d.ts +6 -0
- package/dist/lib/routes/internal-docs.d.ts.map +1 -0
- package/dist/lib/routes/internal-docs.js +44 -0
- package/dist/lib/routes/internal-docs.js.map +1 -0
- package/dist/lib/routes/invitations.d.ts +6 -0
- package/dist/lib/routes/invitations.d.ts.map +1 -0
- package/dist/lib/routes/invitations.js +67 -0
- package/dist/lib/routes/invitations.js.map +1 -0
- package/dist/lib/routes/link-reports.d.ts +11 -0
- package/dist/lib/routes/link-reports.d.ts.map +1 -0
- package/dist/lib/routes/link-reports.js +287 -0
- package/dist/lib/routes/link-reports.js.map +1 -0
- package/dist/lib/routes/map.d.ts +6 -0
- package/dist/lib/routes/map.d.ts.map +1 -0
- package/dist/lib/routes/map.js +21 -0
- package/dist/lib/routes/map.js.map +1 -0
- package/dist/lib/routes/media-metadata-visibility.d.ts +3 -0
- package/dist/lib/routes/media-metadata-visibility.d.ts.map +1 -0
- package/dist/lib/routes/media-metadata-visibility.js +184 -0
- package/dist/lib/routes/media-metadata-visibility.js.map +1 -0
- package/dist/lib/routes/media.d.ts +9 -0
- package/dist/lib/routes/media.d.ts.map +1 -0
- package/dist/lib/routes/media.js +1910 -0
- package/dist/lib/routes/media.js.map +1 -0
- package/dist/lib/routes/mfa.d.ts +8 -0
- package/dist/lib/routes/mfa.d.ts.map +1 -0
- package/dist/lib/routes/mfa.js +193 -0
- package/dist/lib/routes/mfa.js.map +1 -0
- package/dist/lib/routes/notifications.d.ts +9 -0
- package/dist/lib/routes/notifications.d.ts.map +1 -0
- package/dist/lib/routes/notifications.js +230 -0
- package/dist/lib/routes/notifications.js.map +1 -0
- package/dist/lib/routes/orphaned-media-health.d.ts +9 -0
- package/dist/lib/routes/orphaned-media-health.d.ts.map +1 -0
- package/dist/lib/routes/orphaned-media-health.js +121 -0
- package/dist/lib/routes/orphaned-media-health.js.map +1 -0
- package/dist/lib/routes/orphaned-media.d.ts +8 -0
- package/dist/lib/routes/orphaned-media.d.ts.map +1 -0
- package/dist/lib/routes/orphaned-media.js +111 -0
- package/dist/lib/routes/orphaned-media.js.map +1 -0
- package/dist/lib/routes/out.d.ts +17 -0
- package/dist/lib/routes/out.d.ts.map +1 -0
- package/dist/lib/routes/out.js +339 -0
- package/dist/lib/routes/out.js.map +1 -0
- package/dist/lib/routes/parental-controls.d.ts +8 -0
- package/dist/lib/routes/parental-controls.d.ts.map +1 -0
- package/dist/lib/routes/parental-controls.js +282 -0
- package/dist/lib/routes/parental-controls.js.map +1 -0
- package/dist/lib/routes/posts.d.ts +6 -0
- package/dist/lib/routes/posts.d.ts.map +1 -0
- package/dist/lib/routes/posts.js +518 -0
- package/dist/lib/routes/posts.js.map +1 -0
- package/dist/lib/routes/privacy.d.ts +6 -0
- package/dist/lib/routes/privacy.d.ts.map +1 -0
- package/dist/lib/routes/privacy.js +66 -0
- package/dist/lib/routes/privacy.js.map +1 -0
- package/dist/lib/routes/products.d.ts +9 -0
- package/dist/lib/routes/products.d.ts.map +1 -0
- package/dist/lib/routes/products.js +224 -0
- package/dist/lib/routes/products.js.map +1 -0
- package/dist/lib/routes/relationships.d.ts +8 -0
- package/dist/lib/routes/relationships.d.ts.map +1 -0
- package/dist/lib/routes/relationships.js +118 -0
- package/dist/lib/routes/relationships.js.map +1 -0
- package/dist/lib/routes/sentiments.d.ts +6 -0
- package/dist/lib/routes/sentiments.d.ts.map +1 -0
- package/dist/lib/routes/sentiments.js +285 -0
- package/dist/lib/routes/sentiments.js.map +1 -0
- package/dist/lib/routes/taxonomy-analytics.d.ts +8 -0
- package/dist/lib/routes/taxonomy-analytics.d.ts.map +1 -0
- package/dist/lib/routes/taxonomy-analytics.js +151 -0
- package/dist/lib/routes/taxonomy-analytics.js.map +1 -0
- package/dist/lib/routes/taxonomy.d.ts +15 -0
- package/dist/lib/routes/taxonomy.d.ts.map +1 -0
- package/dist/lib/routes/taxonomy.js +370 -0
- package/dist/lib/routes/taxonomy.js.map +1 -0
- package/dist/lib/routes/types.d.ts +46 -0
- package/dist/lib/routes/types.d.ts.map +1 -0
- package/dist/lib/routes/types.js +8 -0
- package/dist/lib/routes/types.js.map +1 -0
- package/dist/lib/routes/upload-sessions.d.ts +9 -0
- package/dist/lib/routes/upload-sessions.d.ts.map +1 -0
- package/dist/lib/routes/upload-sessions.js +268 -0
- package/dist/lib/routes/upload-sessions.js.map +1 -0
- package/dist/lib/routes/user.d.ts +8 -0
- package/dist/lib/routes/user.d.ts.map +1 -0
- package/dist/lib/routes/user.js +287 -0
- package/dist/lib/routes/user.js.map +1 -0
- package/dist/lib/routes-all.d.ts +9 -0
- package/dist/lib/routes-all.d.ts.map +1 -0
- package/dist/lib/routes-all.js +170 -0
- package/dist/lib/routes-all.js.map +1 -0
- package/dist/lib/routes.d.ts +10 -0
- package/dist/lib/routes.d.ts.map +1 -0
- package/dist/lib/routes.js +16 -0
- package/dist/lib/routes.js.map +1 -0
- package/dist/lib/scaling-health.d.ts +48 -0
- package/dist/lib/scaling-health.d.ts.map +1 -0
- package/dist/lib/scaling-health.js +363 -0
- package/dist/lib/scaling-health.js.map +1 -0
- package/dist/lib/scheduled/media-stale-cleanup.d.ts +11 -0
- package/dist/lib/scheduled/media-stale-cleanup.d.ts.map +1 -0
- package/dist/lib/scheduled/media-stale-cleanup.js +79 -0
- package/dist/lib/scheduled/media-stale-cleanup.js.map +1 -0
- package/dist/lib/scheduled/orphaned-media-monitor.d.ts +97 -0
- package/dist/lib/scheduled/orphaned-media-monitor.d.ts.map +1 -0
- package/dist/lib/scheduled/orphaned-media-monitor.js +399 -0
- package/dist/lib/scheduled/orphaned-media-monitor.js.map +1 -0
- package/dist/lib/schemas.d.ts +314 -0
- package/dist/lib/schemas.d.ts.map +1 -0
- package/dist/lib/schemas.js +235 -0
- package/dist/lib/schemas.js.map +1 -0
- package/dist/lib/secret-resolver.d.ts +88 -0
- package/dist/lib/secret-resolver.d.ts.map +1 -0
- package/dist/lib/secret-resolver.js +183 -0
- package/dist/lib/secret-resolver.js.map +1 -0
- package/dist/lib/security-event-cleaner.d.ts +61 -0
- package/dist/lib/security-event-cleaner.d.ts.map +1 -0
- package/dist/lib/security-event-cleaner.js +74 -0
- package/dist/lib/security-event-cleaner.js.map +1 -0
- package/dist/lib/security-headers.d.ts +36 -0
- package/dist/lib/security-headers.d.ts.map +1 -0
- package/dist/lib/security-headers.js +87 -0
- package/dist/lib/security-headers.js.map +1 -0
- package/dist/lib/security-monitor.d.ts +92 -0
- package/dist/lib/security-monitor.d.ts.map +1 -0
- package/dist/lib/security-monitor.js +287 -0
- package/dist/lib/security-monitor.js.map +1 -0
- package/dist/lib/sentiment-digest.d.ts +19 -0
- package/dist/lib/sentiment-digest.d.ts.map +1 -0
- package/dist/lib/sentiment-digest.js +99 -0
- package/dist/lib/sentiment-digest.js.map +1 -0
- package/dist/lib/sentiment-display.d.ts +20 -0
- package/dist/lib/sentiment-display.d.ts.map +1 -0
- package/dist/lib/sentiment-display.js +38 -0
- package/dist/lib/sentiment-display.js.map +1 -0
- package/dist/lib/services/image-normalizer.d.ts +15 -0
- package/dist/lib/services/image-normalizer.d.ts.map +1 -0
- package/dist/lib/services/image-normalizer.js +22 -0
- package/dist/lib/services/image-normalizer.js.map +1 -0
- package/dist/lib/services/media-reconciliation-service.d.ts +25 -0
- package/dist/lib/services/media-reconciliation-service.d.ts.map +1 -0
- package/dist/lib/services/media-reconciliation-service.js +191 -0
- package/dist/lib/services/media-reconciliation-service.js.map +1 -0
- package/dist/lib/services/media-upload-service.d.ts +25 -0
- package/dist/lib/services/media-upload-service.d.ts.map +1 -0
- package/dist/lib/services/media-upload-service.js +240 -0
- package/dist/lib/services/media-upload-service.js.map +1 -0
- package/dist/lib/services/user-data-deletion.d.ts +30 -0
- package/dist/lib/services/user-data-deletion.d.ts.map +1 -0
- package/dist/lib/services/user-data-deletion.js +118 -0
- package/dist/lib/services/user-data-deletion.js.map +1 -0
- package/dist/lib/session-awareness.d.ts +35 -0
- package/dist/lib/session-awareness.d.ts.map +1 -0
- package/dist/lib/session-awareness.js +79 -0
- package/dist/lib/session-awareness.js.map +1 -0
- package/dist/lib/session-config.d.ts +87 -0
- package/dist/lib/session-config.d.ts.map +1 -0
- package/dist/lib/session-config.js +165 -0
- package/dist/lib/session-config.js.map +1 -0
- package/dist/lib/session-manager.d.ts +103 -0
- package/dist/lib/session-manager.d.ts.map +1 -0
- package/dist/lib/session-manager.js +492 -0
- package/dist/lib/session-manager.js.map +1 -0
- package/dist/lib/sso-auth-handler.d.ts +12 -0
- package/dist/lib/sso-auth-handler.d.ts.map +1 -0
- package/dist/lib/sso-auth-handler.js +24 -0
- package/dist/lib/sso-auth-handler.js.map +1 -0
- package/dist/lib/storage/s3-storage.d.ts +29 -0
- package/dist/lib/storage/s3-storage.d.ts.map +1 -0
- package/dist/lib/storage/s3-storage.js +135 -0
- package/dist/lib/storage/s3-storage.js.map +1 -0
- package/dist/lib/tag-suggestions-handler.d.ts +52 -0
- package/dist/lib/tag-suggestions-handler.d.ts.map +1 -0
- package/dist/lib/tag-suggestions-handler.js +195 -0
- package/dist/lib/tag-suggestions-handler.js.map +1 -0
- package/dist/lib/taxonomy-handler-factory.d.ts +18 -0
- package/dist/lib/taxonomy-handler-factory.d.ts.map +1 -0
- package/dist/lib/taxonomy-handler-factory.js +29 -0
- package/dist/lib/taxonomy-handler-factory.js.map +1 -0
- package/dist/lib/taxonomy-handler.d.ts +142 -0
- package/dist/lib/taxonomy-handler.d.ts.map +1 -0
- package/dist/lib/taxonomy-handler.js +636 -0
- package/dist/lib/taxonomy-handler.js.map +1 -0
- package/dist/lib/taxonomy-metrics.d.ts +76 -0
- package/dist/lib/taxonomy-metrics.d.ts.map +1 -0
- package/dist/lib/taxonomy-metrics.js +201 -0
- package/dist/lib/taxonomy-metrics.js.map +1 -0
- package/dist/lib/taxonomy-search-metrics.d.ts +45 -0
- package/dist/lib/taxonomy-search-metrics.d.ts.map +1 -0
- package/dist/lib/taxonomy-search-metrics.js +75 -0
- package/dist/lib/taxonomy-search-metrics.js.map +1 -0
- package/dist/lib/tenant-context.d.ts +35 -0
- package/dist/lib/tenant-context.d.ts.map +1 -0
- package/dist/lib/tenant-context.js +54 -0
- package/dist/lib/tenant-context.js.map +1 -0
- package/dist/lib/terminology.d.ts +25 -0
- package/dist/lib/terminology.d.ts.map +1 -0
- package/dist/lib/terminology.js +44 -0
- package/dist/lib/terminology.js.map +1 -0
- package/dist/lib/theme.d.ts +29 -0
- package/dist/lib/theme.d.ts.map +1 -0
- package/dist/lib/theme.js +38 -0
- package/dist/lib/theme.js.map +1 -0
- package/dist/lib/threat-intel-service.d.ts +67 -0
- package/dist/lib/threat-intel-service.d.ts.map +1 -0
- package/dist/lib/threat-intel-service.js +193 -0
- package/dist/lib/threat-intel-service.js.map +1 -0
- package/dist/lib/types/media-reconciliation.d.ts +64 -0
- package/dist/lib/types/media-reconciliation.d.ts.map +1 -0
- package/dist/lib/types/media-reconciliation.js +8 -0
- package/dist/lib/types/media-reconciliation.js.map +1 -0
- package/dist/lib/upload-session-handler.d.ts +56 -0
- package/dist/lib/upload-session-handler.d.ts.map +1 -0
- package/dist/lib/upload-session-handler.js +312 -0
- package/dist/lib/upload-session-handler.js.map +1 -0
- package/dist/lib/user-badge.d.ts +56 -0
- package/dist/lib/user-badge.d.ts.map +1 -0
- package/dist/lib/user-badge.js +92 -0
- package/dist/lib/user-badge.js.map +1 -0
- package/dist/lib/user-deletion-handler-enhanced.d.ts +96 -0
- package/dist/lib/user-deletion-handler-enhanced.d.ts.map +1 -0
- package/dist/lib/user-deletion-handler-enhanced.js +401 -0
- package/dist/lib/user-deletion-handler-enhanced.js.map +1 -0
- package/dist/lib/user-deprovisioning.d.ts +43 -0
- package/dist/lib/user-deprovisioning.d.ts.map +1 -0
- package/dist/lib/user-deprovisioning.js +138 -0
- package/dist/lib/user-deprovisioning.js.map +1 -0
- package/dist/lib/user-export-handler.d.ts +172 -0
- package/dist/lib/user-export-handler.d.ts.map +1 -0
- package/dist/lib/user-export-handler.js +435 -0
- package/dist/lib/user-export-handler.js.map +1 -0
- package/dist/lib/validate-request.d.ts +46 -0
- package/dist/lib/validate-request.d.ts.map +1 -0
- package/dist/lib/validate-request.js +127 -0
- package/dist/lib/validate-request.js.map +1 -0
- package/dist/lib/validation/feature-toggle-schemas.d.ts +410 -0
- package/dist/lib/validation/feature-toggle-schemas.d.ts.map +1 -0
- package/dist/lib/validation/feature-toggle-schemas.js +274 -0
- package/dist/lib/validation/feature-toggle-schemas.js.map +1 -0
- package/dist/lib/validation/validate-request.d.ts +75 -0
- package/dist/lib/validation/validate-request.d.ts.map +1 -0
- package/dist/lib/validation/validate-request.js +183 -0
- package/dist/lib/validation/validate-request.js.map +1 -0
- package/dist/lib/validation.d.ts +50 -0
- package/dist/lib/validation.d.ts.map +1 -0
- package/dist/lib/validation.js +122 -0
- package/dist/lib/validation.js.map +1 -0
- package/dist/lib/version.d.ts +36 -0
- package/dist/lib/version.d.ts.map +1 -0
- package/dist/lib/version.js +44 -0
- package/dist/lib/version.js.map +1 -0
- package/dist/server.d.ts +13 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +254 -0
- package/dist/server.js.map +1 -0
- package/dist/types/cloudflare-compat.d.ts +134 -0
- package/dist/types/cloudflare-compat.d.ts.map +1 -0
- package/dist/types/cloudflare-compat.js +7 -0
- package/dist/types/cloudflare-compat.js.map +1 -0
- package/dist/worker.d.ts +16 -0
- package/dist/worker.d.ts.map +1 -0
- package/dist/worker.js +21 -0
- package/dist/worker.js.map +1 -0
- package/package.json +91 -0
- package/src/lambda/cleanup-cron.ts +37 -0
- package/src/lambda/create-auth-challenge.ts +112 -0
- package/src/lambda/custom-message.ts +30 -0
- package/src/lambda/define-auth-challenge.ts +24 -0
- package/src/lambda/delete-account-worker.ts +96 -0
- package/src/lambda/diagnostics-proxy.ts +139 -0
- package/src/lambda/e2e-sweeper.ts +140 -0
- package/src/lambda/federation-outbox-worker.ts +8 -0
- package/src/lambda/followers-events-worker.ts +8 -0
- package/src/lambda/hourly-cron.ts +103 -0
- package/src/lambda/link-check-worker.ts +8 -0
- package/src/lambda/maintenance-cron.ts +95 -0
- package/src/lambda/media-processing-worker.ts +68 -0
- package/src/lambda/media-reconciliation-worker.ts +8 -0
- package/src/lambda/nightly-cron.ts +338 -0
- package/src/lambda/post-confirmation.ts +80 -0
- package/src/lambda/pre-signup.ts +39 -0
- package/src/lambda/pre-token-generation.ts +93 -0
- package/src/lambda/tools/check-health.ts +22 -0
- package/src/lambda/tools/describe-services.ts +45 -0
- package/src/lambda/tools/get-cost-report.ts +64 -0
- package/src/lambda/tools/get-errors.ts +78 -0
- package/src/lambda/tools/get-feature-flags.ts +27 -0
- package/src/lambda/tools/get-queue-status.ts +60 -0
- package/src/lambda/tools/search-logs.ts +75 -0
- package/src/lambda/tools/send-alert.ts +37 -0
- package/src/lambda/verify-auth-challenge.ts +37 -0
|
@@ -0,0 +1,1346 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.PostHandler = void 0;
|
|
37
|
+
/**
|
|
38
|
+
* Post Handler
|
|
39
|
+
*
|
|
40
|
+
* Handles post creation, deletion, and hiding.
|
|
41
|
+
*
|
|
42
|
+
* PREPARATORY: Uses DataRouter for region-aware data operations.
|
|
43
|
+
*/
|
|
44
|
+
const data_router_1 = require("./data-router");
|
|
45
|
+
const logger_1 = require("./logger");
|
|
46
|
+
const moderation_handler_1 = require("./moderation-handler");
|
|
47
|
+
class PostHandler {
|
|
48
|
+
moderationHandler;
|
|
49
|
+
logger;
|
|
50
|
+
constructor(env) {
|
|
51
|
+
this.moderationHandler = new moderation_handler_1.ModerationHandler();
|
|
52
|
+
this.logger = logger_1.Logger.getInstance(env);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Create a new post
|
|
56
|
+
*
|
|
57
|
+
* PREPARATORY: Uses DataRouter for region-aware post creation.
|
|
58
|
+
*/
|
|
59
|
+
async createPost(request, session, env, requestContext) {
|
|
60
|
+
try {
|
|
61
|
+
// PREPARATORY: Check if post creation is enabled for this region
|
|
62
|
+
// Note: Post creation is always enabled by default, but can be disabled via feature flags
|
|
63
|
+
// This is a placeholder for future feature flag checks (e.g., offlineMode, content moderation)
|
|
64
|
+
// Validate request body with Zod schema
|
|
65
|
+
const { validateRequest } = await Promise.resolve().then(() => __importStar(require("./validate-request")));
|
|
66
|
+
const { createPostSchema } = await Promise.resolve().then(() => __importStar(require("./schemas")));
|
|
67
|
+
const validation = await validateRequest(request, createPostSchema);
|
|
68
|
+
if (!validation.success) {
|
|
69
|
+
return validation.error;
|
|
70
|
+
}
|
|
71
|
+
const body = validation.data;
|
|
72
|
+
// Check if public posting is enabled globally
|
|
73
|
+
if (body.visibility === "public") {
|
|
74
|
+
const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
|
|
75
|
+
const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
|
|
76
|
+
const db = createPrisma(env);
|
|
77
|
+
const toggleService = new FeatureToggleService(db);
|
|
78
|
+
const publicPostingEnabled = await toggleService.isEnabled("global_public_posting_enabled");
|
|
79
|
+
if (!publicPostingEnabled) {
|
|
80
|
+
return new Response(JSON.stringify({
|
|
81
|
+
error: "PUBLIC_POSTING_DISABLED",
|
|
82
|
+
message: 'Public posting is currently disabled. Please use "Friends Only" or "Private" visibility.',
|
|
83
|
+
}), { status: 403, headers: { "content-type": "application/json" } });
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
// Check if content moderation is enabled via feature toggle
|
|
87
|
+
const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
|
|
88
|
+
const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
|
|
89
|
+
const db = createPrisma(env);
|
|
90
|
+
const toggleService = new FeatureToggleService(db, env);
|
|
91
|
+
const moderationEnabled = await toggleService.isEnabled("content_moderation_enabled");
|
|
92
|
+
// Moderate text content (if moderation is enabled)
|
|
93
|
+
if (moderationEnabled) {
|
|
94
|
+
const moderationResult = await this.moderationHandler.moderateText(body.text, env);
|
|
95
|
+
// Debug: Log Perspective API result (safely handle serialization)
|
|
96
|
+
try {
|
|
97
|
+
const debugData = {
|
|
98
|
+
approved: moderationResult.approved,
|
|
99
|
+
score: moderationResult.score,
|
|
100
|
+
details: moderationResult.details,
|
|
101
|
+
error: moderationResult.error,
|
|
102
|
+
text: body.text.substring(0, 100), // First 100 chars for context
|
|
103
|
+
};
|
|
104
|
+
logger_1.Logger.getInstance(env).debug("[PostHandler] Moderation API result:", JSON.stringify(debugData));
|
|
105
|
+
}
|
|
106
|
+
catch (debugError) {
|
|
107
|
+
// If serialization fails, log a simpler version
|
|
108
|
+
logger_1.Logger.getInstance(env).debug("[PostHandler] Moderation API result (simplified):", {
|
|
109
|
+
approved: moderationResult.approved,
|
|
110
|
+
score: moderationResult.score,
|
|
111
|
+
hasDetails: !!moderationResult.details,
|
|
112
|
+
hasError: !!moderationResult.error,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
if (!moderationResult.approved) {
|
|
116
|
+
return new Response(JSON.stringify({
|
|
117
|
+
error: "CONTENT_REJECTED",
|
|
118
|
+
message: "Your post contains inappropriate content. Please be more constructive.",
|
|
119
|
+
score: moderationResult.score,
|
|
120
|
+
details: moderationResult.details,
|
|
121
|
+
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
logger_1.Logger.getInstance(env).debug("[PostHandler] Content moderation is disabled via feature toggle");
|
|
126
|
+
}
|
|
127
|
+
// Check for malicious links
|
|
128
|
+
const { LinkSecurityHandler, LinkStatus } = await Promise.resolve().then(() => __importStar(require("./link-security-handler")));
|
|
129
|
+
const linkSecurityHandler = new LinkSecurityHandler(env);
|
|
130
|
+
const urls = linkSecurityHandler.extractUrls(body.text);
|
|
131
|
+
let hasBlockedLinks = false;
|
|
132
|
+
const linkChecks = [];
|
|
133
|
+
for (const url of urls) {
|
|
134
|
+
const validation = linkSecurityHandler.validateUrlSync(url);
|
|
135
|
+
if (validation.status === LinkStatus.BLOCKED) {
|
|
136
|
+
hasBlockedLinks = true;
|
|
137
|
+
this.logger.warn(`Blocked dangerous URL in post: ${url}`, {
|
|
138
|
+
reason: validation.reason,
|
|
139
|
+
userId: session.userId,
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
if (validation.normalizedUrl) {
|
|
143
|
+
linkChecks.push({
|
|
144
|
+
originalUrl: url,
|
|
145
|
+
normalizedUrl: validation.normalizedUrl.normalized,
|
|
146
|
+
domain: validation.normalizedUrl.domain,
|
|
147
|
+
status: validation.status,
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
// Block post creation if dangerous links detected
|
|
152
|
+
if (hasBlockedLinks) {
|
|
153
|
+
return new Response(JSON.stringify({
|
|
154
|
+
error: "DANGEROUS_LINKS_DETECTED",
|
|
155
|
+
message: "Your post contains dangerous or blocked links. Please remove them and try again.",
|
|
156
|
+
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
157
|
+
}
|
|
158
|
+
// PREPARATORY: Use DataRouter for region-aware operations
|
|
159
|
+
const requestId = (0, logger_1.generateRequestId)();
|
|
160
|
+
const region = requestContext.region;
|
|
161
|
+
// OPTIMIZATION: Use upsert directly instead of getUser + createUser
|
|
162
|
+
// This eliminates an unnecessary database query and is faster
|
|
163
|
+
// DataRouter.createUser uses upsert, so it handles both create and update cases
|
|
164
|
+
const user = await data_router_1.DataRouter.createUser({
|
|
165
|
+
id: session.userId,
|
|
166
|
+
email: session.email,
|
|
167
|
+
}, region, env, request, requestId);
|
|
168
|
+
// Sanitize user input to prevent XSS
|
|
169
|
+
const { InputSanitizer } = await Promise.resolve().then(() => __importStar(require("./input-sanitizer")));
|
|
170
|
+
const sanitizedText = InputSanitizer.sanitizeText(body.text);
|
|
171
|
+
// Get entityRefs (validation happens in DataRouter within transaction)
|
|
172
|
+
const entityRefs = body.entityRefs || [];
|
|
173
|
+
// Get taxonomy tags (optional)
|
|
174
|
+
const taxonomyTags = body.taxonomyTags || [];
|
|
175
|
+
// Validate media ownership and existence
|
|
176
|
+
if (body.media && body.media.length > 0) {
|
|
177
|
+
const mediaIds = body.media.map((m) => m.id);
|
|
178
|
+
// Debug: Log media IDs being validated
|
|
179
|
+
this.logger.debug("[PostHandler] Validating media IDs", {
|
|
180
|
+
mediaIds,
|
|
181
|
+
userId: session.userId,
|
|
182
|
+
count: mediaIds.length,
|
|
183
|
+
});
|
|
184
|
+
// Import database helpers for media validation
|
|
185
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
186
|
+
const { sharedDatabaseConnectionManager } = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
187
|
+
// Verify all media files exist and belong to user
|
|
188
|
+
// Note: mediaIds can be either contentHash (SHA-256) or CUID
|
|
189
|
+
// We search by contentHash first (preferred), then fall back to id
|
|
190
|
+
const mediaFiles = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
191
|
+
return await db.mediaFile.findMany({
|
|
192
|
+
where: {
|
|
193
|
+
OR: [
|
|
194
|
+
{ contentHash: { in: mediaIds } },
|
|
195
|
+
{ id: { in: mediaIds } },
|
|
196
|
+
],
|
|
197
|
+
uploadedBy: session.userId,
|
|
198
|
+
deletedAt: null,
|
|
199
|
+
},
|
|
200
|
+
});
|
|
201
|
+
}, {
|
|
202
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
203
|
+
maxRetries: 2,
|
|
204
|
+
context: {
|
|
205
|
+
operation: "createPost_validateMedia",
|
|
206
|
+
userId: session.userId,
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
// Debug: Log validation results
|
|
210
|
+
this.logger.debug("[PostHandler] Media validation results", {
|
|
211
|
+
requestedCount: mediaIds.length,
|
|
212
|
+
foundCount: mediaFiles.length,
|
|
213
|
+
foundIds: mediaFiles.map((m) => m.id),
|
|
214
|
+
foundContentHashes: mediaFiles.map((m) => m.contentHash),
|
|
215
|
+
missingIds: mediaIds.filter((id) => !mediaFiles.find((m) => m.id === id || m.contentHash === id)),
|
|
216
|
+
});
|
|
217
|
+
// Check if all media IDs are valid
|
|
218
|
+
if (mediaFiles.length !== mediaIds.length) {
|
|
219
|
+
// Diagnostic: query WITHOUT uploadedBy filter to determine root cause
|
|
220
|
+
let diagnosticInfo = {};
|
|
221
|
+
try {
|
|
222
|
+
const allMatches = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
223
|
+
return await db.mediaFile.findMany({
|
|
224
|
+
where: {
|
|
225
|
+
OR: [
|
|
226
|
+
{ contentHash: { in: mediaIds } },
|
|
227
|
+
{ id: { in: mediaIds } },
|
|
228
|
+
],
|
|
229
|
+
},
|
|
230
|
+
select: {
|
|
231
|
+
id: true,
|
|
232
|
+
contentHash: true,
|
|
233
|
+
uploadedBy: true,
|
|
234
|
+
deletedAt: true,
|
|
235
|
+
uploadStatus: true,
|
|
236
|
+
createdAt: true,
|
|
237
|
+
},
|
|
238
|
+
});
|
|
239
|
+
}, {
|
|
240
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
241
|
+
maxRetries: 1,
|
|
242
|
+
context: { operation: "createPost_mediaDebug" },
|
|
243
|
+
});
|
|
244
|
+
diagnosticInfo = {
|
|
245
|
+
recordsWithoutOwnerFilter: allMatches.length,
|
|
246
|
+
records: allMatches.map((m) => ({
|
|
247
|
+
id: m.id,
|
|
248
|
+
contentHash: m.contentHash?.substring(0, 12) + "...",
|
|
249
|
+
uploadedBy: m.uploadedBy,
|
|
250
|
+
deletedAt: m.deletedAt,
|
|
251
|
+
uploadStatus: m.uploadStatus,
|
|
252
|
+
createdAt: m.createdAt,
|
|
253
|
+
})),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
catch (e) {
|
|
257
|
+
diagnosticInfo = { diagnosticQueryError: e.message };
|
|
258
|
+
}
|
|
259
|
+
console.log("[PostHandler] INVALID_MEDIA diagnostic", {
|
|
260
|
+
requestedIds: mediaIds,
|
|
261
|
+
userId: session.userId,
|
|
262
|
+
region,
|
|
263
|
+
foundWithOwnerFilter: mediaFiles.length,
|
|
264
|
+
...diagnosticInfo,
|
|
265
|
+
});
|
|
266
|
+
this.logger.warn("[PostHandler] Media validation failed", {
|
|
267
|
+
requestedIds: mediaIds,
|
|
268
|
+
foundIds: mediaFiles.map((m) => m.id),
|
|
269
|
+
foundContentHashes: mediaFiles.map((m) => m.contentHash),
|
|
270
|
+
userId: session.userId,
|
|
271
|
+
});
|
|
272
|
+
return new Response(JSON.stringify({
|
|
273
|
+
error: "INVALID_MEDIA",
|
|
274
|
+
message: "One or more media files not found or not owned by user",
|
|
275
|
+
details: {
|
|
276
|
+
requested: mediaIds.length,
|
|
277
|
+
found: mediaFiles.length,
|
|
278
|
+
...diagnosticInfo,
|
|
279
|
+
},
|
|
280
|
+
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
281
|
+
}
|
|
282
|
+
// Create a mapping from contentHash/id to database ID
|
|
283
|
+
// This ensures we use the correct database ID when creating PostMedia records
|
|
284
|
+
const mediaIdMap = new Map();
|
|
285
|
+
for (const file of mediaFiles) {
|
|
286
|
+
mediaIdMap.set(file.contentHash, file.id);
|
|
287
|
+
mediaIdMap.set(file.id, file.id);
|
|
288
|
+
}
|
|
289
|
+
// Remap media IDs to database IDs
|
|
290
|
+
body.media = body.media.map((m) => ({
|
|
291
|
+
...m,
|
|
292
|
+
id: mediaIdMap.get(m.id) || m.id,
|
|
293
|
+
}));
|
|
294
|
+
}
|
|
295
|
+
// Convert visibility to Prisma enum format
|
|
296
|
+
// API accepts: "public", "friends-only", "private"
|
|
297
|
+
// Prisma expects: "PUBLIC", "FRIENDS", "PRIVATE"
|
|
298
|
+
let visibility = (body.visibility || "public").toUpperCase();
|
|
299
|
+
if (visibility === "FRIENDS-ONLY" || visibility === "FRIENDS_ONLY") {
|
|
300
|
+
visibility = "FRIENDS";
|
|
301
|
+
}
|
|
302
|
+
// Create post using DataRouter (enforces dataRegion)
|
|
303
|
+
// Note: Entity tagging validation happens within transaction in DataRouter
|
|
304
|
+
const post = await data_router_1.DataRouter.createPost({
|
|
305
|
+
authorId: session.userId,
|
|
306
|
+
text: sanitizedText.trim(),
|
|
307
|
+
visibility,
|
|
308
|
+
entityRefs: entityRefs.length > 0 ? entityRefs : undefined,
|
|
309
|
+
geoData: body.geoData,
|
|
310
|
+
contentWarnings: body.contentWarnings || [],
|
|
311
|
+
hasBlockedLinks: hasBlockedLinks,
|
|
312
|
+
media: body.media, // NEW: Pass media to DataRouter
|
|
313
|
+
}, region, env, request, requestId, session);
|
|
314
|
+
// Create LinkCheck records and queue threat intel checks
|
|
315
|
+
if (linkChecks.length > 0) {
|
|
316
|
+
try {
|
|
317
|
+
const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
|
|
318
|
+
const db = createPrisma(env);
|
|
319
|
+
// Ensure domain reputation records exist
|
|
320
|
+
const domains = [...new Set(linkChecks.map((lc) => lc.domain))];
|
|
321
|
+
for (const domain of domains) {
|
|
322
|
+
await db.domainReputation.upsert({
|
|
323
|
+
where: { domain },
|
|
324
|
+
create: {
|
|
325
|
+
domain,
|
|
326
|
+
reputation: 0,
|
|
327
|
+
status: "unknown",
|
|
328
|
+
},
|
|
329
|
+
update: {},
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
// Create LinkCheck records
|
|
333
|
+
const linkCheckPromises = linkChecks.map(async (linkCheck) => {
|
|
334
|
+
const check = await db.linkCheck.create({
|
|
335
|
+
data: {
|
|
336
|
+
postId: post.id,
|
|
337
|
+
originalUrl: linkCheck.originalUrl,
|
|
338
|
+
normalizedUrl: linkCheck.normalizedUrl,
|
|
339
|
+
domain: linkCheck.domain,
|
|
340
|
+
status: linkCheck.status,
|
|
341
|
+
checkType: "async",
|
|
342
|
+
},
|
|
343
|
+
});
|
|
344
|
+
// Queue threat intel check if queue is available
|
|
345
|
+
if (env.LINK_CHECK_QUEUE) {
|
|
346
|
+
try {
|
|
347
|
+
await env.LINK_CHECK_QUEUE.send({
|
|
348
|
+
linkCheckId: check.id,
|
|
349
|
+
url: linkCheck.normalizedUrl,
|
|
350
|
+
domain: linkCheck.domain,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
catch (queueError) {
|
|
354
|
+
this.logger.warn("Failed to queue threat intel check:", queueError);
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return check;
|
|
358
|
+
});
|
|
359
|
+
await Promise.all(linkCheckPromises);
|
|
360
|
+
}
|
|
361
|
+
catch (error) {
|
|
362
|
+
// Log error but don't fail post creation if link checks fail
|
|
363
|
+
this.logger.error("Error creating link checks:", error);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// Add taxonomy tags if provided
|
|
367
|
+
if (taxonomyTags.length > 0) {
|
|
368
|
+
try {
|
|
369
|
+
const { TaxonomyHandler } = await Promise.resolve().then(() => __importStar(require("./taxonomy-handler")));
|
|
370
|
+
const { getRequestContext } = await Promise.resolve().then(() => __importStar(require("./tenant-context")));
|
|
371
|
+
const { createRequestContext } = await Promise.resolve().then(() => __importStar(require("./request-context")));
|
|
372
|
+
const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
|
|
373
|
+
// Get tenant ID
|
|
374
|
+
const ctx = await createRequestContext(request, env);
|
|
375
|
+
const tenantCtx = await getRequestContext(request, ctx.session || null);
|
|
376
|
+
const tenantId = tenantCtx.tenant?.id || "trellis";
|
|
377
|
+
// Get database and taxonomy handler
|
|
378
|
+
const db = getWrappedDatabase(region, env, request);
|
|
379
|
+
const taxonomyHandler = new TaxonomyHandler(db, tenantId, env.TAXONOMY_CACHE_KV);
|
|
380
|
+
// Add taxonomy tags
|
|
381
|
+
await taxonomyHandler.addPostTaxonomyTags(post.id, taxonomyTags, session.userId);
|
|
382
|
+
}
|
|
383
|
+
catch (error) {
|
|
384
|
+
// Log error but don't fail post creation if taxonomy tagging fails
|
|
385
|
+
this.logger.error("Error adding taxonomy tags to post:", error);
|
|
386
|
+
// Continue with post creation - taxonomy tags are optional
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
// Graph sync: dual-write post to graph database
|
|
390
|
+
try {
|
|
391
|
+
const { createGraphServiceFromEnv } = await Promise.resolve().then(() => __importStar(require("./graph")));
|
|
392
|
+
const graphService = await createGraphServiceFromEnv(env);
|
|
393
|
+
await graphService.syncPost({
|
|
394
|
+
id: post.id,
|
|
395
|
+
authorId: session.userId,
|
|
396
|
+
radius: body.radius || "NORMAL",
|
|
397
|
+
createdAt: post.createdAt || new Date(),
|
|
398
|
+
});
|
|
399
|
+
if (entityRefs.length > 0) {
|
|
400
|
+
await graphService.syncPostSubjects({
|
|
401
|
+
postId: post.id,
|
|
402
|
+
entityIds: entityRefs,
|
|
403
|
+
primaryEntityId: entityRefs[0],
|
|
404
|
+
});
|
|
405
|
+
for (const entityId of entityRefs) {
|
|
406
|
+
await graphService.recordInteraction({
|
|
407
|
+
userId: session.userId,
|
|
408
|
+
targetType: "entity",
|
|
409
|
+
targetId: entityId,
|
|
410
|
+
interactionType: "content_creation",
|
|
411
|
+
metadata: { postId: post.id },
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
catch (graphError) {
|
|
417
|
+
this.logger.error("[PostHandler] Graph sync failed for post creation (non-fatal):", {
|
|
418
|
+
postId: post.id,
|
|
419
|
+
message: graphError?.message,
|
|
420
|
+
});
|
|
421
|
+
}
|
|
422
|
+
// Note: AT Protocol integration removed
|
|
423
|
+
// Generate post URI for response
|
|
424
|
+
const baseUrl = new URL(request.url).origin;
|
|
425
|
+
let postUri = `${baseUrl}/api/posts/${post.id}`;
|
|
426
|
+
// Create ActivityPub activity for the post (async, don't block response)
|
|
427
|
+
// Only create if author has ActivityPub fields set
|
|
428
|
+
// Import database helpers once for this function
|
|
429
|
+
const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
430
|
+
const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
431
|
+
const { sharedDatabaseConnectionManager } = dbManager;
|
|
432
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
|
|
433
|
+
// Fetch full post and author with ActivityPub fields
|
|
434
|
+
const postWithAuthor = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
435
|
+
return await db.post.findUnique({
|
|
436
|
+
where: { id: post.id },
|
|
437
|
+
include: {
|
|
438
|
+
author: {
|
|
439
|
+
select: {
|
|
440
|
+
id: true,
|
|
441
|
+
username: true,
|
|
442
|
+
actorUri: true,
|
|
443
|
+
inboxUrl: true,
|
|
444
|
+
outboxUrl: true,
|
|
445
|
+
publicKey: true,
|
|
446
|
+
},
|
|
447
|
+
},
|
|
448
|
+
},
|
|
449
|
+
});
|
|
450
|
+
}, {
|
|
451
|
+
...QueryTimeoutPresets.STANDARD,
|
|
452
|
+
maxRetries: 2,
|
|
453
|
+
baseDelayMs: 100,
|
|
454
|
+
defaultValue: null,
|
|
455
|
+
context: {
|
|
456
|
+
operation: "createPost_fetchForActivityPub",
|
|
457
|
+
userId: session.userId,
|
|
458
|
+
postId: post.id,
|
|
459
|
+
},
|
|
460
|
+
});
|
|
461
|
+
// Create ActivityPub activity if author has ActivityPub fields
|
|
462
|
+
if (postWithAuthor?.author?.actorUri && postWithAuthor.author.publicKey) {
|
|
463
|
+
// Run ActivityPub activity creation asynchronously (don't block response)
|
|
464
|
+
// Use a separate async operation to avoid blocking the response
|
|
465
|
+
(async () => {
|
|
466
|
+
try {
|
|
467
|
+
const { PostActivityServiceFedify } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/post-service-fedify")));
|
|
468
|
+
const { DeliveryService } = await Promise.resolve().then(() => __importStar(require("./activitypub/delivery-service")));
|
|
469
|
+
const { fedifyCreateToActivityStreams } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/fedify-converters")));
|
|
470
|
+
const { UserActorDispatcher } = await Promise.resolve().then(() => __importStar(require("./activitypub/dispatchers/user-actor")));
|
|
471
|
+
// Create activity using Fedify and store in outbox
|
|
472
|
+
await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
473
|
+
// Use Fedify service for type-safe activity creation
|
|
474
|
+
const fedifyActivity = await PostActivityServiceFedify.createPostActivity(db, postWithAuthor, postWithAuthor.author, env, request.url);
|
|
475
|
+
// Convert Fedify Create to ActivityStreamsActivity format for delivery service
|
|
476
|
+
// (Delivery service stores activities in database, which requires plain objects)
|
|
477
|
+
// Re-create the note and get URIs to pass to converter (Fedify doesn't expose properties directly)
|
|
478
|
+
const note = await PostActivityServiceFedify.createNote(postWithAuthor, postWithAuthor.author, env, request.url);
|
|
479
|
+
const uris = PostActivityServiceFedify.generatePostUris(postWithAuthor.id, env, request.url);
|
|
480
|
+
const actorUri = UserActorDispatcher.generateActorUri(postWithAuthor.author.username || "", env);
|
|
481
|
+
const activityForDelivery = fedifyCreateToActivityStreams(fedifyActivity, note, actorUri, uris.activityId.toString(), uris.objectId.toString());
|
|
482
|
+
// Deliver to recipients (async, don't block)
|
|
483
|
+
DeliveryService.deliverPost(db, activityForDelivery, postWithAuthor, postWithAuthor.author, env, request.url, this.logger).catch((error) => {
|
|
484
|
+
// Log error but don't fail
|
|
485
|
+
this.logger.error("[PostHandler] ActivityPub delivery failed:", error);
|
|
486
|
+
});
|
|
487
|
+
}, {
|
|
488
|
+
...QueryTimeoutPresets.STANDARD,
|
|
489
|
+
maxRetries: 2,
|
|
490
|
+
baseDelayMs: 100,
|
|
491
|
+
context: {
|
|
492
|
+
operation: "createPost_activityPub",
|
|
493
|
+
userId: session.userId,
|
|
494
|
+
postId: post.id,
|
|
495
|
+
},
|
|
496
|
+
});
|
|
497
|
+
}
|
|
498
|
+
catch (error) {
|
|
499
|
+
// Log error but don't fail post creation if ActivityPub fails
|
|
500
|
+
this.logger.error("[PostHandler] ActivityPub activity creation failed:", error);
|
|
501
|
+
}
|
|
502
|
+
})();
|
|
503
|
+
}
|
|
504
|
+
// Invalidate feed cache
|
|
505
|
+
await this.invalidateFeedCache(env);
|
|
506
|
+
// Fetch tagged entities for response
|
|
507
|
+
let taggedEntities;
|
|
508
|
+
if (entityRefs.length > 0) {
|
|
509
|
+
const db = data_router_1.DataRouter.getDatabaseForRegion(region, env, request, session.userId);
|
|
510
|
+
// Fetch tagged entities with timeout/retry
|
|
511
|
+
// Use already imported helpers
|
|
512
|
+
const postWithEntities = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
513
|
+
return await db.post.findUnique({
|
|
514
|
+
where: { id: post.id },
|
|
515
|
+
include: {
|
|
516
|
+
subjectEntities: {
|
|
517
|
+
include: {
|
|
518
|
+
entity: {
|
|
519
|
+
select: {
|
|
520
|
+
id: true,
|
|
521
|
+
name: true,
|
|
522
|
+
entityType: true,
|
|
523
|
+
},
|
|
524
|
+
},
|
|
525
|
+
},
|
|
526
|
+
},
|
|
527
|
+
},
|
|
528
|
+
});
|
|
529
|
+
}, {
|
|
530
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
531
|
+
maxRetries: 3,
|
|
532
|
+
baseDelayMs: 100,
|
|
533
|
+
context: {
|
|
534
|
+
operation: "createPost_fetchTaggedEntities",
|
|
535
|
+
userId: session.userId,
|
|
536
|
+
postId: post.id,
|
|
537
|
+
},
|
|
538
|
+
});
|
|
539
|
+
if (postWithEntities?.subjectEntities) {
|
|
540
|
+
taggedEntities = postWithEntities.subjectEntities.map((te) => ({
|
|
541
|
+
id: te.entity.id,
|
|
542
|
+
name: te.entity.name,
|
|
543
|
+
entityType: te.entity.entityType || undefined,
|
|
544
|
+
}));
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
// Fetch media for response
|
|
548
|
+
let mediaResponse;
|
|
549
|
+
if (body.media && body.media.length > 0) {
|
|
550
|
+
const postWithMedia = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
551
|
+
return await db.post.findUnique({
|
|
552
|
+
where: { id: post.id },
|
|
553
|
+
include: {
|
|
554
|
+
media: {
|
|
555
|
+
include: {
|
|
556
|
+
media: true,
|
|
557
|
+
},
|
|
558
|
+
orderBy: {
|
|
559
|
+
order: "asc",
|
|
560
|
+
},
|
|
561
|
+
},
|
|
562
|
+
},
|
|
563
|
+
});
|
|
564
|
+
}, {
|
|
565
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
566
|
+
maxRetries: 3,
|
|
567
|
+
baseDelayMs: 100,
|
|
568
|
+
context: {
|
|
569
|
+
operation: "createPost_fetchMedia",
|
|
570
|
+
userId: session.userId,
|
|
571
|
+
postId: post.id,
|
|
572
|
+
},
|
|
573
|
+
});
|
|
574
|
+
if (postWithMedia?.media) {
|
|
575
|
+
mediaResponse = postWithMedia.media.map((pm) => ({
|
|
576
|
+
id: pm.id,
|
|
577
|
+
mediaId: pm.mediaId,
|
|
578
|
+
alt: pm.alt || null,
|
|
579
|
+
order: pm.order,
|
|
580
|
+
file: {
|
|
581
|
+
id: pm.media.id,
|
|
582
|
+
contentHash: pm.media.contentHash,
|
|
583
|
+
mimeType: pm.media.mimeType,
|
|
584
|
+
originalKey: pm.media.originalKey,
|
|
585
|
+
thumbnailKey: pm.media.thumbnailKey || null,
|
|
586
|
+
optimizedKey: pm.media.optimizedKey || null,
|
|
587
|
+
width: pm.media.width || null,
|
|
588
|
+
height: pm.media.height || null,
|
|
589
|
+
},
|
|
590
|
+
}));
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
// Fetch link checks for response
|
|
594
|
+
let linksResponse;
|
|
595
|
+
if (linkChecks.length > 0) {
|
|
596
|
+
try {
|
|
597
|
+
const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
|
|
598
|
+
const db = getWrappedDatabase(region, env, request);
|
|
599
|
+
const linkChecksFromDb = await db.linkCheck.findMany({
|
|
600
|
+
where: { postId: post.id },
|
|
601
|
+
select: {
|
|
602
|
+
id: true,
|
|
603
|
+
originalUrl: true,
|
|
604
|
+
normalizedUrl: true,
|
|
605
|
+
domain: true,
|
|
606
|
+
status: true,
|
|
607
|
+
},
|
|
608
|
+
});
|
|
609
|
+
linksResponse = linkChecksFromDb.map((lc) => ({
|
|
610
|
+
id: lc.id,
|
|
611
|
+
originalUrl: lc.originalUrl,
|
|
612
|
+
normalizedUrl: lc.normalizedUrl,
|
|
613
|
+
domain: lc.domain,
|
|
614
|
+
status: lc.status,
|
|
615
|
+
}));
|
|
616
|
+
}
|
|
617
|
+
catch (error) {
|
|
618
|
+
// If fetching link checks fails, just continue without them
|
|
619
|
+
this.logger.error("Error fetching link checks for response:", error);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
// Fetch taxonomy tags for response
|
|
623
|
+
let taxonomyTagsResponse;
|
|
624
|
+
if (taxonomyTags.length > 0) {
|
|
625
|
+
try {
|
|
626
|
+
const { TaxonomyHandler } = await Promise.resolve().then(() => __importStar(require("./taxonomy-handler")));
|
|
627
|
+
const { getRequestContext } = await Promise.resolve().then(() => __importStar(require("./tenant-context")));
|
|
628
|
+
const { createRequestContext } = await Promise.resolve().then(() => __importStar(require("./request-context")));
|
|
629
|
+
const { getWrappedDatabase } = await Promise.resolve().then(() => __importStar(require("./database-wrapper-helper")));
|
|
630
|
+
const ctx = await createRequestContext(request, env);
|
|
631
|
+
const tenantCtx = await getRequestContext(request, ctx.session || null);
|
|
632
|
+
const tenantId = tenantCtx.tenant?.id || "trellis";
|
|
633
|
+
const db = getWrappedDatabase(region, env, request);
|
|
634
|
+
const taxonomyHandler = new TaxonomyHandler(db, tenantId, env.TAXONOMY_CACHE_KV);
|
|
635
|
+
const tags = await taxonomyHandler.getPostTaxonomyTags(post.id);
|
|
636
|
+
taxonomyTagsResponse = tags.map((t) => ({
|
|
637
|
+
taxonId: t.taxonId,
|
|
638
|
+
displayName: t.displayName,
|
|
639
|
+
description: t.description,
|
|
640
|
+
}));
|
|
641
|
+
}
|
|
642
|
+
catch (error) {
|
|
643
|
+
// If fetching tags fails, just continue without them
|
|
644
|
+
this.logger.error("Error fetching taxonomy tags for response:", error);
|
|
645
|
+
}
|
|
646
|
+
}
|
|
647
|
+
// Note: post.createdAt may not be available from DataRouter return type
|
|
648
|
+
// We'll use current timestamp as fallback
|
|
649
|
+
const createdAt = post.createdAt
|
|
650
|
+
? new Date(post.createdAt).toISOString()
|
|
651
|
+
: new Date().toISOString();
|
|
652
|
+
// Fetch author information for response - with timeout/retry
|
|
653
|
+
// Use already imported helpers
|
|
654
|
+
const author = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
655
|
+
return await db.user.findUnique({
|
|
656
|
+
where: { id: session.userId },
|
|
657
|
+
select: {
|
|
658
|
+
id: true,
|
|
659
|
+
email: true,
|
|
660
|
+
username: true,
|
|
661
|
+
},
|
|
662
|
+
});
|
|
663
|
+
}, {
|
|
664
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
665
|
+
maxRetries: 3,
|
|
666
|
+
baseDelayMs: 100,
|
|
667
|
+
context: {
|
|
668
|
+
operation: "createPost_fetchAuthor",
|
|
669
|
+
userId: session.userId,
|
|
670
|
+
},
|
|
671
|
+
});
|
|
672
|
+
// Build response with all required fields for PostModel
|
|
673
|
+
const responseData = {
|
|
674
|
+
id: post.id,
|
|
675
|
+
uri: postUri, // PostModel requires uri to be a non-null string
|
|
676
|
+
text: body.text.trim(),
|
|
677
|
+
visibility: body.visibility,
|
|
678
|
+
createdAt, // ISO 8601 string format
|
|
679
|
+
author: author
|
|
680
|
+
? {
|
|
681
|
+
actorUri: author.id, // PostModel expects actorUri, not did
|
|
682
|
+
handle: author.username || author.email.split("@")[0],
|
|
683
|
+
}
|
|
684
|
+
: {
|
|
685
|
+
actorUri: session.userId, // PostModel expects actorUri, not did
|
|
686
|
+
handle: session.email.split("@")[0],
|
|
687
|
+
},
|
|
688
|
+
sentimentCounts: {
|
|
689
|
+
joy: 0,
|
|
690
|
+
love: 0,
|
|
691
|
+
calm: 0,
|
|
692
|
+
sad: 0,
|
|
693
|
+
angry: 0,
|
|
694
|
+
fear: 0,
|
|
695
|
+
surprise: 0,
|
|
696
|
+
disgust: 0,
|
|
697
|
+
neutral: 0,
|
|
698
|
+
excited: 0,
|
|
699
|
+
grateful: 0,
|
|
700
|
+
},
|
|
701
|
+
commentCount: 0,
|
|
702
|
+
contentWarnings: body.contentWarnings || [],
|
|
703
|
+
};
|
|
704
|
+
// Add optional fields if present
|
|
705
|
+
if (taggedEntities && taggedEntities.length > 0) {
|
|
706
|
+
responseData.taggedEntities = taggedEntities;
|
|
707
|
+
}
|
|
708
|
+
if (taxonomyTagsResponse && taxonomyTagsResponse.length > 0) {
|
|
709
|
+
responseData.taxonomyTags = taxonomyTagsResponse;
|
|
710
|
+
}
|
|
711
|
+
if (body.geoData) {
|
|
712
|
+
responseData.geoData = body.geoData;
|
|
713
|
+
}
|
|
714
|
+
if (linksResponse && linksResponse.length > 0) {
|
|
715
|
+
responseData.links = linksResponse;
|
|
716
|
+
}
|
|
717
|
+
if (mediaResponse && mediaResponse.length > 0) {
|
|
718
|
+
responseData.media = mediaResponse;
|
|
719
|
+
}
|
|
720
|
+
// Log response data for debugging (always log in dev, use info level so it shows up)
|
|
721
|
+
try {
|
|
722
|
+
const responseBody = JSON.stringify(responseData);
|
|
723
|
+
// Log full response in dev environment for debugging
|
|
724
|
+
if (env.ENVIRONMENT === "dev") {
|
|
725
|
+
this.logger.info("[PostHandler] Post creation response:", {
|
|
726
|
+
postId: responseData.id,
|
|
727
|
+
hasAuthor: !!responseData.author,
|
|
728
|
+
hasSentimentCounts: !!responseData.sentimentCounts,
|
|
729
|
+
uri: responseData.uri,
|
|
730
|
+
responseSize: responseBody.length,
|
|
731
|
+
fullResponse: responseBody, // Log full response for debugging
|
|
732
|
+
});
|
|
733
|
+
}
|
|
734
|
+
return new Response(responseBody, {
|
|
735
|
+
status: 201,
|
|
736
|
+
headers: { "content-type": "application/json" },
|
|
737
|
+
});
|
|
738
|
+
}
|
|
739
|
+
catch (serializationError) {
|
|
740
|
+
this.logger.error("[PostHandler] Failed to serialize response:", {
|
|
741
|
+
message: serializationError.message,
|
|
742
|
+
stack: serializationError.stack,
|
|
743
|
+
responseDataKeys: Object.keys(responseData),
|
|
744
|
+
postId: responseData.id,
|
|
745
|
+
});
|
|
746
|
+
// Return error response instead of throwing
|
|
747
|
+
return new Response(JSON.stringify({
|
|
748
|
+
error: "Failed to serialize response",
|
|
749
|
+
postId: responseData.id,
|
|
750
|
+
}), { status: 500, headers: { "content-type": "application/json" } });
|
|
751
|
+
}
|
|
752
|
+
}
|
|
753
|
+
catch (error) {
|
|
754
|
+
// Safely log error (handle Symbols and non-serializable values)
|
|
755
|
+
try {
|
|
756
|
+
const errorMessage = error?.message || String(error);
|
|
757
|
+
const errorStack = error?.stack;
|
|
758
|
+
this.logger.error("Error creating post:", {
|
|
759
|
+
message: errorMessage,
|
|
760
|
+
stack: errorStack,
|
|
761
|
+
name: error?.name,
|
|
762
|
+
code: error?.code,
|
|
763
|
+
});
|
|
764
|
+
}
|
|
765
|
+
catch (logError) {
|
|
766
|
+
// If even logging fails, use a fallback
|
|
767
|
+
this.logger.error("Error creating post: [Unable to serialize error]");
|
|
768
|
+
}
|
|
769
|
+
// Handle entity tagging errors with proper status codes
|
|
770
|
+
const { EntityTaggingError } = await Promise.resolve().then(() => __importStar(require("./entity-tagging-errors")));
|
|
771
|
+
if (error instanceof EntityTaggingError) {
|
|
772
|
+
return new Response(JSON.stringify({
|
|
773
|
+
error: error.code,
|
|
774
|
+
message: error.message,
|
|
775
|
+
}), {
|
|
776
|
+
status: error.statusCode,
|
|
777
|
+
headers: { "content-type": "application/json" },
|
|
778
|
+
});
|
|
779
|
+
}
|
|
780
|
+
// Generic error handling
|
|
781
|
+
// In dev/test environments, include error details for debugging
|
|
782
|
+
const environment = (env.ENVIRONMENT ||
|
|
783
|
+
env.DEPLOY_ENV ||
|
|
784
|
+
"dev").toLowerCase();
|
|
785
|
+
const isDevOrTest = environment === "dev" ||
|
|
786
|
+
environment === "test" ||
|
|
787
|
+
env.CI === "true";
|
|
788
|
+
const errorResponse = { error: "Failed to create post" };
|
|
789
|
+
if (isDevOrTest) {
|
|
790
|
+
// Include error details in dev/test for debugging
|
|
791
|
+
errorResponse.details = {
|
|
792
|
+
message: error?.message || String(error),
|
|
793
|
+
name: error?.name,
|
|
794
|
+
code: error?.code,
|
|
795
|
+
// Don't include stack trace in response (security)
|
|
796
|
+
};
|
|
797
|
+
}
|
|
798
|
+
return new Response(JSON.stringify(errorResponse), {
|
|
799
|
+
status: 500,
|
|
800
|
+
headers: { "content-type": "application/json" },
|
|
801
|
+
});
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
/**
|
|
805
|
+
* Delete a post (soft delete)
|
|
806
|
+
*
|
|
807
|
+
* PREPARATORY: Uses DataRouter to validate region before deletion.
|
|
808
|
+
*/
|
|
809
|
+
async deletePost(postId, request, session, env, requestContext) {
|
|
810
|
+
try {
|
|
811
|
+
const requestId = (0, logger_1.generateRequestId)();
|
|
812
|
+
const region = requestContext.region;
|
|
813
|
+
// PREPARATORY: Verify post exists in correct region using DataRouter
|
|
814
|
+
const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
|
|
815
|
+
if (!post) {
|
|
816
|
+
return new Response(JSON.stringify({ error: "Post not found" }), {
|
|
817
|
+
status: 404,
|
|
818
|
+
headers: { "content-type": "application/json" },
|
|
819
|
+
});
|
|
820
|
+
}
|
|
821
|
+
if (post.authorId !== session.userId) {
|
|
822
|
+
return new Response(JSON.stringify({ error: "Forbidden" }), {
|
|
823
|
+
status: 403,
|
|
824
|
+
headers: { "content-type": "application/json" },
|
|
825
|
+
});
|
|
826
|
+
}
|
|
827
|
+
// Use DataRouter to get database for region, then update directly
|
|
828
|
+
// (DataRouter doesn't have update methods yet, but we've validated region)
|
|
829
|
+
const db = data_router_1.DataRouter.getDatabaseForRegion(region, env, request, session?.userId);
|
|
830
|
+
// Check if already deleted - with timeout/retry
|
|
831
|
+
const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
832
|
+
const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
833
|
+
const { sharedDatabaseConnectionManager } = dbManager;
|
|
834
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
|
|
835
|
+
const existingPost = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
836
|
+
return await db.post.findUnique({
|
|
837
|
+
where: { id: postId },
|
|
838
|
+
select: { deletedAt: true },
|
|
839
|
+
});
|
|
840
|
+
}, {
|
|
841
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
842
|
+
maxRetries: 3,
|
|
843
|
+
baseDelayMs: 100,
|
|
844
|
+
context: {
|
|
845
|
+
operation: "deletePost_checkDeleted",
|
|
846
|
+
userId: session.userId,
|
|
847
|
+
postId,
|
|
848
|
+
},
|
|
849
|
+
});
|
|
850
|
+
if (existingPost?.deletedAt) {
|
|
851
|
+
return new Response(JSON.stringify({ error: "Post already deleted" }), {
|
|
852
|
+
status: 410,
|
|
853
|
+
headers: { "content-type": "application/json" },
|
|
854
|
+
});
|
|
855
|
+
}
|
|
856
|
+
// Soft delete - with timeout/retry
|
|
857
|
+
await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
858
|
+
return await db.post.update({
|
|
859
|
+
where: { id: postId },
|
|
860
|
+
data: { deletedAt: new Date() },
|
|
861
|
+
});
|
|
862
|
+
}, {
|
|
863
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
864
|
+
maxRetries: 3,
|
|
865
|
+
baseDelayMs: 100,
|
|
866
|
+
context: {
|
|
867
|
+
operation: "deletePost",
|
|
868
|
+
userId: session.userId,
|
|
869
|
+
postId,
|
|
870
|
+
},
|
|
871
|
+
});
|
|
872
|
+
// Note: AT Protocol integration removed
|
|
873
|
+
// Graph sync: remove post from graph database
|
|
874
|
+
try {
|
|
875
|
+
const { createGraphServiceFromEnv } = await Promise.resolve().then(() => __importStar(require("./graph")));
|
|
876
|
+
const graphService = await createGraphServiceFromEnv(env);
|
|
877
|
+
await graphService.removePost(postId);
|
|
878
|
+
}
|
|
879
|
+
catch (graphError) {
|
|
880
|
+
this.logger.error("[PostHandler] Graph sync failed for post deletion (non-fatal):", {
|
|
881
|
+
postId,
|
|
882
|
+
message: graphError?.message,
|
|
883
|
+
});
|
|
884
|
+
}
|
|
885
|
+
// Invalidate feed cache
|
|
886
|
+
await this.invalidateFeedCache(env);
|
|
887
|
+
return new Response(JSON.stringify({ success: true, message: "Post deleted successfully" }), { status: 200, headers: { "content-type": "application/json" } });
|
|
888
|
+
}
|
|
889
|
+
catch (error) {
|
|
890
|
+
this.logger.error("Error deleting post:", error);
|
|
891
|
+
return new Response(JSON.stringify({ error: "Failed to delete post" }), {
|
|
892
|
+
status: 500,
|
|
893
|
+
headers: { "content-type": "application/json" },
|
|
894
|
+
});
|
|
895
|
+
}
|
|
896
|
+
}
|
|
897
|
+
/**
|
|
898
|
+
* Edit an existing post
|
|
899
|
+
*
|
|
900
|
+
* PREPARATORY: Uses DataRouter to validate region before editing.
|
|
901
|
+
*
|
|
902
|
+
* Requirements:
|
|
903
|
+
* - 4.1: PATCH /api/posts/:postId endpoint
|
|
904
|
+
* - 4.2: Update post text and media
|
|
905
|
+
* - 4.3: Set editedAt timestamp
|
|
906
|
+
* - 4.4, 4.5: Validate input (text required, max 3000 chars)
|
|
907
|
+
* - 4.6: Return 401 if not authenticated
|
|
908
|
+
* - 4.7: Return 403 if not post owner
|
|
909
|
+
* - 4.8: Return 404 if post not found
|
|
910
|
+
* - 5.1-5.4: Content moderation on edited content
|
|
911
|
+
* - 6.1-6.4: ActivityPub sync for public posts
|
|
912
|
+
* - 7.1-7.3: Cache invalidation
|
|
913
|
+
*/
|
|
914
|
+
async editPost(postId, request, session, env, requestContext) {
|
|
915
|
+
try {
|
|
916
|
+
// Validate request body with Zod schema
|
|
917
|
+
const { validateRequest } = await Promise.resolve().then(() => __importStar(require("./validate-request")));
|
|
918
|
+
const { editPostSchema } = await Promise.resolve().then(() => __importStar(require("./schemas")));
|
|
919
|
+
const validation = await validateRequest(request, editPostSchema);
|
|
920
|
+
if (!validation.success) {
|
|
921
|
+
return validation.error;
|
|
922
|
+
}
|
|
923
|
+
const body = validation.data;
|
|
924
|
+
const requestId = (0, logger_1.generateRequestId)();
|
|
925
|
+
const region = requestContext.region;
|
|
926
|
+
// Verify post exists in correct region using DataRouter
|
|
927
|
+
const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
|
|
928
|
+
if (!post) {
|
|
929
|
+
return new Response(JSON.stringify({ error: "Post not found" }), {
|
|
930
|
+
status: 404,
|
|
931
|
+
headers: { "content-type": "application/json" },
|
|
932
|
+
});
|
|
933
|
+
}
|
|
934
|
+
// Authorization check - only post owner can edit
|
|
935
|
+
if (post.authorId !== session.userId) {
|
|
936
|
+
return new Response(JSON.stringify({
|
|
937
|
+
error: "Forbidden",
|
|
938
|
+
message: "You can only edit your own posts",
|
|
939
|
+
}), {
|
|
940
|
+
status: 403,
|
|
941
|
+
headers: { "content-type": "application/json" },
|
|
942
|
+
});
|
|
943
|
+
}
|
|
944
|
+
// Check if post is deleted
|
|
945
|
+
if (post.deletedAt) {
|
|
946
|
+
return new Response(JSON.stringify({ error: "Cannot edit a deleted post" }), {
|
|
947
|
+
status: 410,
|
|
948
|
+
headers: { "content-type": "application/json" },
|
|
949
|
+
});
|
|
950
|
+
}
|
|
951
|
+
// Check if content moderation is enabled via feature toggle
|
|
952
|
+
const { FeatureToggleService } = await Promise.resolve().then(() => __importStar(require("./feature-toggle-service")));
|
|
953
|
+
const { createPrisma } = await Promise.resolve().then(() => __importStar(require("../db")));
|
|
954
|
+
const db = createPrisma(env);
|
|
955
|
+
const toggleService = new FeatureToggleService(db, env);
|
|
956
|
+
const moderationEnabled = await toggleService.isEnabled("content_moderation_enabled");
|
|
957
|
+
// Content moderation on edited text (if moderation is enabled)
|
|
958
|
+
if (moderationEnabled) {
|
|
959
|
+
const moderationResult = await this.moderationHandler.moderateText(body.text, env);
|
|
960
|
+
if (!moderationResult.approved) {
|
|
961
|
+
return new Response(JSON.stringify({
|
|
962
|
+
error: "CONTENT_REJECTED",
|
|
963
|
+
message: "Your edited post contains inappropriate content. Please be more constructive.",
|
|
964
|
+
score: moderationResult.score,
|
|
965
|
+
details: moderationResult.details,
|
|
966
|
+
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
967
|
+
}
|
|
968
|
+
}
|
|
969
|
+
else {
|
|
970
|
+
logger_1.Logger.getInstance(env).debug("[PostHandler] Content moderation is disabled via feature toggle (edit post)");
|
|
971
|
+
}
|
|
972
|
+
// Check for malicious links in edited content
|
|
973
|
+
const { LinkSecurityHandler, LinkStatus } = await Promise.resolve().then(() => __importStar(require("./link-security-handler")));
|
|
974
|
+
const linkSecurityHandler = new LinkSecurityHandler(env);
|
|
975
|
+
const urls = linkSecurityHandler.extractUrls(body.text);
|
|
976
|
+
let hasBlockedLinks = false;
|
|
977
|
+
for (const url of urls) {
|
|
978
|
+
const linkValidation = linkSecurityHandler.validateUrlSync(url);
|
|
979
|
+
if (linkValidation.status === LinkStatus.BLOCKED) {
|
|
980
|
+
hasBlockedLinks = true;
|
|
981
|
+
this.logger.warn(`Blocked dangerous URL in post edit: ${url}`, {
|
|
982
|
+
reason: linkValidation.reason,
|
|
983
|
+
userId: session.userId,
|
|
984
|
+
postId,
|
|
985
|
+
});
|
|
986
|
+
break;
|
|
987
|
+
}
|
|
988
|
+
}
|
|
989
|
+
if (hasBlockedLinks) {
|
|
990
|
+
return new Response(JSON.stringify({
|
|
991
|
+
error: "DANGEROUS_LINKS_DETECTED",
|
|
992
|
+
message: "Your edited post contains dangerous or blocked links. Please remove them and try again.",
|
|
993
|
+
}), { status: 400, headers: { "content-type": "application/json" } });
|
|
994
|
+
}
|
|
995
|
+
// Sanitize user input to prevent XSS
|
|
996
|
+
const { InputSanitizer } = await Promise.resolve().then(() => __importStar(require("./input-sanitizer")));
|
|
997
|
+
const sanitizedText = InputSanitizer.sanitizeText(body.text);
|
|
998
|
+
// Update post in database with timeout/retry
|
|
999
|
+
const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
1000
|
+
const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
1001
|
+
const { sharedDatabaseConnectionManager } = dbManager;
|
|
1002
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
|
|
1003
|
+
const updatedPost = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1004
|
+
const updateData = {
|
|
1005
|
+
text: sanitizedText.trim(),
|
|
1006
|
+
editedAt: new Date(),
|
|
1007
|
+
hasBlockedLinks: false, // Reset since we validated
|
|
1008
|
+
};
|
|
1009
|
+
// Update visibility if provided
|
|
1010
|
+
if (body.visibility) {
|
|
1011
|
+
// Convert visibility to Prisma enum format
|
|
1012
|
+
// API accepts: "public", "friends-only", "private"
|
|
1013
|
+
// Prisma expects: "PUBLIC", "FRIENDS", "PRIVATE"
|
|
1014
|
+
let visibility = body.visibility.toUpperCase();
|
|
1015
|
+
if (visibility === "FRIENDS-ONLY" ||
|
|
1016
|
+
visibility === "FRIENDS_ONLY") {
|
|
1017
|
+
visibility = "FRIENDS";
|
|
1018
|
+
}
|
|
1019
|
+
updateData.visibility = visibility;
|
|
1020
|
+
}
|
|
1021
|
+
return await db.post.update({
|
|
1022
|
+
where: { id: postId },
|
|
1023
|
+
data: updateData,
|
|
1024
|
+
include: {
|
|
1025
|
+
author: {
|
|
1026
|
+
select: {
|
|
1027
|
+
id: true,
|
|
1028
|
+
email: true,
|
|
1029
|
+
username: true,
|
|
1030
|
+
actorUri: true,
|
|
1031
|
+
publicKey: true,
|
|
1032
|
+
},
|
|
1033
|
+
},
|
|
1034
|
+
media: {
|
|
1035
|
+
include: {
|
|
1036
|
+
media: true,
|
|
1037
|
+
},
|
|
1038
|
+
},
|
|
1039
|
+
},
|
|
1040
|
+
});
|
|
1041
|
+
}, {
|
|
1042
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
1043
|
+
maxRetries: 3,
|
|
1044
|
+
baseDelayMs: 100,
|
|
1045
|
+
context: {
|
|
1046
|
+
operation: "editPost",
|
|
1047
|
+
userId: session.userId,
|
|
1048
|
+
postId,
|
|
1049
|
+
},
|
|
1050
|
+
});
|
|
1051
|
+
// ActivityPub sync for public posts only
|
|
1052
|
+
if (updatedPost.radius === "SHOUT" &&
|
|
1053
|
+
updatedPost.author?.actorUri &&
|
|
1054
|
+
updatedPost.author?.publicKey) {
|
|
1055
|
+
// Run ActivityPub update asynchronously (don't block response)
|
|
1056
|
+
(async () => {
|
|
1057
|
+
try {
|
|
1058
|
+
const { PostActivityServiceFedify } = await Promise.resolve().then(() => __importStar(require("./activitypub/services/post-service-fedify")));
|
|
1059
|
+
const { DeliveryService } = await Promise.resolve().then(() => __importStar(require("./activitypub/delivery-service")));
|
|
1060
|
+
// Send Update activity to followers
|
|
1061
|
+
await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1062
|
+
// Create Update activity for the edited post
|
|
1063
|
+
await PostActivityServiceFedify.createUpdateActivity(db, updatedPost, updatedPost.author, env, request.url);
|
|
1064
|
+
}, {
|
|
1065
|
+
...QueryTimeoutPresets.STANDARD,
|
|
1066
|
+
maxRetries: 2,
|
|
1067
|
+
baseDelayMs: 100,
|
|
1068
|
+
context: {
|
|
1069
|
+
operation: "editPost_activityPub",
|
|
1070
|
+
userId: session.userId,
|
|
1071
|
+
postId,
|
|
1072
|
+
},
|
|
1073
|
+
});
|
|
1074
|
+
}
|
|
1075
|
+
catch (error) {
|
|
1076
|
+
// Log error but don't fail the edit if ActivityPub fails
|
|
1077
|
+
this.logger.error("[PostHandler] ActivityPub update failed for edited post:", error);
|
|
1078
|
+
}
|
|
1079
|
+
})();
|
|
1080
|
+
}
|
|
1081
|
+
// Invalidate caches
|
|
1082
|
+
await this.invalidateFeedCache(env);
|
|
1083
|
+
await this.invalidatePostCache(postId, env);
|
|
1084
|
+
// Fetch sentiment counts for the post
|
|
1085
|
+
const sentiments = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1086
|
+
return await db.postSentiment.groupBy({
|
|
1087
|
+
by: ["sentiment"],
|
|
1088
|
+
where: { postId },
|
|
1089
|
+
_count: true,
|
|
1090
|
+
});
|
|
1091
|
+
}, {
|
|
1092
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
1093
|
+
maxRetries: 2,
|
|
1094
|
+
baseDelayMs: 50,
|
|
1095
|
+
context: {
|
|
1096
|
+
operation: "editPost_getSentiments",
|
|
1097
|
+
postId,
|
|
1098
|
+
},
|
|
1099
|
+
});
|
|
1100
|
+
const sentimentCounts = {
|
|
1101
|
+
joy: 0,
|
|
1102
|
+
love: 0,
|
|
1103
|
+
calm: 0,
|
|
1104
|
+
sad: 0,
|
|
1105
|
+
angry: 0,
|
|
1106
|
+
fear: 0,
|
|
1107
|
+
surprise: 0,
|
|
1108
|
+
disgust: 0,
|
|
1109
|
+
neutral: 0,
|
|
1110
|
+
excited: 0,
|
|
1111
|
+
grateful: 0,
|
|
1112
|
+
};
|
|
1113
|
+
for (const s of sentiments) {
|
|
1114
|
+
sentimentCounts[s.sentiment] = s._count;
|
|
1115
|
+
}
|
|
1116
|
+
// Fetch comment count for the post
|
|
1117
|
+
const commentCount = await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1118
|
+
return await db.postComment.count({
|
|
1119
|
+
where: { postId },
|
|
1120
|
+
});
|
|
1121
|
+
}, {
|
|
1122
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
1123
|
+
maxRetries: 2,
|
|
1124
|
+
baseDelayMs: 50,
|
|
1125
|
+
context: {
|
|
1126
|
+
operation: "editPost_getCommentCount",
|
|
1127
|
+
postId,
|
|
1128
|
+
},
|
|
1129
|
+
});
|
|
1130
|
+
// Build response with all required fields for PostModel
|
|
1131
|
+
const responseData = {
|
|
1132
|
+
id: updatedPost.id,
|
|
1133
|
+
uri: updatedPost.uri || "",
|
|
1134
|
+
text: updatedPost.text,
|
|
1135
|
+
visibility: updatedPost.radius?.toLowerCase() || "normal",
|
|
1136
|
+
createdAt: updatedPost.createdAt.toISOString(),
|
|
1137
|
+
editedAt: updatedPost.editedAt?.toISOString() || null,
|
|
1138
|
+
author: {
|
|
1139
|
+
actorUri: updatedPost.author?.actorUri ||
|
|
1140
|
+
updatedPost.author?.id ||
|
|
1141
|
+
session.userId,
|
|
1142
|
+
handle: updatedPost.author?.username ||
|
|
1143
|
+
updatedPost.author?.email?.split("@")[0] ||
|
|
1144
|
+
session.email.split("@")[0],
|
|
1145
|
+
},
|
|
1146
|
+
sentimentCounts: {
|
|
1147
|
+
joy: sentimentCounts.joy || 0,
|
|
1148
|
+
love: sentimentCounts.love || 0,
|
|
1149
|
+
calm: sentimentCounts.calm || 0,
|
|
1150
|
+
sad: sentimentCounts.sad || 0,
|
|
1151
|
+
angry: sentimentCounts.angry || 0,
|
|
1152
|
+
fear: sentimentCounts.fear || 0,
|
|
1153
|
+
surprise: sentimentCounts.surprise || 0,
|
|
1154
|
+
disgust: sentimentCounts.disgust || 0,
|
|
1155
|
+
neutral: sentimentCounts.neutral || 0,
|
|
1156
|
+
excited: sentimentCounts.excited || 0,
|
|
1157
|
+
grateful: sentimentCounts.grateful || 0,
|
|
1158
|
+
},
|
|
1159
|
+
commentCount,
|
|
1160
|
+
contentWarnings: updatedPost.contentWarnings || [],
|
|
1161
|
+
media: updatedPost.media?.map((pm) => ({
|
|
1162
|
+
id: pm.id,
|
|
1163
|
+
mediaId: pm.mediaId,
|
|
1164
|
+
alt: pm.alt || null,
|
|
1165
|
+
order: pm.order,
|
|
1166
|
+
file: {
|
|
1167
|
+
id: pm.media.id,
|
|
1168
|
+
contentHash: pm.media.contentHash,
|
|
1169
|
+
mimeType: pm.media.mimeType,
|
|
1170
|
+
originalKey: pm.media.originalKey,
|
|
1171
|
+
thumbnailKey: pm.media.thumbnailKey || null,
|
|
1172
|
+
optimizedKey: pm.media.optimizedKey || null,
|
|
1173
|
+
width: pm.media.width || null,
|
|
1174
|
+
height: pm.media.height || null,
|
|
1175
|
+
},
|
|
1176
|
+
})) || [],
|
|
1177
|
+
};
|
|
1178
|
+
return new Response(JSON.stringify(responseData), {
|
|
1179
|
+
status: 200,
|
|
1180
|
+
headers: { "content-type": "application/json" },
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
catch (error) {
|
|
1184
|
+
this.logger.error("Error editing post:", error);
|
|
1185
|
+
return new Response(JSON.stringify({ error: "Failed to edit post" }), {
|
|
1186
|
+
status: 500,
|
|
1187
|
+
headers: { "content-type": "application/json" },
|
|
1188
|
+
});
|
|
1189
|
+
}
|
|
1190
|
+
}
|
|
1191
|
+
/**
|
|
1192
|
+
* Invalidate post-specific cache entries
|
|
1193
|
+
*/
|
|
1194
|
+
async invalidatePostCache(postId, env) {
|
|
1195
|
+
const kv = env.FEED_CACHE_KV;
|
|
1196
|
+
if (!kv)
|
|
1197
|
+
return;
|
|
1198
|
+
try {
|
|
1199
|
+
// Delete post-specific cache entries
|
|
1200
|
+
const keys = [
|
|
1201
|
+
`post:${postId}`,
|
|
1202
|
+
`post:${postId}:reactions`,
|
|
1203
|
+
`post:${postId}:comments`,
|
|
1204
|
+
];
|
|
1205
|
+
await Promise.all(keys.map((key) => kv.delete(key)));
|
|
1206
|
+
}
|
|
1207
|
+
catch (error) {
|
|
1208
|
+
this.logger.error("Error invalidating post cache:", error);
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
/**
|
|
1212
|
+
* Hide a post
|
|
1213
|
+
*
|
|
1214
|
+
* PREPARATORY: Uses DataRouter to validate region before hiding.
|
|
1215
|
+
*/
|
|
1216
|
+
async hidePost(postId, request, session, env, requestContext) {
|
|
1217
|
+
try {
|
|
1218
|
+
const requestId = (0, logger_1.generateRequestId)();
|
|
1219
|
+
const region = requestContext.region;
|
|
1220
|
+
// PREPARATORY: Verify post exists in correct region using DataRouter
|
|
1221
|
+
const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
|
|
1222
|
+
if (!post) {
|
|
1223
|
+
return new Response(JSON.stringify({ error: "Post not found" }), {
|
|
1224
|
+
status: 404,
|
|
1225
|
+
headers: { "content-type": "application/json" },
|
|
1226
|
+
});
|
|
1227
|
+
}
|
|
1228
|
+
if (post.authorId !== session.userId) {
|
|
1229
|
+
return new Response(JSON.stringify({ error: "Forbidden" }), {
|
|
1230
|
+
status: 403,
|
|
1231
|
+
headers: { "content-type": "application/json" },
|
|
1232
|
+
});
|
|
1233
|
+
}
|
|
1234
|
+
// Update post with timeout/retry
|
|
1235
|
+
const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
1236
|
+
const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
1237
|
+
const { sharedDatabaseConnectionManager } = dbManager;
|
|
1238
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
|
|
1239
|
+
await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1240
|
+
return await db.post.update({
|
|
1241
|
+
where: { id: postId },
|
|
1242
|
+
data: { hiddenByAuthor: true },
|
|
1243
|
+
});
|
|
1244
|
+
}, {
|
|
1245
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
1246
|
+
maxRetries: 3,
|
|
1247
|
+
baseDelayMs: 100,
|
|
1248
|
+
context: {
|
|
1249
|
+
operation: "hidePost",
|
|
1250
|
+
userId: session.userId,
|
|
1251
|
+
postId,
|
|
1252
|
+
},
|
|
1253
|
+
});
|
|
1254
|
+
await this.invalidateFeedCache(env);
|
|
1255
|
+
return new Response(JSON.stringify({ success: true, message: "Post hidden successfully" }), { status: 200, headers: { "content-type": "application/json" } });
|
|
1256
|
+
}
|
|
1257
|
+
catch (error) {
|
|
1258
|
+
this.logger.error("Error hiding post:", error);
|
|
1259
|
+
return new Response(JSON.stringify({ error: "Failed to hide post" }), {
|
|
1260
|
+
status: 500,
|
|
1261
|
+
headers: { "content-type": "application/json" },
|
|
1262
|
+
});
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1265
|
+
/**
|
|
1266
|
+
* Unhide a post
|
|
1267
|
+
*
|
|
1268
|
+
* PREPARATORY: Uses DataRouter to validate region before unhiding.
|
|
1269
|
+
*/
|
|
1270
|
+
async unhidePost(postId, request, session, env, requestContext) {
|
|
1271
|
+
try {
|
|
1272
|
+
const requestId = (0, logger_1.generateRequestId)();
|
|
1273
|
+
const region = requestContext.region;
|
|
1274
|
+
// PREPARATORY: Verify post exists in correct region using DataRouter
|
|
1275
|
+
const post = await data_router_1.DataRouter.getPost(postId, region, env, undefined, requestId, session.userId);
|
|
1276
|
+
if (!post) {
|
|
1277
|
+
return new Response(JSON.stringify({ error: "Post not found" }), {
|
|
1278
|
+
status: 404,
|
|
1279
|
+
headers: { "content-type": "application/json" },
|
|
1280
|
+
});
|
|
1281
|
+
}
|
|
1282
|
+
if (post.authorId !== session.userId) {
|
|
1283
|
+
return new Response(JSON.stringify({ error: "Forbidden" }), {
|
|
1284
|
+
status: 403,
|
|
1285
|
+
headers: { "content-type": "application/json" },
|
|
1286
|
+
});
|
|
1287
|
+
}
|
|
1288
|
+
// Update post with timeout/retry
|
|
1289
|
+
const dbHelpers = await Promise.resolve().then(() => __importStar(require("./db-query-helper")));
|
|
1290
|
+
const dbManager = await Promise.resolve().then(() => __importStar(require("./database-connection-manager")));
|
|
1291
|
+
const { sharedDatabaseConnectionManager } = dbManager;
|
|
1292
|
+
const { withQueryTimeoutAndRetry, QueryTimeoutPresets } = dbHelpers;
|
|
1293
|
+
await withQueryTimeoutAndRetry(sharedDatabaseConnectionManager, region, env, async (db) => {
|
|
1294
|
+
return await db.post.update({
|
|
1295
|
+
where: { id: postId },
|
|
1296
|
+
data: { hiddenByAuthor: false },
|
|
1297
|
+
});
|
|
1298
|
+
}, {
|
|
1299
|
+
...QueryTimeoutPresets.USER_FACING,
|
|
1300
|
+
maxRetries: 3,
|
|
1301
|
+
baseDelayMs: 100,
|
|
1302
|
+
context: {
|
|
1303
|
+
operation: "unhidePost",
|
|
1304
|
+
userId: session.userId,
|
|
1305
|
+
postId,
|
|
1306
|
+
},
|
|
1307
|
+
});
|
|
1308
|
+
await this.invalidateFeedCache(env);
|
|
1309
|
+
return new Response(JSON.stringify({
|
|
1310
|
+
success: true,
|
|
1311
|
+
message: "Post unhidden successfully",
|
|
1312
|
+
}), { status: 200, headers: { "content-type": "application/json" } });
|
|
1313
|
+
}
|
|
1314
|
+
catch (error) {
|
|
1315
|
+
this.logger.error("Error unhiding post:", error);
|
|
1316
|
+
return new Response(JSON.stringify({ error: "Failed to unhide post" }), {
|
|
1317
|
+
status: 500,
|
|
1318
|
+
headers: { "content-type": "application/json" },
|
|
1319
|
+
});
|
|
1320
|
+
}
|
|
1321
|
+
}
|
|
1322
|
+
/**
|
|
1323
|
+
* Invalidate feed cache by incrementing version
|
|
1324
|
+
* Uses cache versioning: all cache keys include a version number,
|
|
1325
|
+
* and incrementing the version makes all old cache entries invalid.
|
|
1326
|
+
*/
|
|
1327
|
+
async invalidateFeedCache(env) {
|
|
1328
|
+
const kv = env.FEED_CACHE_KV;
|
|
1329
|
+
if (!kv)
|
|
1330
|
+
return;
|
|
1331
|
+
try {
|
|
1332
|
+
// Get current version
|
|
1333
|
+
const versionStr = await kv.get("feed:cache:version", "text");
|
|
1334
|
+
const currentVersion = versionStr ? parseInt(versionStr, 10) : 1;
|
|
1335
|
+
// Increment version - this invalidates all existing cache entries
|
|
1336
|
+
// (they use old version in their keys)
|
|
1337
|
+
const newVersion = currentVersion + 1;
|
|
1338
|
+
await kv.put("feed:cache:version", newVersion.toString());
|
|
1339
|
+
}
|
|
1340
|
+
catch (error) {
|
|
1341
|
+
this.logger.error("Error invalidating feed cache:", error);
|
|
1342
|
+
}
|
|
1343
|
+
}
|
|
1344
|
+
}
|
|
1345
|
+
exports.PostHandler = PostHandler;
|
|
1346
|
+
//# sourceMappingURL=post-handler.js.map
|