core-framework 3.2.0__tar.gz → 3.3.0__tar.gz
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.
- core_framework-3.3.0/.cursor/rules/alembic-migrations.mdc +61 -0
- core_framework-3.3.0/.cursor/rules/domain-imports.mdc +44 -0
- core_framework-3.3.0/.cursor/rules/error-boundary.mdc +56 -0
- core_framework-3.3.0/.cursor/rules/repository-schema-isolation.mdc +87 -0
- core_framework-3.3.0/.cursor/skills/code-review/SKILL.md +35 -0
- core_framework-3.3.0/.github/workflows/dev-ci-cd.yaml +358 -0
- core_framework-3.3.0/.github/workflows/test.yaml +310 -0
- core_framework-3.3.0/CHANGELOG.md +638 -0
- core_framework-3.3.0/PKG-INFO +145 -0
- core_framework-3.3.0/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +34 -0
- core_framework-3.3.0/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +34 -0
- core_framework-3.3.0/core_framework/api/admin/cache/schemas.py +91 -0
- core_framework-3.3.0/core_framework/api/admin/comments/schemas.py +50 -0
- core_framework-3.3.0/core_framework/api/admin/outbox/router.py +62 -0
- core_framework-3.3.0/core_framework/api/admin/posts/schemas.py +32 -0
- core_framework-3.3.0/core_framework/api/admin/users/router.py +189 -0
- core_framework-3.3.0/core_framework/api/attachments/router.py +45 -0
- core_framework-3.3.0/core_framework/api/attachments/schemas.py +48 -0
- core_framework-3.3.0/core_framework/api/auth/router.py +26 -0
- core_framework-3.3.0/core_framework/api/comments/authenticated/mappers.py +21 -0
- core_framework-3.3.0/core_framework/api/comments/authenticated/router.py +149 -0
- core_framework-3.3.0/core_framework/api/comments/authenticated/schemas.py +79 -0
- core_framework-3.3.0/core_framework/api/dependencies.py +153 -0
- core_framework-3.3.0/core_framework/api/events/router.py +54 -0
- core_framework-3.3.0/core_framework/api/posts/authenticated/mappers.py +23 -0
- core_framework-3.3.0/core_framework/api/posts/authenticated/router.py +116 -0
- core_framework-3.3.0/core_framework/api/posts/authenticated/schemas.py +77 -0
- core_framework-3.3.0/core_framework/api/schemas.py +24 -0
- core_framework-3.3.0/core_framework/api/users/authenticated/router.py +549 -0
- core_framework-3.3.0/core_framework/api/users/public/router.py +33 -0
- core_framework-3.3.0/core_framework/api/users/shared/mappers.py +18 -0
- core_framework-3.3.0/core_framework/application/analytics/bucket_service.py +77 -0
- core_framework-3.3.0/core_framework/application/analytics/refresh_service.py +62 -0
- core_framework-3.3.0/core_framework/application/auth/auth_service.py +50 -0
- core_framework-3.3.0/core_framework/application/auth/token_verification.py +22 -0
- core_framework-3.3.0/core_framework/application/comments/admin_service.py +559 -0
- core_framework-3.3.0/core_framework/application/comments/cleanup_service.py +111 -0
- core_framework-3.3.0/core_framework/application/comments/public_service.py +324 -0
- core_framework-3.3.0/core_framework/application/email/__init__.py +13 -0
- core_framework-3.3.0/core_framework/application/email/account_deletion_scheduled.py +77 -0
- core_framework-3.3.0/core_framework/application/events/README.md +31 -0
- core_framework-3.3.0/core_framework/application/events/event_service.py +167 -0
- core_framework-3.3.0/core_framework/application/media/README.md +19 -0
- core_framework-3.3.0/core_framework/application/media/attachment_service.py +524 -0
- core_framework-3.3.0/core_framework/application/media/avatar_service.py +186 -0
- core_framework-3.3.0/core_framework/application/media/banner_service.py +182 -0
- core_framework-3.3.0/core_framework/application/moderation/appeal_service.py +102 -0
- core_framework-3.3.0/core_framework/application/moderation/user_service.py +176 -0
- core_framework-3.3.0/core_framework/application/notifications/README.md +17 -0
- core_framework-3.3.0/core_framework/application/notifications/inbox_service.py +280 -0
- core_framework-3.3.0/core_framework/application/notifications/notification_service.py +187 -0
- core_framework-3.3.0/core_framework/application/outbox/ops_service.py +74 -0
- core_framework-3.3.0/core_framework/application/posts/admin_service.py +391 -0
- core_framework-3.3.0/core_framework/application/posts/authenticated_service.py +130 -0
- core_framework-3.3.0/core_framework/application/posts/cleanup_service.py +135 -0
- core_framework-3.3.0/core_framework/application/posts/public_service.py +257 -0
- core_framework-3.3.0/core_framework/application/shared/deletion_cleanup_ledger.py +60 -0
- core_framework-3.3.0/core_framework/application/shared/worker_jobs.py +63 -0
- core_framework-3.3.0/core_framework/application/users/admin_service.py +259 -0
- core_framework-3.3.0/core_framework/application/users/authenticated_service.py +393 -0
- core_framework-3.3.0/core_framework/application/users/identity_enrichment.py +35 -0
- core_framework-3.3.0/core_framework/application/users/public_service.py +162 -0
- core_framework-3.3.0/core_framework/application/users/user_deletion_service.py +697 -0
- core_framework-3.3.0/core_framework/constants.py +20 -0
- core_framework-3.3.0/core_framework/core/__init__.py +45 -0
- core_framework-3.3.0/core_framework/core/cache.py +205 -0
- core_framework-3.3.0/core_framework/core/exception_handlers/common.py +70 -0
- core_framework-3.3.0/core_framework/core/exception_handlers/setup.py +46 -0
- core_framework-3.3.0/core_framework/core/pagination.py +216 -0
- core_framework-3.3.0/core_framework/core/rate_limit.py +298 -0
- core_framework-3.3.0/core_framework/domains/analytics/service.py +338 -0
- core_framework-3.3.0/core_framework/domains/auth/README.md +75 -0
- core_framework-3.3.0/core_framework/domains/auth/__init__.py +16 -0
- core_framework-3.3.0/core_framework/domains/auth/outcomes.py +18 -0
- core_framework-3.3.0/core_framework/domains/auth/ports/auth.py +57 -0
- core_framework-3.3.0/core_framework/domains/auth/service.py +140 -0
- core_framework-3.3.0/core_framework/domains/comment/constants.py +7 -0
- core_framework-3.3.0/core_framework/domains/comment/exceptions.py +35 -0
- core_framework-3.3.0/core_framework/domains/comment/models.py +228 -0
- core_framework-3.3.0/core_framework/domains/comment/repository.py +2683 -0
- core_framework-3.3.0/core_framework/domains/comment/service.py +1028 -0
- core_framework-3.3.0/core_framework/domains/email/dependencies.py +101 -0
- core_framework-3.3.0/core_framework/domains/media/README.md +30 -0
- core_framework-3.3.0/core_framework/domains/media/__init__.py +57 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/components/staging.py +165 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/components/variant_encoder.py +28 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/constants.py +39 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/models.py +29 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/ports/variant_encoder.py +26 -0
- core_framework-3.3.0/core_framework/domains/media/attachment/service.py +456 -0
- core_framework-3.3.0/core_framework/domains/media/dependencies.py +314 -0
- core_framework-3.3.0/core_framework/domains/media/shared/outcomes.py +16 -0
- core_framework-3.3.0/core_framework/domains/media/shared/repository.py +812 -0
- core_framework-3.3.0/core_framework/domains/moderation/README.md +140 -0
- core_framework-3.3.0/core_framework/domains/moderation/dependencies.py +91 -0
- core_framework-3.3.0/core_framework/domains/moderation/outbox_repository.py +190 -0
- core_framework-3.3.0/core_framework/domains/moderation/outbox_service.py +53 -0
- core_framework-3.3.0/core_framework/domains/moderation/repository.py +1396 -0
- core_framework-3.3.0/core_framework/domains/moderation/service.py +892 -0
- core_framework-3.3.0/core_framework/domains/notification/README.md +151 -0
- core_framework-3.3.0/core_framework/domains/notification/repository.py +631 -0
- core_framework-3.3.0/core_framework/domains/notification/service.py +304 -0
- core_framework-3.3.0/core_framework/domains/outbox/README.md +69 -0
- core_framework-3.3.0/core_framework/domains/outbox/ports/admin.py +36 -0
- core_framework-3.3.0/core_framework/domains/outbox/service.py +63 -0
- core_framework-3.3.0/core_framework/domains/post/README.md +208 -0
- core_framework-3.3.0/core_framework/domains/post/constants.py +8 -0
- core_framework-3.3.0/core_framework/domains/post/exceptions.py +20 -0
- core_framework-3.3.0/core_framework/domains/post/models.py +212 -0
- core_framework-3.3.0/core_framework/domains/post/repository.py +2372 -0
- core_framework-3.3.0/core_framework/domains/post/service.py +967 -0
- core_framework-3.3.0/core_framework/domains/user/__init__.py +63 -0
- core_framework-3.3.0/core_framework/domains/user/dependencies.py +91 -0
- core_framework-3.3.0/core_framework/domains/user/models.py +346 -0
- core_framework-3.3.0/core_framework/domains/user/outbox_repository.py +189 -0
- core_framework-3.3.0/core_framework/domains/user/outbox_service.py +53 -0
- core_framework-3.3.0/core_framework/domains/user/outcomes.py +33 -0
- core_framework-3.3.0/core_framework/domains/user/repository.py +1810 -0
- core_framework-3.3.0/core_framework/domains/user/service.py +1054 -0
- core_framework-3.3.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +125 -0
- core_framework-3.3.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +45 -0
- core_framework-3.3.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +164 -0
- core_framework-3.3.0/core_framework/testing/arq.py +141 -0
- core_framework-3.3.0/core_framework/testing/auth.py +306 -0
- core_framework-3.3.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +36 -0
- core_framework-3.3.0/core_framework/worker/tasks/__init__.py +112 -0
- core_framework-3.3.0/core_framework/worker/tasks/process_account_deletion.py +21 -0
- core_framework-3.3.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +19 -0
- core_framework-3.3.0/core_framework/worker/tasks/process_destructive_comment_delete.py +38 -0
- core_framework-3.3.0/core_framework/worker/tasks/process_destructive_post_delete.py +34 -0
- core_framework-3.3.0/core_framework/worker/tasks/process_user_content_deletion.py +18 -0
- core_framework-3.3.0/deploy/app/docker-compose.yml +62 -0
- core_framework-3.3.0/docs/deployments/deploy-playbook.md +250 -0
- core_framework-3.3.0/docs/deployments/e2e-smoke-tests-design.md +353 -0
- core_framework-3.3.0/docs/deployments/edge-rate-limits.md +96 -0
- core_framework-3.3.0/docs/deployments/guides/setup/cloudflare-setup.md +129 -0
- core_framework-3.3.0/docs/deployments/guides/setup/observability-lgtm-setup.md +204 -0
- core_framework-3.3.0/docs/deployments/release-playbook.md +92 -0
- core_framework-3.3.0/docs/design/README.md +33 -0
- core_framework-3.3.0/docs/design/analytics-rollup-design.md +1005 -0
- core_framework-3.3.0/docs/design/cache-invalidation-design.md +150 -0
- core_framework-3.3.0/docs/design/create-idempotency-design.md +294 -0
- core_framework-3.3.0/docs/design/event-outbox-design.md +603 -0
- core_framework-3.3.0/docs/design/events-ingest-design.md +229 -0
- core_framework-3.3.0/docs/design/media-cpu-off-api-refactor.md +134 -0
- core_framework-3.3.0/docs/design/media-storage-topology.md +141 -0
- core_framework-3.3.0/docs/design/observability-lgtm-design.md +593 -0
- core_framework-3.3.0/docs/design/outbox-admin-ops-design.md +337 -0
- core_framework-3.3.0/docs/design/transactional-email-design.md +618 -0
- core_framework-3.3.0/docs/domains/README.md +23 -0
- core_framework-3.3.0/docs/domains/auth/access_control.md +70 -0
- core_framework-3.3.0/docs/domains/auth/registration.md +64 -0
- core_framework-3.3.0/docs/domains/cache/admin_cache_invalidation.md +184 -0
- core_framework-3.3.0/docs/domains/comments/admin_comments.md +221 -0
- core_framework-3.3.0/docs/domains/comments/comment_like.md +102 -0
- core_framework-3.3.0/docs/domains/comments/comment_report.md +121 -0
- core_framework-3.3.0/docs/domains/comments/comment_stats_aggregation.md +69 -0
- core_framework-3.3.0/docs/domains/comments/create_comment.md +193 -0
- core_framework-3.3.0/docs/domains/comments/edit_comment.md +74 -0
- core_framework-3.3.0/docs/domains/deletion/comments.md +289 -0
- core_framework-3.3.0/docs/domains/deletion/posts.md +312 -0
- core_framework-3.3.0/docs/domains/deletion/users.md +520 -0
- core_framework-3.3.0/docs/domains/events/events.md +248 -0
- core_framework-3.3.0/docs/domains/media/attachment_upload.md +77 -0
- core_framework-3.3.0/docs/domains/media/post-comment-attachments-design.md +521 -0
- core_framework-3.3.0/docs/domains/media/upload-pipeline-design.md +468 -0
- core_framework-3.3.0/docs/domains/media/upload_pipeline.md +108 -0
- core_framework-3.3.0/docs/domains/mentions/mentions_in_content.md +240 -0
- core_framework-3.3.0/docs/domains/moderation/appeals.md +248 -0
- core_framework-3.3.0/docs/domains/moderation/internal_notes.md +159 -0
- core_framework-3.3.0/docs/domains/moderation/moderator_actions.md +70 -0
- core_framework-3.3.0/docs/domains/moderation/reports.md +222 -0
- core_framework-3.3.0/docs/domains/moderation/restrictions.md +251 -0
- core_framework-3.3.0/docs/domains/notifications/notification_inbox.md +383 -0
- core_framework-3.3.0/docs/domains/outbox/admin_outbox_ops.md +187 -0
- core_framework-3.3.0/docs/domains/posts/admin_posts.md +216 -0
- core_framework-3.3.0/docs/domains/posts/author_context.md +92 -0
- core_framework-3.3.0/docs/domains/posts/create_post.md +126 -0
- core_framework-3.3.0/docs/domains/posts/edit_post.md +83 -0
- core_framework-3.3.0/docs/domains/posts/post_like.md +101 -0
- core_framework-3.3.0/docs/domains/posts/post_report.md +108 -0
- core_framework-3.3.0/docs/domains/users/account.md +108 -0
- core_framework-3.3.0/docs/domains/users/account_deletion.md +99 -0
- core_framework-3.3.0/docs/domains/users/admin_users.md +167 -0
- core_framework-3.3.0/docs/domains/users/avatar.md +91 -0
- core_framework-3.3.0/docs/domains/users/banner.md +77 -0
- core_framework-3.3.0/docs/domains/users/blocks.md +132 -0
- core_framework-3.3.0/docs/domains/users/change_history.md +128 -0
- core_framework-3.3.0/docs/domains/users/check_username_exists.md +62 -0
- core_framework-3.3.0/docs/domains/users/follow.md +230 -0
- core_framework-3.3.0/docs/domains/users/preferences.md +87 -0
- core_framework-3.3.0/docs/domains/users/profile.md +221 -0
- core_framework-3.3.0/docs/domains/users/username_suggest.md +15 -0
- core_framework-3.3.0/docs/library/capability-wiring.md +181 -0
- core_framework-3.3.0/docs/library/core-framework-migration.md +253 -0
- core_framework-3.3.0/docs/library/overview.md +56 -0
- core_framework-3.3.0/docs/library/package-api.md +675 -0
- core_framework-3.3.0/docs/library/testing-plugin-design.md +317 -0
- core_framework-3.3.0/docs/library/workers.md +128 -0
- core_framework-3.3.0/docs/platform/architecture-decisions.md +594 -0
- core_framework-3.3.0/docs/platform/client-error-visibility.md +278 -0
- core_framework-3.3.0/docs/platform/domain-services-and-adapters.md +73 -0
- core_framework-3.3.0/docs/platform/patch-update-typed-payload.md +194 -0
- core_framework-3.3.0/docs/reviews/log.md +28 -0
- core_framework-3.3.0/docs/reviews/review-playbook.md +192 -0
- core_framework-3.3.0/docs/reviews/slices.md +302 -0
- core_framework-3.3.0/docs/testing.md +150 -0
- core_framework-3.3.0/docs/todo.md +3 -0
- core_framework-3.3.0/pyproject.toml +155 -0
- core_framework-3.3.0/tests/conftest.py +52 -0
- core_framework-3.3.0/tests/integration/_http_error_details.py +21 -0
- core_framework-3.3.0/tests/integration/_poll.py +23 -0
- core_framework-3.3.0/tests/integration/api/_auth_helpers.py +21 -0
- core_framework-3.3.0/tests/integration/api/_destructive_delete_helpers.py +51 -0
- core_framework-3.3.0/tests/integration/api/_http_helpers.py +100 -0
- core_framework-3.3.0/tests/integration/api/_user_deletion_helpers.py +63 -0
- core_framework-3.3.0/tests/integration/api/_user_helpers.py +63 -0
- core_framework-3.3.0/tests/integration/api/admin/_auth_cases.py +97 -0
- core_framework-3.3.0/tests/integration/api/admin/analytics/router_test.py +266 -0
- core_framework-3.3.0/tests/integration/api/admin/cache/router_test.py +310 -0
- core_framework-3.3.0/tests/integration/api/admin/comments/router_test.py +745 -0
- core_framework-3.3.0/tests/integration/api/admin/moderation/router_test.py +2444 -0
- core_framework-3.3.0/tests/integration/api/admin/outbox/router_test.py +340 -0
- core_framework-3.3.0/tests/integration/api/admin/posts/router_test.py +476 -0
- core_framework-3.3.0/tests/integration/api/admin/users/router_test.py +1450 -0
- core_framework-3.3.0/tests/integration/api/attachments/_helpers.py +289 -0
- core_framework-3.3.0/tests/integration/api/attachments/attachment_upload_test.py +31 -0
- core_framework-3.3.0/tests/integration/api/attachments/conftest.py +14 -0
- core_framework-3.3.0/tests/integration/api/auth/router_test.py +55 -0
- core_framework-3.3.0/tests/integration/api/comments/comment_attachments_integration_test.py +572 -0
- core_framework-3.3.0/tests/integration/api/comments/public/router_test.py +508 -0
- core_framework-3.3.0/tests/integration/api/events/router_test.py +656 -0
- core_framework-3.3.0/tests/integration/api/notifications/router_test.py +538 -0
- core_framework-3.3.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +547 -0
- core_framework-3.3.0/tests/integration/api/posts/followers_visibility_test.py +144 -0
- core_framework-3.3.0/tests/integration/api/posts/post_attachments_integration_test.py +663 -0
- core_framework-3.3.0/tests/integration/api/posts/post_deletion_integration_test.py +630 -0
- core_framework-3.3.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +212 -0
- core_framework-3.3.0/tests/integration/api/posts/public/router_test.py +724 -0
- core_framework-3.3.0/tests/integration/api/rate_limit_test.py +349 -0
- core_framework-3.3.0/tests/integration/api/users/account_deletion_email_test.py +145 -0
- core_framework-3.3.0/tests/integration/api/users/authenticated/profile_media_upload_test.py +187 -0
- core_framework-3.3.0/tests/integration/api/users/authenticated/router_test.py +1102 -0
- core_framework-3.3.0/tests/integration/api/users/deletion_audit_integration_test.py +187 -0
- core_framework-3.3.0/tests/integration/api/users/public/router_test.py +329 -0
- core_framework-3.3.0/tests/integration/conftest.py +14 -0
- core_framework-3.3.0/tests/integration/worker/_aggregate_stats_helpers.py +57 -0
- core_framework-3.3.0/tests/integration/worker/_arq_helpers.py +148 -0
- core_framework-3.3.0/tests/integration/worker/_media_upload_helpers.py +84 -0
- core_framework-3.3.0/tests/integration/worker/account_deletion_test.py +385 -0
- core_framework-3.3.0/tests/integration/worker/aggregate_comment_stats_test.py +328 -0
- core_framework-3.3.0/tests/integration/worker/aggregate_post_stats_test.py +219 -0
- core_framework-3.3.0/tests/integration/worker/aggregate_user_stats_test.py +103 -0
- core_framework-3.3.0/tests/integration/worker/analytics_refresh_test.py +108 -0
- core_framework-3.3.0/tests/integration/worker/conftest.py +29 -0
- core_framework-3.3.0/tests/integration/worker/create_idempotency_retention_test.py +277 -0
- core_framework-3.3.0/tests/integration/worker/moderation_outbox_test.py +313 -0
- core_framework-3.3.0/tests/integration/worker/mute_lift_test.py +172 -0
- core_framework-3.3.0/tests/integration/worker/profile_media_upload_test.py +458 -0
- core_framework-3.3.0/tests/integration/worker/user_outbox_test.py +370 -0
- core_framework-3.3.0/tests/unit/api/users/profile_update_mapper_test.py +22 -0
- core_framework-3.3.0/tests/unit/application/email/account_deletion_scheduled_test.py +230 -0
- core_framework-3.3.0/tests/unit/core/pagination_test.py +466 -0
- core_framework-3.3.0/uv.lock +2607 -0
- core_framework-3.2.0/.cursor/rules/alembic-migrations.mdc +0 -60
- core_framework-3.2.0/.cursor/rules/domain-imports.mdc +0 -44
- core_framework-3.2.0/.cursor/rules/error-boundary.mdc +0 -56
- core_framework-3.2.0/.cursor/rules/repository-schema-isolation.mdc +0 -85
- core_framework-3.2.0/.cursor/skills/code-review/SKILL.md +0 -35
- core_framework-3.2.0/.github/workflows/dev-ci-cd.yaml +0 -235
- core_framework-3.2.0/.github/workflows/test.yaml +0 -187
- core_framework-3.2.0/CHANGELOG.md +0 -606
- core_framework-3.2.0/PKG-INFO +0 -145
- core_framework-3.2.0/core_framework/api/admin/cache/schemas.py +0 -91
- core_framework-3.2.0/core_framework/api/admin/comments/schemas.py +0 -49
- core_framework-3.2.0/core_framework/api/admin/outbox/router.py +0 -61
- core_framework-3.2.0/core_framework/api/admin/posts/schemas.py +0 -31
- core_framework-3.2.0/core_framework/api/admin/users/router.py +0 -189
- core_framework-3.2.0/core_framework/api/attachments/router.py +0 -43
- core_framework-3.2.0/core_framework/api/attachments/schemas.py +0 -48
- core_framework-3.2.0/core_framework/api/auth/router.py +0 -21
- core_framework-3.2.0/core_framework/api/comments/authenticated/mappers.py +0 -17
- core_framework-3.2.0/core_framework/api/comments/authenticated/router.py +0 -143
- core_framework-3.2.0/core_framework/api/comments/authenticated/schemas.py +0 -79
- core_framework-3.2.0/core_framework/api/dependencies.py +0 -145
- core_framework-3.2.0/core_framework/api/events/router.py +0 -48
- core_framework-3.2.0/core_framework/api/posts/authenticated/mappers.py +0 -19
- core_framework-3.2.0/core_framework/api/posts/authenticated/router.py +0 -111
- core_framework-3.2.0/core_framework/api/posts/authenticated/schemas.py +0 -77
- core_framework-3.2.0/core_framework/api/schemas.py +0 -13
- core_framework-3.2.0/core_framework/api/users/authenticated/router.py +0 -542
- core_framework-3.2.0/core_framework/api/users/mappers.py +0 -16
- core_framework-3.2.0/core_framework/api/users/public/router.py +0 -28
- core_framework-3.2.0/core_framework/application/analytics/bucket_service.py +0 -43
- core_framework-3.2.0/core_framework/application/analytics/refresh_service.py +0 -54
- core_framework-3.2.0/core_framework/application/auth/auth_service.py +0 -26
- core_framework-3.2.0/core_framework/application/auth/token_verification.py +0 -29
- core_framework-3.2.0/core_framework/application/comments/admin_service.py +0 -307
- core_framework-3.2.0/core_framework/application/comments/cleanup_service.py +0 -109
- core_framework-3.2.0/core_framework/application/comments/public_service.py +0 -339
- core_framework-3.2.0/core_framework/application/email/__init__.py +0 -29
- core_framework-3.2.0/core_framework/application/email/account_deletion_scheduled.py +0 -77
- core_framework-3.2.0/core_framework/application/events/README.md +0 -31
- core_framework-3.2.0/core_framework/application/events/event_service.py +0 -148
- core_framework-3.2.0/core_framework/application/media/README.md +0 -19
- core_framework-3.2.0/core_framework/application/media/attachment_service.py +0 -503
- core_framework-3.2.0/core_framework/application/media/avatar_service.py +0 -168
- core_framework-3.2.0/core_framework/application/media/banner_service.py +0 -164
- core_framework-3.2.0/core_framework/application/moderation/appeal_service.py +0 -112
- core_framework-3.2.0/core_framework/application/moderation/user_service.py +0 -218
- core_framework-3.2.0/core_framework/application/notifications/README.md +0 -16
- core_framework-3.2.0/core_framework/application/notifications/inbox_service.py +0 -239
- core_framework-3.2.0/core_framework/application/notifications/notification_service.py +0 -170
- core_framework-3.2.0/core_framework/application/outbox/ops_service.py +0 -72
- core_framework-3.2.0/core_framework/application/posts/admin_service.py +0 -173
- core_framework-3.2.0/core_framework/application/posts/authenticated_service.py +0 -130
- core_framework-3.2.0/core_framework/application/posts/cleanup_service.py +0 -127
- core_framework-3.2.0/core_framework/application/posts/public_service.py +0 -365
- core_framework-3.2.0/core_framework/application/shared/worker_jobs.py +0 -62
- core_framework-3.2.0/core_framework/application/users/admin_service.py +0 -308
- core_framework-3.2.0/core_framework/application/users/authenticated_service.py +0 -388
- core_framework-3.2.0/core_framework/application/users/public_service.py +0 -162
- core_framework-3.2.0/core_framework/application/users/user_deletion_service.py +0 -268
- core_framework-3.2.0/core_framework/constants.py +0 -15
- core_framework-3.2.0/core_framework/core/__init__.py +0 -33
- core_framework-3.2.0/core_framework/core/cache.py +0 -193
- core_framework-3.2.0/core_framework/core/exception_handlers/common.py +0 -68
- core_framework-3.2.0/core_framework/core/exception_handlers/setup.py +0 -36
- core_framework-3.2.0/core_framework/core/pagination.py +0 -198
- core_framework-3.2.0/core_framework/domains/analytics/service.py +0 -300
- core_framework-3.2.0/core_framework/domains/auth/README.md +0 -68
- core_framework-3.2.0/core_framework/domains/auth/__init__.py +0 -8
- core_framework-3.2.0/core_framework/domains/auth/ports/auth.py +0 -54
- core_framework-3.2.0/core_framework/domains/auth/service.py +0 -58
- core_framework-3.2.0/core_framework/domains/comment/constants.py +0 -8
- core_framework-3.2.0/core_framework/domains/comment/exceptions.py +0 -30
- core_framework-3.2.0/core_framework/domains/comment/models.py +0 -225
- core_framework-3.2.0/core_framework/domains/comment/repository.py +0 -2400
- core_framework-3.2.0/core_framework/domains/comment/service.py +0 -946
- core_framework-3.2.0/core_framework/domains/email/dependencies.py +0 -91
- core_framework-3.2.0/core_framework/domains/media/README.md +0 -30
- core_framework-3.2.0/core_framework/domains/media/__init__.py +0 -59
- core_framework-3.2.0/core_framework/domains/media/attachment/components/staging.py +0 -166
- core_framework-3.2.0/core_framework/domains/media/attachment/components/variant_encoder.py +0 -48
- core_framework-3.2.0/core_framework/domains/media/attachment/constants.py +0 -41
- core_framework-3.2.0/core_framework/domains/media/attachment/models.py +0 -27
- core_framework-3.2.0/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -42
- core_framework-3.2.0/core_framework/domains/media/attachment/service.py +0 -501
- core_framework-3.2.0/core_framework/domains/media/dependencies.py +0 -332
- core_framework-3.2.0/core_framework/domains/media/shared/outcomes.py +0 -21
- core_framework-3.2.0/core_framework/domains/media/shared/repository.py +0 -806
- core_framework-3.2.0/core_framework/domains/media/shared/service.py +0 -8
- core_framework-3.2.0/core_framework/domains/moderation/README.md +0 -140
- core_framework-3.2.0/core_framework/domains/moderation/dependencies.py +0 -90
- core_framework-3.2.0/core_framework/domains/moderation/outbox_repository.py +0 -187
- core_framework-3.2.0/core_framework/domains/moderation/outbox_service.py +0 -52
- core_framework-3.2.0/core_framework/domains/moderation/repository.py +0 -1308
- core_framework-3.2.0/core_framework/domains/moderation/service.py +0 -884
- core_framework-3.2.0/core_framework/domains/notification/README.md +0 -156
- core_framework-3.2.0/core_framework/domains/notification/repository.py +0 -629
- core_framework-3.2.0/core_framework/domains/notification/service.py +0 -301
- core_framework-3.2.0/core_framework/domains/outbox/README.md +0 -69
- core_framework-3.2.0/core_framework/domains/outbox/ports/admin.py +0 -35
- core_framework-3.2.0/core_framework/domains/outbox/service.py +0 -62
- core_framework-3.2.0/core_framework/domains/post/README.md +0 -208
- core_framework-3.2.0/core_framework/domains/post/constants.py +0 -9
- core_framework-3.2.0/core_framework/domains/post/exceptions.py +0 -20
- core_framework-3.2.0/core_framework/domains/post/models.py +0 -209
- core_framework-3.2.0/core_framework/domains/post/repository.py +0 -2255
- core_framework-3.2.0/core_framework/domains/post/service.py +0 -935
- core_framework-3.2.0/core_framework/domains/user/__init__.py +0 -57
- core_framework-3.2.0/core_framework/domains/user/dependencies.py +0 -90
- core_framework-3.2.0/core_framework/domains/user/models.py +0 -348
- core_framework-3.2.0/core_framework/domains/user/outbox_repository.py +0 -186
- core_framework-3.2.0/core_framework/domains/user/outbox_service.py +0 -52
- core_framework-3.2.0/core_framework/domains/user/outcomes.py +0 -31
- core_framework-3.2.0/core_framework/domains/user/repository.py +0 -1745
- core_framework-3.2.0/core_framework/domains/user/service.py +0 -999
- core_framework-3.2.0/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -114
- core_framework-3.2.0/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -71
- core_framework-3.2.0/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -194
- core_framework-3.2.0/core_framework/testing/arq.py +0 -121
- core_framework-3.2.0/core_framework/testing/auth.py +0 -304
- core_framework-3.2.0/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -34
- core_framework-3.2.0/core_framework/worker/tasks/__init__.py +0 -77
- core_framework-3.2.0/core_framework/worker/tasks/process_account_deletion.py +0 -21
- core_framework-3.2.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -31
- core_framework-3.2.0/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -15
- core_framework-3.2.0/core_framework/worker/tasks/process_destructive_post_delete.py +0 -15
- core_framework-3.2.0/core_framework/worker/tasks/process_user_content_deletion.py +0 -15
- core_framework-3.2.0/deploy/app/docker-compose.yml +0 -47
- core_framework-3.2.0/docs/deployments/deploy-playbook.md +0 -246
- core_framework-3.2.0/docs/deployments/e2e-smoke-tests-design.md +0 -353
- core_framework-3.2.0/docs/deployments/edge-rate-limits.md +0 -63
- core_framework-3.2.0/docs/deployments/guides/setup/cloudflare-setup.md +0 -129
- core_framework-3.2.0/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -204
- core_framework-3.2.0/docs/deployments/release-playbook.md +0 -84
- core_framework-3.2.0/docs/design/README.md +0 -32
- core_framework-3.2.0/docs/design/analytics-rollup-design.md +0 -985
- core_framework-3.2.0/docs/design/cache-invalidation-design.md +0 -148
- core_framework-3.2.0/docs/design/create-idempotency-design.md +0 -282
- core_framework-3.2.0/docs/design/event-outbox-design.md +0 -603
- core_framework-3.2.0/docs/design/events-ingest-design.md +0 -228
- core_framework-3.2.0/docs/design/media-storage-topology.md +0 -141
- core_framework-3.2.0/docs/design/observability-lgtm-design.md +0 -591
- core_framework-3.2.0/docs/design/outbox-admin-ops-design.md +0 -337
- core_framework-3.2.0/docs/design/transactional-email-design.md +0 -616
- core_framework-3.2.0/docs/domains/README.md +0 -23
- core_framework-3.2.0/docs/domains/auth/access_control.md +0 -70
- core_framework-3.2.0/docs/domains/auth/registration.md +0 -60
- core_framework-3.2.0/docs/domains/cache/admin_cache_invalidation.md +0 -182
- core_framework-3.2.0/docs/domains/comments/admin_comments.md +0 -218
- core_framework-3.2.0/docs/domains/comments/comment_like.md +0 -96
- core_framework-3.2.0/docs/domains/comments/comment_report.md +0 -118
- core_framework-3.2.0/docs/domains/comments/comment_stats_aggregation.md +0 -69
- core_framework-3.2.0/docs/domains/comments/create_comment.md +0 -174
- core_framework-3.2.0/docs/domains/comments/edit_comment.md +0 -74
- core_framework-3.2.0/docs/domains/deletion/comments.md +0 -289
- core_framework-3.2.0/docs/domains/deletion/posts.md +0 -312
- core_framework-3.2.0/docs/domains/deletion/users.md +0 -501
- core_framework-3.2.0/docs/domains/events/events.md +0 -245
- core_framework-3.2.0/docs/domains/media/attachment_upload.md +0 -75
- core_framework-3.2.0/docs/domains/media/post-comment-attachments-design.md +0 -521
- core_framework-3.2.0/docs/domains/media/upload-pipeline-design.md +0 -468
- core_framework-3.2.0/docs/domains/media/upload_pipeline.md +0 -110
- core_framework-3.2.0/docs/domains/mentions/mentions_in_content.md +0 -238
- core_framework-3.2.0/docs/domains/moderation/appeals.md +0 -245
- core_framework-3.2.0/docs/domains/moderation/internal_notes.md +0 -159
- core_framework-3.2.0/docs/domains/moderation/moderator_actions.md +0 -70
- core_framework-3.2.0/docs/domains/moderation/reports.md +0 -186
- core_framework-3.2.0/docs/domains/moderation/restrictions.md +0 -250
- core_framework-3.2.0/docs/domains/notifications/notification_inbox.md +0 -384
- core_framework-3.2.0/docs/domains/outbox/admin_outbox_ops.md +0 -187
- core_framework-3.2.0/docs/domains/posts/admin_posts.md +0 -214
- core_framework-3.2.0/docs/domains/posts/author_context.md +0 -92
- core_framework-3.2.0/docs/domains/posts/create_post.md +0 -121
- core_framework-3.2.0/docs/domains/posts/edit_post.md +0 -80
- core_framework-3.2.0/docs/domains/posts/post_like.md +0 -95
- core_framework-3.2.0/docs/domains/posts/post_report.md +0 -105
- core_framework-3.2.0/docs/domains/users/account.md +0 -106
- core_framework-3.2.0/docs/domains/users/account_deletion.md +0 -128
- core_framework-3.2.0/docs/domains/users/admin_users.md +0 -166
- core_framework-3.2.0/docs/domains/users/avatar.md +0 -92
- core_framework-3.2.0/docs/domains/users/banner.md +0 -78
- core_framework-3.2.0/docs/domains/users/blocks.md +0 -125
- core_framework-3.2.0/docs/domains/users/change_history.md +0 -133
- core_framework-3.2.0/docs/domains/users/check_username_exists.md +0 -57
- core_framework-3.2.0/docs/domains/users/follow.md +0 -222
- core_framework-3.2.0/docs/domains/users/preferences.md +0 -87
- core_framework-3.2.0/docs/domains/users/profile.md +0 -204
- core_framework-3.2.0/docs/library/capability-wiring.md +0 -170
- core_framework-3.2.0/docs/library/core-framework-migration.md +0 -253
- core_framework-3.2.0/docs/library/overview.md +0 -55
- core_framework-3.2.0/docs/library/package-api.md +0 -622
- core_framework-3.2.0/docs/library/testing-plugin-design.md +0 -317
- core_framework-3.2.0/docs/library/workers.md +0 -105
- core_framework-3.2.0/docs/platform/architecture-decisions.md +0 -555
- core_framework-3.2.0/docs/platform/client-error-visibility.md +0 -274
- core_framework-3.2.0/docs/platform/domain-services-and-adapters.md +0 -71
- core_framework-3.2.0/docs/platform/patch-update-typed-payload.md +0 -191
- core_framework-3.2.0/docs/reviews/log.md +0 -12
- core_framework-3.2.0/docs/reviews/review-playbook.md +0 -192
- core_framework-3.2.0/docs/reviews/slices.md +0 -301
- core_framework-3.2.0/docs/testing.md +0 -150
- core_framework-3.2.0/docs/todo.md +0 -5
- core_framework-3.2.0/pyproject.toml +0 -155
- core_framework-3.2.0/tests/conftest.py +0 -49
- core_framework-3.2.0/tests/integration/_http_error_details.py +0 -19
- core_framework-3.2.0/tests/integration/api/_auth_helpers.py +0 -6
- core_framework-3.2.0/tests/integration/api/_destructive_delete_helpers.py +0 -51
- core_framework-3.2.0/tests/integration/api/_http_helpers.py +0 -95
- core_framework-3.2.0/tests/integration/api/_user_deletion_helpers.py +0 -63
- core_framework-3.2.0/tests/integration/api/_user_helpers.py +0 -26
- core_framework-3.2.0/tests/integration/api/admin/_auth_cases.py +0 -53
- core_framework-3.2.0/tests/integration/api/admin/analytics/router_test.py +0 -263
- core_framework-3.2.0/tests/integration/api/admin/cache/router_test.py +0 -307
- core_framework-3.2.0/tests/integration/api/admin/comments/router_test.py +0 -735
- core_framework-3.2.0/tests/integration/api/admin/moderation/_auth_cases.py +0 -30
- core_framework-3.2.0/tests/integration/api/admin/moderation/router_test.py +0 -2545
- core_framework-3.2.0/tests/integration/api/admin/outbox/router_test.py +0 -337
- core_framework-3.2.0/tests/integration/api/admin/posts/router_test.py +0 -472
- core_framework-3.2.0/tests/integration/api/admin/users/router_test.py +0 -1464
- core_framework-3.2.0/tests/integration/api/attachments/_helpers.py +0 -210
- core_framework-3.2.0/tests/integration/api/attachments/attachment_upload_test.py +0 -29
- core_framework-3.2.0/tests/integration/api/auth/router_test.py +0 -52
- core_framework-3.2.0/tests/integration/api/comments/comment_attachments_integration_test.py +0 -576
- core_framework-3.2.0/tests/integration/api/comments/public/router_test.py +0 -514
- core_framework-3.2.0/tests/integration/api/events/router_test.py +0 -758
- core_framework-3.2.0/tests/integration/api/notifications/router_test.py +0 -538
- core_framework-3.2.0/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -311
- core_framework-3.2.0/tests/integration/api/posts/followers_visibility_test.py +0 -144
- core_framework-3.2.0/tests/integration/api/posts/post_attachments_integration_test.py +0 -660
- core_framework-3.2.0/tests/integration/api/posts/post_deletion_integration_test.py +0 -624
- core_framework-3.2.0/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -212
- core_framework-3.2.0/tests/integration/api/posts/public/router_test.py +0 -1015
- core_framework-3.2.0/tests/integration/api/users/account_deletion_email_test.py +0 -145
- core_framework-3.2.0/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -112
- core_framework-3.2.0/tests/integration/api/users/authenticated/banner_upload_test.py +0 -112
- core_framework-3.2.0/tests/integration/api/users/authenticated/router_test.py +0 -1100
- core_framework-3.2.0/tests/integration/api/users/deletion_audit_integration_test.py +0 -187
- core_framework-3.2.0/tests/integration/api/users/public/router_test.py +0 -334
- core_framework-3.2.0/tests/integration/worker/_media_upload_helpers.py +0 -84
- core_framework-3.2.0/tests/integration/worker/account_deletion_test.py +0 -385
- core_framework-3.2.0/tests/integration/worker/aggregate_comment_stats_test.py +0 -354
- core_framework-3.2.0/tests/integration/worker/aggregate_post_stats_test.py +0 -257
- core_framework-3.2.0/tests/integration/worker/aggregate_user_stats_test.py +0 -123
- core_framework-3.2.0/tests/integration/worker/analytics_refresh_test.py +0 -108
- core_framework-3.2.0/tests/integration/worker/avatar_upload_test.py +0 -370
- core_framework-3.2.0/tests/integration/worker/banner_upload_test.py +0 -367
- core_framework-3.2.0/tests/integration/worker/conftest.py +0 -21
- core_framework-3.2.0/tests/integration/worker/create_idempotency_retention_test.py +0 -280
- core_framework-3.2.0/tests/integration/worker/moderation_outbox_test.py +0 -313
- core_framework-3.2.0/tests/integration/worker/mute_lift_test.py +0 -166
- core_framework-3.2.0/tests/integration/worker/user_outbox_test.py +0 -370
- core_framework-3.2.0/tests/integration/worker/utils_test.py +0 -116
- core_framework-3.2.0/tests/unit/api/users/profile_update_mapper_test.py +0 -22
- core_framework-3.2.0/tests/unit/application/email/account_deletion_scheduled_test.py +0 -219
- core_framework-3.2.0/tests/unit/core/pagination_test.py +0 -582
- core_framework-3.2.0/uv.lock +0 -2607
- {core_framework-3.2.0 → core_framework-3.3.0}/.agents/skills/fastapi +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/constitution.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/flow-documentation.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/strong-reads.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/fastapi +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/implement-feature/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.dockerignore +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/ci/package-lock.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/ci/package.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/workflows/_deploy.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/workflows/manual-deployment.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/workflows/manual-observability-deployment.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.gitignore +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.pre-commit-config.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/.python-version +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/LICENSE +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/analytics/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/comment/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/extension/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/extension/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/extension/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/media/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/moderation/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/notification/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/post/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/README +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/env.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/script.py.mako +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/alembic/user/alembic.ini +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/config.toml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/config.toml.template +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/analytics/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/cache/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/outbox/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/admin/users/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/public/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/comments/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/events/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/events/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-3.2.0/core_framework/application/media → core_framework-3.3.0/core_framework/api}/ingest_guards.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/notifications/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/public/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/system/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/system/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/upload.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/authenticated/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/router.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/api/users/shared/schemas.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/read_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/auth/access_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/auth/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/bootstrap.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/cache/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/comments/aggregation_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/comments/authenticated_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/email/enqueue.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/email/registry.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/email/send.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/events/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/events/event_token.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/events/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/media/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/moderation/moderator_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/moderation/report_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/notifications/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/notifications/mute_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/block_mirrors.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/events.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/handlers.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/processing_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/outbox/restriction_mirrors.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/posts/aggregation_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/shared/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/shared/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/users/aggregation_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/users/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/application/users/scheduled_service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/asgi.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/bundled_alembic.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/context.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/database.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/exception_handlers/application.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/firebase.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/http_client.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/http_probes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/logging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/middleware.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/observability.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/process.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/redis.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/runtime.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/core/settings.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/analytics/repository.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/auth/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/auth/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/auth/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/auth/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/comment/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/comment/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/comment/outcomes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/email/service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/components/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/avatar/service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/banner/service.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/moderation/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/notification/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/models.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/post/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/post/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/post/outcomes.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/repository_sql.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/user/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/user/constants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/user/enums.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/user/utils.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/domains/utils.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/firebase/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/main.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/migrate_cli.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/py.typed +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/config.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/containers.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/firebase.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/media.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/migrations.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/testing/plugin.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/main.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/core_framework/worker/worker_context.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/app/dockerfile +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/.env.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/docker-compose.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/loki.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/prometheus.yml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets.example/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets.example/node.yml.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets.example/postgres.yml.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/targets.example/redis.yml.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/deploy/observability/tempo.yaml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/edge-upload-limits.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/examples/Caddyfile.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/caddy-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/postgres-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/redis-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/deployments/postgres-backup-design.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/design/utm-events-design.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/analytics/admin_analytics_reads.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/comments/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/comments/delete_comment.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/comments/retrieve_comments.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/deletion/overview.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/media/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/media/avatar-upload-design.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/media/banner-upload-design.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/moderation/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/delete_post.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/hashtag_discovery.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/post_stats_aggregation.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/post_visibility.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/posts/retrieve_posts.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/users/follow-system-design.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/users/my_posts_and_comments.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/users/public_profile.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/users/user_removal.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/domains/users/user_stats_aggregation.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/library/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/library/api.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/platform/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/platform/conventions.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/platform/database-triggers.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/platform/layers-and-boundaries.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/docs/reviews/README.md +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/firebase_config.example.json +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/makefile +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tach.toml +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/_auth.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/_canaries.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/_media.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/_settings.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/_upload_payloads.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/conftest.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/analytics/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/cache/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/moderation/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/outbox/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/admin/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/auth/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/comments/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/comments/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/create_idempotency_integration_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/notifications/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/posts/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/posts/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/worker/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/application/notifications/inbox_service_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/docs/api_routes_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/domains/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-3.2.0 → core_framework-3.3.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Alembic migrations — revision id format and index DDL conventions
|
|
3
|
+
globs: alembic/**/alembic/versions/*.py
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Alembic migrations
|
|
8
|
+
|
|
9
|
+
## Revision IDs
|
|
10
|
+
|
|
11
|
+
`alembic_version.version_num` is a **32-character** string. Revision ids must stay well under that limit.
|
|
12
|
+
|
|
13
|
+
### New revisions (required)
|
|
14
|
+
|
|
15
|
+
- Set `revision` to a **12-character lowercase hex** string (Alembic default), e.g. `a56bc6b7f799`.
|
|
16
|
+
- Generate with `python -c "import secrets; print(secrets.token_hex(6))"` or `alembic revision`.
|
|
17
|
+
- Put the human-readable slug in the **filename** and the module docstring `Revision ID:` line only if you mirror the hex id there — **do not** use descriptive slugs as `revision`.
|
|
18
|
+
|
|
19
|
+
```python
|
|
20
|
+
# ✅ Preferred
|
|
21
|
+
"""replace deleted post status with tombstone statuses
|
|
22
|
+
|
|
23
|
+
Revision ID: 120bf6be81eb
|
|
24
|
+
Revises: a56bc6b7f799
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
revision: str = "120bf6be81eb"
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```python
|
|
31
|
+
# ❌ Avoid — long, wastes version_num budget, inconsistent with recent migrations
|
|
32
|
+
revision: str = "post_tombstone_status_model"
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
### Exceptions
|
|
36
|
+
|
|
37
|
+
- Collapsed **`v1_*_init`** baseline revisions keep their stable names (`v1_post_init`, etc.) — do not rename shipped baselines.
|
|
38
|
+
- **Legacy descriptive slug** revision ids (e.g. `post_add_post_mentions`, `user_add_date_of_birth`) stay as-is. Do not rewrite or collapse history just to convert them to hex. Do not re-flag them on B11 unless a deliberate baseline collapse is in progress.
|
|
39
|
+
|
|
40
|
+
### Do not rename shipped revision ids
|
|
41
|
+
|
|
42
|
+
If a revision may already be applied in any environment, **do not** change its `revision` string. Add a forward migration instead.
|
|
43
|
+
|
|
44
|
+
## Index DDL
|
|
45
|
+
|
|
46
|
+
### New index migrations (required)
|
|
47
|
+
|
|
48
|
+
In **`upgrade()`**, create indexes with **`IF NOT EXISTS`** so migrations succeed when an index was already applied manually in production:
|
|
49
|
+
|
|
50
|
+
```python
|
|
51
|
+
op.execute("""
|
|
52
|
+
create index if not exists idx_example_created_at
|
|
53
|
+
on example_table (created_at);
|
|
54
|
+
""")
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Use **`drop index if exists`** in **`downgrade()`**.
|
|
58
|
+
|
|
59
|
+
### Do not retrofit index DDL
|
|
60
|
+
|
|
61
|
+
Do **not** edit shipped migrations only to add `if not exists` — those revisions may already be applied. New forward migrations follow this rule; legacy `create index` without `if not exists` stays as-is.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Enforce importing from domain __init__.py in API/application layers
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/api/**/*.py
|
|
5
|
+
- core_framework/application/**/*.py
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Domain imports
|
|
9
|
+
|
|
10
|
+
When importing from **`core_framework/domains/*`** in API or application code:
|
|
11
|
+
|
|
12
|
+
## Allowed
|
|
13
|
+
|
|
14
|
+
- Public symbols from domain **`__init__.py`** (models, enums, constants, outcomes).
|
|
15
|
+
- Services from **`dependencies.py`** (e.g. **`user_service`**).
|
|
16
|
+
|
|
17
|
+
## Prohibited
|
|
18
|
+
|
|
19
|
+
- Typed or base **domain exceptions** in API/application — use **`application.shared.exceptions`**. Full policy: **`error-boundary.mdc`**.
|
|
20
|
+
- Direct imports from internal modules (`models`, `enums`, `repository`, `service`, `exceptions`).
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
# ✅
|
|
24
|
+
from core_framework.domains.user import Profile, UserRole
|
|
25
|
+
from core_framework.domains.user.dependencies import user_service
|
|
26
|
+
|
|
27
|
+
# ❌
|
|
28
|
+
from core_framework.domains.post import PostUpdateNotFoundException
|
|
29
|
+
from core_framework.domains.user.models import Profile
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Export policy
|
|
33
|
+
|
|
34
|
+
Export from **`__init__.py`** only what outer layers need. Typed exceptions stay internal; export **only** **`BaseXxxException`** per domain for inheritance typing — not for per-domain HTTP handlers. **`DomainValidationError`** lives in **`domains/exceptions.py`** (core handler wiring only).
|
|
35
|
+
|
|
36
|
+
To see what a domain exports, check its **`__init__.py`** **`__all__`**.
|
|
37
|
+
|
|
38
|
+
## After a domain call
|
|
39
|
+
|
|
40
|
+
1. Return **`None`** or empty when the use case allows.
|
|
41
|
+
2. Raise an **application** exception when HTTP must signal failure.
|
|
42
|
+
3. Extend the domain service API to absorb typed exceptions internally.
|
|
43
|
+
|
|
44
|
+
Application code never imports repositories. Exception boundary: **`error-boundary.mdc`**.
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: HTTP error boundaries — application vs domain exceptions, handlers, anti-enumeration
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/core/exception_handlers/**/*.py
|
|
5
|
+
- core_framework/application/**/*.py
|
|
6
|
+
- core_framework/api/**/router.py
|
|
7
|
+
- core_framework/api/**/schemas.py
|
|
8
|
+
- core_framework/domains/**/exceptions.py
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Error boundary
|
|
12
|
+
|
|
13
|
+
Platform contract: **`docs/platform/client-error-visibility.md`**. Domain imports: **`domain-imports.mdc`**.
|
|
14
|
+
|
|
15
|
+
## Layers
|
|
16
|
+
|
|
17
|
+
| Layer | Outward errors | HTTP |
|
|
18
|
+
|-------|----------------|------|
|
|
19
|
+
| **Application** | **`application.shared.exceptions`**, **`InvalidPageTokenError`** | Handlers map type → status + catalog **`detail`** |
|
|
20
|
+
| **API** | Pydantic; **`HTTPException`** for transport-local guards | **422** field errors; router-chosen status + **`detail`** |
|
|
21
|
+
| **Domain typed** | Internal — not imported by API/application | No typed handlers |
|
|
22
|
+
| **Domain `BaseXxxException`** | Handler catch-all only | **500** if leaked |
|
|
23
|
+
|
|
24
|
+
## Application and domain
|
|
25
|
+
|
|
26
|
+
- Application **must not** import or raise typed domain exceptions. Signal via **`None`**, empty collections, or **`application.shared.exceptions`**.
|
|
27
|
+
- Typed domain exceptions inherit domain **`BaseXxxException`** → **`BaseDomainException`**. Export **only** **`BaseXxxException`** from domain **`__init__.py`**, not typed subclasses.
|
|
28
|
+
- **`DomainValidationError`** → dedicated **400** handler + **`GENERIC_BAD_REQUEST_DETAIL`**; do not put internal reason in HTTP **`detail`**.
|
|
29
|
+
- Leaked typed domain exception → **`BaseDomainException`** handler → **500** + **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`**.
|
|
30
|
+
|
|
31
|
+
## Handler registration
|
|
32
|
+
|
|
33
|
+
- Use **`register_exception_handler`** from **`core_framework.core.exception_handlers.common`** — not raw **`app.add_exception_handler`** elsewhere.
|
|
34
|
+
- Register handlers in **`core_framework/core/exception_handlers/setup.py`** and **`application.py`**: application types (specific before any base), **`InvalidPageTokenError`**, cashews **`RateLimitError`** (**429**), **`DomainValidationError`**, one **`BaseDomainException`** leak handler, then **`Exception`** unmapped.
|
|
35
|
+
- No per-domain handler modules for typed exceptions. Handlers translate only — no business logic or repository calls.
|
|
36
|
+
- Do not log **error** for expected application 4xx; **`DomainValidationError`** at **warning**/**info**.
|
|
37
|
+
|
|
38
|
+
## Catalog constants
|
|
39
|
+
|
|
40
|
+
**`GENERIC_BAD_REQUEST_DETAIL`** (400), **`GENERIC_NOT_FOUND_DETAIL`** (404), **`GENERIC_FORBIDDEN_DETAIL`** (403), **`GENERIC_CONFLICT_DETAIL`** (409), ingest 413/415, **`GENERIC_TOO_MANY_REQUESTS_DETAIL`** (429), **`GENERIC_SERVICE_UNAVAILABLE_DETAIL`** (503), **`GENERIC_INTERNAL_SERVER_ERROR_DETAIL`** (500).
|
|
41
|
+
|
|
42
|
+
## Anti-enumeration (public routes)
|
|
43
|
+
|
|
44
|
+
- Read-by-id: missing / hidden / withheld → same status + **`GENERIC_NOT_FOUND_DETAIL`** where flow docs align.
|
|
45
|
+
- Idempotent writes on unknown ids → **204** without leaking existence. Empty list pages are OK.
|
|
46
|
+
- Admin/internal routes may differ when documented. Intentional existence-check endpoints are separate product surface.
|
|
47
|
+
|
|
48
|
+
## Validation order
|
|
49
|
+
|
|
50
|
+
User-fixable input shape → API schemas (**422**) or router **`HTTPException`**. Use-case outcomes → application exceptions + handlers. Domain backstops → **`DomainValidationError`** → generic **400** (never domain text in **`detail`**).
|
|
51
|
+
|
|
52
|
+
## Logging
|
|
53
|
+
|
|
54
|
+
Do not **`logger.error`** at every domain **`raise`**.
|
|
55
|
+
|
|
56
|
+
Apply to new handlers and touched raise sites unless the task scopes repo-wide migration.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Domain repositories must not query other domains' Postgres schemas
|
|
3
|
+
globs:
|
|
4
|
+
- core_framework/domains/**/repository.py
|
|
5
|
+
alwaysApply: false
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Repository schema isolation
|
|
9
|
+
|
|
10
|
+
Each domain repository may only read/write tables in **its own** Postgres schema.
|
|
11
|
+
|
|
12
|
+
Canonical rule: `docs/platform/layers-and-boundaries.md` — *no cross-domain schema reads, writes, joins, or foreign keys*.
|
|
13
|
+
|
|
14
|
+
## Schema qualification
|
|
15
|
+
|
|
16
|
+
Repositories receive unquoted `schema` from `runtime.settings.postgres_schemas` in `dependencies.py` (keyword-only `__init__` arg). In `__init__`:
|
|
17
|
+
|
|
18
|
+
- `self.schema` — config schema name (e.g. `post`)
|
|
19
|
+
- `self.schema_sql` — `quote_postgres_identifier(schema)` for SQL interpolation
|
|
20
|
+
|
|
21
|
+
Use `{self.schema_sql}.table` in f-string SQL — not hard-coded `"post".` literals.
|
|
22
|
+
|
|
23
|
+
## Allowed in a repository
|
|
24
|
+
|
|
25
|
+
- SQL qualified with that domain's schema only (e.g. `{self.schema_sql}.posts` in `PostRepository`).
|
|
26
|
+
- **Within-schema** policy gates (e.g. `insert_post_like` checks `{self.schema_sql}.posts.status = active`).
|
|
27
|
+
- **Lookup mirrors** in the same schema (`user_blocks_lookup`, `user_restrictions_lookup`, `user_followers_lookup`) — synced by application flows; mirrors are not authoritative.
|
|
28
|
+
|
|
29
|
+
## Forbidden in a repository
|
|
30
|
+
|
|
31
|
+
- `FROM` / `JOIN` / `EXISTS` / `INSERT … SELECT` against another domain's schema.
|
|
32
|
+
- Importing another domain's `service`, `repository`, or models to enforce policy.
|
|
33
|
+
|
|
34
|
+
```python
|
|
35
|
+
# ❌ moderation/repository.py — cross-domain EXISTS (illustrative schema literals)
|
|
36
|
+
insert into {moderation_schema_sql}.post_reports (...)
|
|
37
|
+
select $1, $2, $3, $4
|
|
38
|
+
where exists (
|
|
39
|
+
select 1 from {post_schema_sql}.posts
|
|
40
|
+
where id = $2 and status = 'active'
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
# ❌ notification/repository.py — cross-domain mute gate
|
|
44
|
+
insert into {notification_schema_sql}.notification_mutes (...)
|
|
45
|
+
select ...
|
|
46
|
+
where exists (select 1 from {comment_schema_sql}.comments where ...)
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Alembic migrations (different convention)
|
|
50
|
+
|
|
51
|
+
Do **not** apply repository schema-qualification rules to `alembic/**/versions/*.py`.
|
|
52
|
+
|
|
53
|
+
Each domain Alembic tree sets `search_path` to that domain's schema in `env.py`. Migration SQL uses **unqualified** table and type names (`posts`, `post_reports`, `create type post_status …`) — not `"post".posts`.
|
|
54
|
+
|
|
55
|
+
**Exception — PL/pgSQL trigger / function bodies:** Runtime `search_path` for functions is not the migration session’s path, so audit trigger bodies may **hard-code** that domain’s schema qualifier (e.g. `"user".user_change_history`, `moderation.restriction_history`). That is required and accepted. Keep `[postgres_schemas]` values aligned with those literals; do not treat this as a B11 isolation violation.
|
|
56
|
+
|
|
57
|
+
Cross-domain rules still apply to migrations:
|
|
58
|
+
|
|
59
|
+
- No `REFERENCES` / FKs to tables in another domain's schema.
|
|
60
|
+
- No DDL that reads or writes another domain's objects.
|
|
61
|
+
|
|
62
|
+
Stay within the migration tree's domain; one schema per Alembic env.
|
|
63
|
+
|
|
64
|
+
## Where cross-domain policy belongs
|
|
65
|
+
|
|
66
|
+
**Application layer** (or domain service orchestration via dependencies, never cross-schema SQL):
|
|
67
|
+
|
|
68
|
+
```python
|
|
69
|
+
# ✅ application/posts/authenticated_service.py
|
|
70
|
+
post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=post_id)
|
|
71
|
+
if post is None or post.status != PostStatus.ACTIVE:
|
|
72
|
+
return False
|
|
73
|
+
return await moderation_deps.moderation_service.add_post_report(...)
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Before adding a repository write that depends on another domain's row state:
|
|
77
|
+
|
|
78
|
+
1. Can the owning domain gate it within its schema? → do that (likes, views, stats dirty).
|
|
79
|
+
2. Otherwise → gate in `application/**/*_service.py` via the owning domain's service API.
|
|
80
|
+
|
|
81
|
+
## Self-check (repositories only)
|
|
82
|
+
|
|
83
|
+
In `domains/<name>/repository.py`:
|
|
84
|
+
|
|
85
|
+
- Every table/type qualifier in SQL must use `{self.schema_sql}.…` (that domain's schema only).
|
|
86
|
+
- Do not hard-code `"user".`, `"post".`, etc. — use `self.schema` / `self.schema_sql` from config.
|
|
87
|
+
- Mirror lookup tables (`user_blocks_lookup`, etc.) still live under `{self.schema_sql}` when they belong to that domain's schema.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: code-review
|
|
3
|
+
description: Review code for quality, architecture compliance, and best practices. Use when the user asks for a code review, audit, or review.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Code Review
|
|
7
|
+
|
|
8
|
+
## Output format (required)
|
|
9
|
+
|
|
10
|
+
**Actionable findings only:**
|
|
11
|
+
|
|
12
|
+
- Bugs, wrong behavior, improvements, optimizations, doc/code contradictions, parallel implementation drift (sibling flows that diverge without documented reason).
|
|
13
|
+
- Prioritize by severity with file context and fix direction.
|
|
14
|
+
- **Do not** praise, summarize strengths, or pad with checklist pass narratives.
|
|
15
|
+
- One-line scope is fine. If nothing is wrong, say so in one sentence.
|
|
16
|
+
|
|
17
|
+
Do **not** flag documented accepted trade-offs in **`docs/platform/architecture-decisions.md`** unless the implementation violates them.
|
|
18
|
+
|
|
19
|
+
## Workflow
|
|
20
|
+
|
|
21
|
+
1. Read **`docs/platform/layers-and-boundaries.md`**, **`conventions.md`**, and **`architecture-decisions.md`** for the reviewed scope.
|
|
22
|
+
1. Apply **scoped rules** (`.cursor/rules/*.mdc`) matching files under review — especially **`error-boundary`**, **`domain-imports`**, **`api-layer`**, **`application-layer`**, **`strong-reads`**.
|
|
23
|
+
1. Report findings only — no filler.
|
|
24
|
+
|
|
25
|
+
## Quick checks
|
|
26
|
+
|
|
27
|
+
- Application services: no HTTP types, no domain exceptions, no Pydantic return types, one-line docstrings.
|
|
28
|
+
- API: thin routers, validation in schemas, orchestration in application — **fastapi** skill (`.agents/skills/fastapi/`) + **`api-layer`** / **`api-validation`** / **`error-boundary`** rules.
|
|
29
|
+
- Domain: imports only via **`__init__.py`** / **`dependencies`** from outer layers; no caller-context names (**`domain-caller-context`**).
|
|
30
|
+
- Read-after-write refetches use **`*_strong`** where applicable.
|
|
31
|
+
- **Python modernity (constitution):** prefer current 3.14 syntax in reviewed code — PEP 695 type params over module-level `TypeVar`/`ParamSpec`; no unnecessary `from __future__ import annotations`; builtins / `X | Y` over legacy `typing` aliases; `asyncio.TaskGroup` over `gather`.
|
|
32
|
+
|
|
33
|
+
## Parallel drift
|
|
34
|
+
|
|
35
|
+
Flag sibling modules with the same job but different structure (async layout, cleanup order, error/idempotency contracts) when docs do not explain the difference. Do **not** flag differences called out as intentional in design/flow docs or in **`docs/reviews/slices.md`** B7 **Do not flag** (for example root vs reply create-idempotency replay placement in **`docs/design/create-idempotency-design.md`**).
|
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
name: Development CI/CD
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
push:
|
|
5
|
+
branches:
|
|
6
|
+
- master
|
|
7
|
+
|
|
8
|
+
concurrency:
|
|
9
|
+
group: core-framework-development
|
|
10
|
+
cancel-in-progress: true
|
|
11
|
+
|
|
12
|
+
permissions: {}
|
|
13
|
+
|
|
14
|
+
jobs:
|
|
15
|
+
package-smoke:
|
|
16
|
+
runs-on: ubuntu-latest
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
steps:
|
|
20
|
+
- name: Checkout code
|
|
21
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
22
|
+
with:
|
|
23
|
+
persist-credentials: false
|
|
24
|
+
|
|
25
|
+
- name: Install uv
|
|
26
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
27
|
+
with:
|
|
28
|
+
version: "0.7.9"
|
|
29
|
+
enable-cache: true
|
|
30
|
+
cache-dependency-glob: "uv.lock"
|
|
31
|
+
|
|
32
|
+
- name: Set up Python
|
|
33
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
34
|
+
with:
|
|
35
|
+
python-version-file: ".python-version"
|
|
36
|
+
|
|
37
|
+
- name: Build wheel and verify install
|
|
38
|
+
run: |
|
|
39
|
+
set -euo pipefail
|
|
40
|
+
rm -rf dist
|
|
41
|
+
uv build
|
|
42
|
+
python -m venv /tmp/wheel-smoke
|
|
43
|
+
/tmp/wheel-smoke/bin/pip install --upgrade pip
|
|
44
|
+
WHL=$(echo dist/*.whl)
|
|
45
|
+
/tmp/wheel-smoke/bin/pip install "${WHL}"
|
|
46
|
+
/tmp/wheel-smoke/bin/python -c "
|
|
47
|
+
import core_framework
|
|
48
|
+
from core_framework.api.router import router
|
|
49
|
+
from core_framework.api.dependencies import (
|
|
50
|
+
OptionalUserID,
|
|
51
|
+
RequiredFirebaseUser,
|
|
52
|
+
RequiredUserID,
|
|
53
|
+
check_admin_role,
|
|
54
|
+
check_not_banned,
|
|
55
|
+
require_client_ip,
|
|
56
|
+
)
|
|
57
|
+
from core_framework.api.schemas import BasePatchRequest
|
|
58
|
+
from core_framework.api.users.shared.schemas import UserID, Username, UserReference
|
|
59
|
+
from core_framework.application.analytics.read_service import retrieve_analytics_kind_totals_for_range
|
|
60
|
+
from core_framework.application.analytics.registry import register_activity_source
|
|
61
|
+
from core_framework.application.bootstrap import configure_application_dependencies, configure_core_framework_runtime
|
|
62
|
+
from core_framework.application.email import (
|
|
63
|
+
ACCOUNT_DELETION_SCHEDULED_KIND,
|
|
64
|
+
enqueue_transactional_email,
|
|
65
|
+
register_email_content,
|
|
66
|
+
)
|
|
67
|
+
from core_framework.application.events.event_service import register_event_handler
|
|
68
|
+
from core_framework.application.events.models import Event
|
|
69
|
+
from core_framework.application.events.utm_capture_kinds import register_utm_capture_kind
|
|
70
|
+
from core_framework.application.shared.enums import EventType
|
|
71
|
+
from core_framework.application.shared.worker_jobs import enqueue_from_worker, enqueue_job
|
|
72
|
+
from core_framework.bundled_alembic import alembic_ini_path, bundled_alembic_root, iter_alembic_ini_paths
|
|
73
|
+
from core_framework.core import (
|
|
74
|
+
clear_all_rate_limit_counters,
|
|
75
|
+
clear_rate_limit_counters,
|
|
76
|
+
configure_core_runtime,
|
|
77
|
+
rate_limit,
|
|
78
|
+
seed_rate_limit_counters,
|
|
79
|
+
)
|
|
80
|
+
from core_framework.core.cache import close_cashews_backend, init_cashews_backend
|
|
81
|
+
from core_framework.core.database import Postgres
|
|
82
|
+
from core_framework.core.exception_handlers import setup_exception_handlers
|
|
83
|
+
from core_framework.core.exception_handlers.common import (
|
|
84
|
+
GENERIC_BAD_REQUEST_DETAIL,
|
|
85
|
+
register_exception_handler,
|
|
86
|
+
)
|
|
87
|
+
from core_framework.core.firebase import init_firebase
|
|
88
|
+
from core_framework.core.http_client import HttpClient
|
|
89
|
+
from core_framework.core.logging import setup_logging
|
|
90
|
+
from core_framework.core.middleware import setup_middleware
|
|
91
|
+
from core_framework.core.observability import (
|
|
92
|
+
configure_observability_providers,
|
|
93
|
+
instrument_arq_jobs,
|
|
94
|
+
setup_observability,
|
|
95
|
+
setup_worker_observability,
|
|
96
|
+
shutdown_observability,
|
|
97
|
+
with_arq_job_telemetry,
|
|
98
|
+
)
|
|
99
|
+
from core_framework.core.pagination import (
|
|
100
|
+
OffsetQueryParams,
|
|
101
|
+
PaginationResponse,
|
|
102
|
+
paginate_cursor,
|
|
103
|
+
paginate_offset,
|
|
104
|
+
)
|
|
105
|
+
from core_framework.core.runtime import CoreRuntime, build_core_runtime, unconfigured_dependency
|
|
106
|
+
from core_framework.core.settings import PostgresSchemasConfig, RetentionConfig, Settings, load_default_settings
|
|
107
|
+
from core_framework.domains.analytics import ActivityCount, ActivitySourcePort
|
|
108
|
+
from core_framework.domains.exceptions import BaseDomainException, DomainValidationError
|
|
109
|
+
from core_framework.domains.media import (
|
|
110
|
+
ATTACHMENT_INGEST_MAX_BYTES,
|
|
111
|
+
AVATAR_INGEST_MAX_BYTES,
|
|
112
|
+
BANNER_INGEST_MAX_BYTES,
|
|
113
|
+
)
|
|
114
|
+
import core_framework.domains.user.dependencies as user_deps
|
|
115
|
+
from core_framework.domains.utils import require_non_blank, require_non_blank_kwargs, require_positive_int
|
|
116
|
+
from core_framework.main import init_app
|
|
117
|
+
from core_framework.worker.main import (
|
|
118
|
+
CORE_FRAMEWORK_QUEUE_NAME,
|
|
119
|
+
WorkerSettings,
|
|
120
|
+
build_worker_settings_kwargs,
|
|
121
|
+
create_worker_settings_for_shared_runtime,
|
|
122
|
+
)
|
|
123
|
+
from core_framework.worker.schedules import build_schedules
|
|
124
|
+
from core_framework.worker.tasks import tasks
|
|
125
|
+
from core_framework.worker.worker_context import WorkerJobContext, WorkerStartupContext
|
|
126
|
+
assert router is not None
|
|
127
|
+
assert init_app is not None
|
|
128
|
+
assert Settings is not None
|
|
129
|
+
assert load_default_settings is not None
|
|
130
|
+
assert PostgresSchemasConfig is not None
|
|
131
|
+
assert RetentionConfig is not None
|
|
132
|
+
assert RequiredUserID is not None
|
|
133
|
+
assert OptionalUserID is not None
|
|
134
|
+
assert RequiredFirebaseUser is not None
|
|
135
|
+
assert check_not_banned is not None
|
|
136
|
+
assert check_admin_role is not None
|
|
137
|
+
assert require_client_ip is not None
|
|
138
|
+
assert BasePatchRequest is not None
|
|
139
|
+
assert UserReference is not None
|
|
140
|
+
assert UserID is not None
|
|
141
|
+
assert Username is not None
|
|
142
|
+
assert register_activity_source is not None
|
|
143
|
+
assert retrieve_analytics_kind_totals_for_range is not None
|
|
144
|
+
assert register_event_handler is not None
|
|
145
|
+
assert register_utm_capture_kind is not None
|
|
146
|
+
assert Event is not None
|
|
147
|
+
assert EventType is not None
|
|
148
|
+
assert register_email_content is not None
|
|
149
|
+
assert enqueue_transactional_email is not None
|
|
150
|
+
assert ACCOUNT_DELETION_SCHEDULED_KIND
|
|
151
|
+
assert configure_application_dependencies is not None
|
|
152
|
+
assert configure_core_framework_runtime is not None
|
|
153
|
+
assert configure_core_runtime is not None
|
|
154
|
+
assert CoreRuntime is not None
|
|
155
|
+
assert build_core_runtime is not None
|
|
156
|
+
assert unconfigured_dependency is not None
|
|
157
|
+
assert ActivitySourcePort is not None
|
|
158
|
+
assert ActivityCount is not None
|
|
159
|
+
assert AVATAR_INGEST_MAX_BYTES > 0
|
|
160
|
+
assert BANNER_INGEST_MAX_BYTES > 0
|
|
161
|
+
assert ATTACHMENT_INGEST_MAX_BYTES > 0
|
|
162
|
+
assert user_deps is not None
|
|
163
|
+
assert BaseDomainException is not None
|
|
164
|
+
assert DomainValidationError is not None
|
|
165
|
+
assert require_non_blank is not None
|
|
166
|
+
assert require_non_blank_kwargs is not None
|
|
167
|
+
assert require_positive_int is not None
|
|
168
|
+
assert Postgres is not None
|
|
169
|
+
assert HttpClient is not None
|
|
170
|
+
assert register_exception_handler is not None
|
|
171
|
+
assert GENERIC_BAD_REQUEST_DETAIL
|
|
172
|
+
assert setup_logging is not None
|
|
173
|
+
assert setup_middleware is not None
|
|
174
|
+
assert setup_exception_handlers is not None
|
|
175
|
+
assert setup_observability is not None
|
|
176
|
+
assert setup_worker_observability is not None
|
|
177
|
+
assert configure_observability_providers is not None
|
|
178
|
+
assert instrument_arq_jobs is not None
|
|
179
|
+
assert with_arq_job_telemetry is not None
|
|
180
|
+
assert shutdown_observability is not None
|
|
181
|
+
assert rate_limit is not None
|
|
182
|
+
assert clear_rate_limit_counters is not None
|
|
183
|
+
assert clear_all_rate_limit_counters is not None
|
|
184
|
+
assert seed_rate_limit_counters is not None
|
|
185
|
+
assert OffsetQueryParams is not None
|
|
186
|
+
assert PaginationResponse is not None
|
|
187
|
+
assert paginate_offset is not None
|
|
188
|
+
assert paginate_cursor is not None
|
|
189
|
+
assert init_cashews_backend is not None
|
|
190
|
+
assert close_cashews_backend is not None
|
|
191
|
+
assert init_firebase is not None
|
|
192
|
+
assert enqueue_job is not None
|
|
193
|
+
assert enqueue_from_worker is not None
|
|
194
|
+
assert WorkerSettings is not None
|
|
195
|
+
assert CORE_FRAMEWORK_QUEUE_NAME
|
|
196
|
+
assert build_worker_settings_kwargs is not None
|
|
197
|
+
assert create_worker_settings_for_shared_runtime is not None
|
|
198
|
+
assert build_schedules is not None
|
|
199
|
+
assert tasks
|
|
200
|
+
assert WorkerJobContext is not None
|
|
201
|
+
assert WorkerStartupContext is not None
|
|
202
|
+
assert bundled_alembic_root().is_dir()
|
|
203
|
+
assert (bundled_alembic_root() / 'user' / 'alembic.ini').is_file()
|
|
204
|
+
assert alembic_ini_path('user').is_file()
|
|
205
|
+
assert len(iter_alembic_ini_paths()) >= 1
|
|
206
|
+
"
|
|
207
|
+
/tmp/wheel-smoke/bin/pip install "${WHL}[testing]"
|
|
208
|
+
/tmp/wheel-smoke/bin/python -c "
|
|
209
|
+
from core_framework.testing import TestConfig, create_firebase_user_token
|
|
210
|
+
from core_framework.testing.media import (
|
|
211
|
+
attachment_upload_files,
|
|
212
|
+
avatar_upload_files,
|
|
213
|
+
banner_upload_files,
|
|
214
|
+
minimal_png_bytes,
|
|
215
|
+
reconfigure_media_for_testing,
|
|
216
|
+
)
|
|
217
|
+
assert TestConfig is not None
|
|
218
|
+
assert create_firebase_user_token is not None
|
|
219
|
+
assert reconfigure_media_for_testing is not None
|
|
220
|
+
assert minimal_png_bytes is not None
|
|
221
|
+
assert avatar_upload_files is not None
|
|
222
|
+
assert banner_upload_files is not None
|
|
223
|
+
assert attachment_upload_files is not None
|
|
224
|
+
"
|
|
225
|
+
test -x /tmp/wheel-smoke/bin/cf-alembic
|
|
226
|
+
|
|
227
|
+
app-docker:
|
|
228
|
+
needs: [package-smoke]
|
|
229
|
+
runs-on: ubuntu-latest
|
|
230
|
+
environment: development
|
|
231
|
+
permissions:
|
|
232
|
+
contents: read
|
|
233
|
+
steps:
|
|
234
|
+
- name: Checkout code
|
|
235
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
236
|
+
with:
|
|
237
|
+
persist-credentials: false
|
|
238
|
+
|
|
239
|
+
- name: Docker Meta
|
|
240
|
+
id: meta
|
|
241
|
+
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
|
242
|
+
with:
|
|
243
|
+
images: ${{ vars.DOCKERHUB_USERNAME }}/core-framework
|
|
244
|
+
flavor: latest=true
|
|
245
|
+
|
|
246
|
+
- name: Login to DockerHub
|
|
247
|
+
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
|
248
|
+
with:
|
|
249
|
+
username: ${{ vars.DOCKERHUB_USERNAME }}
|
|
250
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
251
|
+
|
|
252
|
+
- name: Setup Docker Buildx
|
|
253
|
+
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
|
254
|
+
|
|
255
|
+
- name: Build and Push
|
|
256
|
+
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
257
|
+
with:
|
|
258
|
+
context: .
|
|
259
|
+
file: ./deploy/app/dockerfile
|
|
260
|
+
target: api
|
|
261
|
+
push: true
|
|
262
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
263
|
+
|
|
264
|
+
worker-docker:
|
|
265
|
+
needs: [package-smoke]
|
|
266
|
+
runs-on: ubuntu-latest
|
|
267
|
+
environment: development
|
|
268
|
+
permissions:
|
|
269
|
+
contents: read
|
|
270
|
+
steps:
|
|
271
|
+
- name: Checkout code
|
|
272
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
273
|
+
with:
|
|
274
|
+
persist-credentials: false
|
|
275
|
+
|
|
276
|
+
- name: Docker Meta
|
|
277
|
+
id: meta
|
|
278
|
+
uses: docker/metadata-action@dc802804100637a589fabce1cb79ff13a1411302 # v6.2.0
|
|
279
|
+
with:
|
|
280
|
+
images: ${{ vars.DOCKERHUB_USERNAME }}/core-framework-worker
|
|
281
|
+
flavor: latest=true
|
|
282
|
+
|
|
283
|
+
- name: Login to DockerHub
|
|
284
|
+
uses: docker/login-action@af1e73f918a031802d376d3c8bbc3fe56130a9b0 # v4.4.0
|
|
285
|
+
with:
|
|
286
|
+
username: ${{ vars.DOCKERHUB_USERNAME }}
|
|
287
|
+
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
288
|
+
|
|
289
|
+
- name: Setup Docker Buildx
|
|
290
|
+
uses: docker/setup-buildx-action@bb05f3f5519dd87d3ba754cc423b652a5edd6d2c # v4.2.0
|
|
291
|
+
|
|
292
|
+
- name: Build and Push
|
|
293
|
+
uses: docker/build-push-action@53b7df96c91f9c12dcc8a07bcb9ccacbed38856a # v7.3.0
|
|
294
|
+
with:
|
|
295
|
+
context: .
|
|
296
|
+
file: ./deploy/app/dockerfile
|
|
297
|
+
target: worker
|
|
298
|
+
push: true
|
|
299
|
+
tags: ${{ steps.meta.outputs.tags }}
|
|
300
|
+
|
|
301
|
+
deploy:
|
|
302
|
+
needs: [app-docker, worker-docker]
|
|
303
|
+
permissions:
|
|
304
|
+
contents: read
|
|
305
|
+
uses: ./.github/workflows/_deploy.yml
|
|
306
|
+
with:
|
|
307
|
+
env_name: development
|
|
308
|
+
dockerhub_username: ${{ vars.DOCKERHUB_USERNAME }}
|
|
309
|
+
secrets:
|
|
310
|
+
SECRET_KEY: ${{ secrets.SECRET_KEY }}
|
|
311
|
+
WRITE_POSTGRES_PASSWORD: ${{ secrets.WRITE_POSTGRES_PASSWORD }}
|
|
312
|
+
READ_POSTGRES_PASSWORD: ${{ secrets.READ_POSTGRES_PASSWORD }}
|
|
313
|
+
FIREBASE_CONFIG: ${{ secrets.FIREBASE_CONFIG }}
|
|
314
|
+
IMAGE_SERVER_SSH_PRIVATE_KEY: ${{ secrets.IMAGE_SERVER_SSH_PRIVATE_KEY }}
|
|
315
|
+
IMAGE_SERVER_KNOWN_HOSTS: ${{ secrets.IMAGE_SERVER_KNOWN_HOSTS }}
|
|
316
|
+
DEPLOY_SERVER_SSH_KEY: ${{ secrets.DEPLOY_SERVER_SSH_KEY }}
|
|
317
|
+
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
|
|
318
|
+
|
|
319
|
+
post-deploy-e2e:
|
|
320
|
+
needs: [deploy]
|
|
321
|
+
runs-on: ubuntu-latest
|
|
322
|
+
environment: development
|
|
323
|
+
continue-on-error: true
|
|
324
|
+
permissions:
|
|
325
|
+
contents: read
|
|
326
|
+
steps:
|
|
327
|
+
- name: Checkout code
|
|
328
|
+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
|
|
329
|
+
with:
|
|
330
|
+
persist-credentials: false
|
|
331
|
+
|
|
332
|
+
- name: Install uv
|
|
333
|
+
uses: astral-sh/setup-uv@11f9893b081a58869d3b5fccaea48c9e9e46f990 # v8.3.2
|
|
334
|
+
with:
|
|
335
|
+
version: "0.7.9"
|
|
336
|
+
enable-cache: true
|
|
337
|
+
cache-dependency-glob: "uv.lock"
|
|
338
|
+
|
|
339
|
+
- name: Set up Python
|
|
340
|
+
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6.3.0
|
|
341
|
+
with:
|
|
342
|
+
python-version-file: ".python-version"
|
|
343
|
+
|
|
344
|
+
- name: Install the project
|
|
345
|
+
run: uv sync --locked --all-extras --dev
|
|
346
|
+
|
|
347
|
+
- name: Post-deploy E2E
|
|
348
|
+
run: uv run pytest tests/e2e
|
|
349
|
+
env:
|
|
350
|
+
E2E_API_BASE_URL: ${{ vars.E2E_API_BASE_URL }}
|
|
351
|
+
E2E_FIREBASE_API_KEY: ${{ secrets.E2E_FIREBASE_API_KEY }}
|
|
352
|
+
E2E_USER_EMAIL: ${{ vars.E2E_USER_EMAIL }}
|
|
353
|
+
E2E_USER_PASSWORD: ${{ secrets.E2E_USER_PASSWORD }}
|
|
354
|
+
E2E_ADMIN_EMAIL: ${{ vars.E2E_ADMIN_EMAIL }}
|
|
355
|
+
E2E_ADMIN_PASSWORD: ${{ secrets.E2E_ADMIN_PASSWORD }}
|
|
356
|
+
E2E_MEDIA_BASE_URL: ${{ vars.E2E_MEDIA_BASE_URL }}
|
|
357
|
+
E2E_ALLOWED_ORIGIN: ${{ vars.E2E_ALLOWED_ORIGIN }}
|
|
358
|
+
E2E_WORKER_POLL_TIMEOUT_SEC: ${{ vars.E2E_WORKER_POLL_TIMEOUT_SEC }}
|