core-framework 4.0.0__tar.gz → 4.0.1__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-4.0.0 → core_framework-4.0.1}/CHANGELOG.md +18 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/PKG-INFO +4 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/config.toml +1 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/config.toml.template +1 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/schemas.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/schemas.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/schemas.py +16 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/system/router.py +28 -29
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/access_service.py +8 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/admin_service.py +4 -12
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/aggregation_service.py +1 -13
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/cleanup_service.py +17 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/post_subject.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/rating_subject.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/send.py +5 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/notification_service.py +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/handlers.py +4 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/admin_service.py +2 -10
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/cleanup_service.py +16 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/public_service.py +27 -5
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/authenticated_service.py +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/purge_service.py +6 -10
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/worker_jobs.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/contributors.py +22 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/authenticated_service.py +3 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/public_service.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/user_deletion_service.py +10 -10
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/middleware.py +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/settings.py +6 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/README.md +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/__init__.py +2 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/constants.py +1 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/service.py +128 -19
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/README.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/__init__.py +2 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/models.py +6 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/repository.py +12 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/service.py +6 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/README.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/models.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/README.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/repository.py +36 -45
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/README.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/repository.py +12 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/service.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/group_repository.py +8 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/repository.py +5 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/service.py +9 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/auth.py +2 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/config.py +5 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/containers.py +17 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/firebase.py +70 -27
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/migrations.py +4 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/plugin.py +10 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +5 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +3 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +3 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_transactional_email.py +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/e2e-smoke-tests-design.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/edge-upload-limits.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/Caddyfile.example +6 -5
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/playbook/postgres-backup-playbook.md +4 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/image-server-ssh.md +11 -9
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/README.md +3 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/account-removal-spine-design.md +29 -21
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/account-removal-spine-implementation.md +10 -7
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/comment-subject-kinds-design.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/create-idempotency-design.md +1 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/event-outbox-design.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/outbox-admin-ops-design.md +1 -0
- {core_framework-4.0.0/docs/domains/ratings → core_framework-4.0.1/docs/design}/rating-implementation-plan.md +28 -28
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/transactional-email-design.md +4 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/README.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/auth/access_control.md +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/README.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/admin_comments.md +2 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/create_comment.md +12 -15
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/retrieve_comments.md +3 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/comments.md +3 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/posts.md +1 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/users.md +31 -27
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/mentions/mentions_in_content.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/moderator_actions.md +1 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/notifications/inbox-redesign-design.md +39 -37
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/admin_posts.md +2 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/retrieve_posts.md +3 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/README.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/admin_ratings.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/delete_rating.md +1 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/edit_rating.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating-design.md +106 -167
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_report.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_stats_aggregation.md +7 -9
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/rating_upvote.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/retrieve_ratings.md +1 -3
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/ratings/upsert_rating.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/account_deletion.md +3 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/blocks.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/change_history.md +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/follow-system-design.md +14 -11
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/follow.md +2 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/friendship.md +5 -7
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/groups-system-design.md +23 -19
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/groups.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/preferences.md +1 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/profile.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/public_profile.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/user_removal.md +1 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/user_stats_aggregation.md +0 -2
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/overview.md +2 -1
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/package-api.md +29 -10
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/testing-plugin-design.md +37 -35
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/workers.md +37 -35
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/architecture-decisions.md +45 -4
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/log.md +14 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/review-playbook.md +36 -31
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/slices.md +35 -22
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/testing.md +40 -37
- core_framework-4.0.1/docs/todo.md +17 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/pyproject.toml +9 -9
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_http_helpers.py +23 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/comments/router_test.py +3 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_deletion_integration_test.py +2 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/create_idempotency_retention_test.py +120 -21
- {core_framework-4.0.0 → core_framework-4.0.1}/uv.lock +221 -205
- core_framework-4.0.0/docs/todo.md +0 -9
- {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/fastapi +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/alembic-migrations.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/constitution.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-imports.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/error-boundary.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/flow-documentation.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/repository-schema-isolation.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/strong-reads.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/code-review/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/design-review/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/fastapi +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/grill/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/implement-feature/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.dockerignore +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package-lock.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package-smoke.sh +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/ci/package_smoke.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/_deploy.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/dev-ci-cd.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/manual-deployment.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/manual-observability-deployment.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.github/workflows/test.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.gitignore +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.pre-commit-config.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/.python-version +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/LICENSE +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/analytics/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/comment/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/extension/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/media/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/moderation/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/notification/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/post/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/rating/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/README +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/env.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/script.py.mako +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/alembic/user/alembic.ini +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/analytics/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/cache/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/comments/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/outbox/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/posts/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/ratings/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/ratings/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/admin/users/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/attachments/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/mappers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/authenticated/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/comments/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/events/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/groups/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/groups/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ingest_guards.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/notifications/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/pagination.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/mappers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/authenticated/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/authenticated/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/pagination.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/public/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/ratings/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/system/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/upload.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/authenticated/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/router.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/mappers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/api/users/shared/schemas.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/bucket_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/read_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/refresh_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/auth_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/token_verification.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/bootstrap.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/cache/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/authenticated_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/host_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/kind_registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/public_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/account_deletion_scheduled.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/enqueue.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/email/registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/event_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/event_token.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/authenticated_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/cleanup_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/group_invite_link_token.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/groups/strip_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/attachment_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/avatar_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/banner_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/appeal_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/moderator_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/report_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/moderation/user_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/friendship_notification_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/group_invite_notification_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/inbox_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/mute_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/preview.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/notifications/wipe_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/block_mirrors.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/events.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/ops_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/processing_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/outbox/restriction_mirrors.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/aggregation_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/authenticated_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/admin_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/aggregation_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/kind_registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/public_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/serialization.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/ratings/subject_existence.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/registry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/account_removal/runner.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/admin_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/aggregation_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/identity_enrichment.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/users/scheduled_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/asgi.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/bundled_alembic.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/cache.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/context.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/database.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/application.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/common.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exception_handlers/setup.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/firebase.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/http_client.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/http_probes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/logging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/observability.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/pagination.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/process.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/rate_limit.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/redis.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/core/runtime.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/analytics/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/ports/auth.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/auth/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/ports/subject.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/comment/repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/email/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/attachment/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/avatar/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/banner/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outbox_repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outbox_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/notification/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/admin.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/outbox/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/post/service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/rating/ports/subject_existence.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/repository_sql.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/constants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/dependencies.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/enums.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/group_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/models.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outbox_repository.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outbox_service.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/outcomes.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/user/utils.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/domains/utils.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/firebase/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/main.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/migrate_cli.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/py.typed +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/arq.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/blockbuster.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/testing/media.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/main.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_account_deletion.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/core_framework/worker/worker_context.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/docker-compose.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/app/dockerfile +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/.env.example +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/docker-compose.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/loki.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/prometheus.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/node.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/postgres.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.default/redis.yml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/targets.example/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/deploy/observability/tempo.yaml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/deploy-playbook.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/edge-rate-limits.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/caddy-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/postgres-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/redis-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/host-config-defaults-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/host-config-defaults-implementation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/postgres-backup-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/deployments/release-playbook.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/analytics-rollup-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/analytics-warehouse-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/cache-invalidation-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/events-ingest-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/media-cpu-off-api-refactor.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/media-storage-topology.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderation-restriction-fanout-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderator-surfaces-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/moderator-surfaces-implementation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/observability-lgtm-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/rating-thread-owner-cue-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/restriction-and-block-visibility-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/design/utm-events-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/analytics/admin_analytics_reads.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/auth/registration.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/cache/admin_cache_invalidation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_like.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_report.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/comment_stats_aggregation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/delete_comment.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/comments/edit_comment.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/overview.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/deletion/ratings.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/events/events.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/attachment_upload.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/avatar-upload-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/banner-upload-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/post-comment-attachments-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/upload-pipeline-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/media/upload_pipeline.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/appeals.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/internal_notes.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/reports.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/moderation/restrictions.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/notifications/notification_inbox.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/outbox/admin_outbox_ops.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/author_context.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/create_post.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/delete_post.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/edit_post.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/hashtag_discovery.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_like.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_report.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_stats_aggregation.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/posts/post_visibility.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/account.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/admin_users.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/avatar.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/banner.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/check_username_exists.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/friendship-system-design.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/my_posts_and_comments.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/domains/users/username_suggest.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/api.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/capability-wiring.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/library/core-framework-migration.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/client-error-visibility.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/conventions.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/database-triggers.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/domain-services-and-adapters.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/glossary.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/layers-and-boundaries.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/patch-update-typed-payload.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/platform/response-composition-and-caching.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/docs/reviews/README.md +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/firebase_config.example.json +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/makefile +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tach.toml +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_auth.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_canaries.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_media.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_settings.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/_upload_payloads.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/_http_error_details.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/_poll.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_auth_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_destructive_delete_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_user_deletion_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/_user_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/_auth_cases.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/analytics/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/cache/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/cache/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderation/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/outbox/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/posts/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/posts/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/users/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/admin/users/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/attachments/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/auth/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/auth/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/comments/public/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/create_idempotency_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/events/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/groups/groups_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/notifications/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/followers_visibility_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/posts/public/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/rate_limit_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/account_deletion_email_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/profile_media_upload_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/authenticated/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/public/router_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_arq_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/_media_upload_helpers.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/account_deletion_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/analytics_refresh_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/conftest.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/moderation_outbox_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/mute_lift_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/profile_media_upload_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/restriction_fanout_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/integration/worker/user_outbox_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/comments/kind_registry_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/notifications/preview_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/ratings/kind_registry_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/account_removal_registry_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/account_removal_runner_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/core/pagination_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/docs/api_routes_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
- {core_framework-4.0.0 → core_framework-4.0.1}/tests/unit/worker/tasks_registration_test.py +0 -0
|
@@ -4,6 +4,19 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [4.0.1] - 2026-09-17
|
|
8
|
+
|
|
9
|
+
### Fixed
|
|
10
|
+
|
|
11
|
+
- **Testing plugin:** start-on-demand Auth emulator raises **`RuntimeError`** when the **`firebase`** CLI is missing (not a raw **`FileNotFoundError`**); the timeout message distinguishes spawn-from-CLI vs a port that is open but not serving Auth. See **`docs/testing.md`**.
|
|
12
|
+
- **Testing plugin:** bundled Alembic uses the patched Testcontainers Settings instance when the host **`settings_loader`** is a host subclass cache, not **`core_framework.core.settings.load_default_settings`**. See **`docs/testing.md`**.
|
|
13
|
+
- **Testing plugin:** a returned **`TestConfig`** always sets **`FIREBASE_AUTH_EMULATOR_HOST`**, so **`client`** lifespan **`init_firebase`** does not require **`firebase_config.json`**. Auth fixtures and the emulator process still require **`firebase_project_id="test"`**. Session **`client`** uses base URL **`http://test`**. See **`docs/testing.md`**.
|
|
14
|
+
|
|
15
|
+
### Changed
|
|
16
|
+
|
|
17
|
+
- **Host enqueue:** **`enqueue_job`** accepts a host task name string (**`job_name: WorkerJobName | str`**), matching **`enqueue_from_worker`**. See **`docs/library/package-api.md`**.
|
|
18
|
+
- **CORS:** Default **`allowed_headers`** includes **`If-None-Match`**. CORS **`expose_headers`** includes **`ETag`** (with **`Retry-After`** and **`X-Request-ID`**). Hosts that overlay **`[cors].allowed_headers`** must include **`If-None-Match`** (an overlay replaces the default list).
|
|
19
|
+
|
|
7
20
|
## [4.0.0] - 2026-09-12
|
|
8
21
|
|
|
9
22
|
### Breaking
|
|
@@ -90,7 +103,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
90
103
|
- **Prometheus same-host scrape default:** Manual Observability Deployment omit/empty/comment-only **`PROMETHEUS_TARGETS_{NODE,POSTGRES,REDIS}`** writes **`host.docker.internal`** / **`instance: app`** from **`deploy/observability/targets.default/`** (`:9100` / `:9187` / `:9121`). A leftover empty variable is not “no scrapes” — set **`[]`** for no targets. Overlay YAML for extra hosts. Manual install copies those defaults into **`targets/{node,postgres,redis}/hosts.yml`**. See **`docs/deployments/deploy-playbook.md`** and **`docs/deployments/guides/setup/observability-lgtm-setup.md`**.
|
|
91
104
|
- **Host config defaults:** Settings Field defaults (deploy-template literals) and **zone fill** / **trusted-host fill** / **cors-origin fill** / **e2e-origin fill** / **publish-parent fill** so a load with only the Settings-required set succeeds. Empty product host / publish root no longer fail-closed. Empty **`public_path_prefix`** takes the Field default (see **Breaking**). A host bump applies Field defaults for omitted keys; **zone fill**, **trusted-host fill**, and **cors-origin fill** need **`public_zone`** in a Settings source; deleting GitHub constants requires omitting those keys from *the host’s* template (a bump does not rewrite the host workflow). **development** blank/omitted **`OPENAPI_URL`** → **`/openapi.json`** (`/docs`); **`OPENAPI_URL=off`** disables OpenAPI in any environment; **`APP_DEBUG`** stays **false** everywhere unless overlaid; **production** stays OpenAPI **off**. Omit **`ALLOWED_HOSTS`** with **`PUBLIC_ZONE`** set → **`localhost`**, **`127.0.0.1`**, **`api.{zone}`** (plus **`test`** outside production). Omit **`[cors]`** or **`CORS_ALLOWED_ORIGINS`** with **`PUBLIC_ZONE`** set → **`https://{zone}`**, **`https://www.{zone}`** (plus **`http://localhost:3000`**, **`http://127.0.0.1:3000`** outside production; production fill never adds a loopback origin). Omit **`WRITE_POSTGRES_HOST`** / **`REDIS_HOST`** → **`127.0.0.1`**. Omit **`WRITE_POSTGRES_DB`** → **`postgres`**. Write Postgres **user** stays required. Omit **`E2E_API_BASE_URL`** / **`E2E_MEDIA_BASE_URL`** / **`E2E_ALLOWED_ORIGIN`** on **development** smoke with **`PUBLIC_ZONE`** set → **`https://api.{zone}`**, **`https://media.{zone}`**, **`https://{zone}`**. See **`docs/library/package-api.md`**, **`docs/deployments/deploy-playbook.md`**, and **`docs/deployments/host-config-defaults-design.md`**.
|
|
92
105
|
- **Product identity gate name:** **`check_caller_identity`** is the product identity gate (empty identity and account-removal **403** on every method; ban **403** on mutates only). **`check_not_banned`** remains as an alias of the same callable. Host admin routes still use **`check_admin_identity`**. See **`docs/library/package-api.md`**.
|
|
93
|
-
- **User service pair-block and ban reads removed:** **`user_deps.user_service.retrieve_block_exists_between`**, **`retrieve_block_exists_between_strong`**, and **`retrieve_restriction_lookup_is_banned`** are gone (no core caller after see went one-way). Hosts that AND availability before
|
|
106
|
+
- **User service pair-block and ban reads removed:** **`user_deps.user_service.retrieve_block_exists_between`**, **`retrieve_block_exists_between_strong`**, and **`retrieve_restriction_lookup_is_banned`** are gone (no core caller after see went one-way). Hosts that AND availability before friends-only unlock use **`retrieve_restriction_lookup_is_muted_or_banned`** (mirror-eventual) per user; viewer-blocked-target is **`retrieve_block_exists_strong`**. See **`docs/library/package-api.md`**.
|
|
94
107
|
- **Worker composition imports:** Importing **`build_worker_settings_kwargs`**, **`CORE_FRAMEWORK_QUEUE_NAME`**, or **`create_worker_settings_for_shared_runtime`** no longer constructs **`Settings`**. Accessing **`WorkerSettings`** (including **`arq core_framework.worker.main.WorkerSettings`**) still calls **`load_default_settings()`** to populate ARQ class attributes. See **`docs/library/package-api.md`**.
|
|
95
108
|
- **Restriction-change fan-out:** Restriction writes still use the same HTTP routes. Lookup mirrors stay must-converge on the moderation outbox (Barrier 1). When mute/ban/unrestrict **truth** actually changes, the outbox handler enqueues Barrier 2 **after** mirrors land (`process_restriction_reactions`, job id `restriction_reactions:{user_id}:{commit_token}:{trigger}`, `keep_result=0`). Groups strip is must-converge on entered-banned, with an hourly heal (`schedule_restriction_heals` at **:00 UTC**) that re-enqueues leftover banned ∩ still-in-groups (`commit_token` `heal`; heal skips actor wipe). Actor inbox wipe is best-effort inline in producer Barrier 2. Repeat-ban / mirror-repair / warn-insert stay mirrors-only (`trigger` `none`). Producers write payload version **2**; other versions dead-letter. Hosts register **`register_restriction_mirror`** / **`register_restriction_reaction`** / **`register_restriction_heal`** after configure, on **API and worker** (worker is load-bearing). Mute/ban no longer produce or register `process_ban_user_side_effects` / `process_actor_notification_wipe`. User-detail invalidation stays on the command path. Ban does not revoke refresh tokens. See **`docs/design/moderation-restriction-fanout-design.md`**, **`docs/library/package-api.md`**, and **`docs/library/workers.md`**.
|
|
96
109
|
- **Account-removal analytics carve-out:** Raw `utm_events.user_id` / `request_context.viewer_id` and `post_views.request_context.viewer_id` are not spine contributors. They age out by retention/rollup; aggregate counts stay. See **`docs/design/account-removal-spine-design.md`** decision **#8**.
|
|
@@ -344,7 +357,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
344
357
|
### Breaking
|
|
345
358
|
|
|
346
359
|
- **Breaking (clients — events ingest):** Traffic source for request context uses the **`client-referrer`** header instead of browser **`Referer`**. Clients should send an explicit referrer URL (for example captured from `document.referrer` on first load).
|
|
347
|
-
- **Breaking (clients — events ingest):** Rename event type **`view`** → **`impression`** on `POST /events`. Clients and hosts must send `type: "impression"` for subject-impression batches (post views,
|
|
360
|
+
- **Breaking (clients — events ingest):** Rename event type **`view`** → **`impression`** on `POST /events`. Clients and hosts must send `type: "impression"` for subject-impression batches (post views, host-owned subject impressions, etc.). Core enum: **`EventType.IMPRESSION`** (replaces **`EventType.VIEW`**). Host handlers registered on `"view"` must re-register on **`"impression"`**.
|
|
348
361
|
- **Breaking (hosts — imports):** Rename **`EVENT_TOKEN_MAX_AGE_VIEW_SECONDS`** → **`EVENT_TOKEN_MAX_AGE_SECONDS`** in **`core_framework.application.events.event_token`** (behavior unchanged; token max-age remains 600s for all event types).
|
|
349
362
|
|
|
350
363
|
### Migration
|
|
@@ -412,7 +425,7 @@ Transactional outbox (block, follow, restriction), post views retention, and inc
|
|
|
412
425
|
- Run **`cf-alembic`** so the **`user`** migration stream applies **`user_add_event_outbox`** (`"user".event_outbox`).
|
|
413
426
|
- Hosts that only run the API (no worker) still need **`[outbox]`** in config because **`Settings`** requires it; the API does not connect that pool.
|
|
414
427
|
- **Breaking (hosts — migration):** When upgrading to a release that includes restriction outbox (Phase 3), run **`cf-alembic`** so the **`moderation`** migration stream applies **`moderation_add_event_outbox`** (`moderation.event_outbox`). The worker must run **`schedule_poll_moderation_outbox`** (registered in core worker schedules) for durable restriction mirror fanout.
|
|
415
|
-
- **Breaking (hosts — config):** Add **`[retention]`** with **`post_views_retention_days`** (default **90**). Deploy variable **`RETENTION_POST_VIEWS_DAYS`**. Hosts that subclass **`Settings`** may extend **`RetentionConfig`** with additional retention keys (for example
|
|
428
|
+
- **Breaking (hosts — config):** Add **`[retention]`** with **`post_views_retention_days`** (default **90**). Deploy variable **`RETENTION_POST_VIEWS_DAYS`**. Hosts that subclass **`Settings`** may extend **`RetentionConfig`** with additional retention keys (for example a host-owned view table).
|
|
416
429
|
- **Breaking (hosts — migration):** When upgrading to a release that includes post views retention, run **`cf-alembic`** so the **`post`** migration stream applies **`post_post_views_retention_high_water_mark`** (`post_stats.view_count_aggregated_up_to`, **`post_views`** retention indexes, backfill). The worker must run **`schedule_prune_post_views`** (registered in core worker schedules) for age-based **`post_views`** pruning.
|
|
417
430
|
|
|
418
431
|
## [2.1.0] - 2026-06-25
|
|
@@ -770,4 +783,5 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
|
|
|
770
783
|
[3.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.1.0...v3.2.0
|
|
771
784
|
[3.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.2.0...v3.3.0
|
|
772
785
|
[4.0.0]: https://github.com/NepNepFFXIV/core-framework/compare/v3.3.0...v4.0.0
|
|
773
|
-
[
|
|
786
|
+
[4.0.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...v4.0.1
|
|
787
|
+
[unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 4.0.
|
|
3
|
+
Version: 4.0.1
|
|
4
4
|
Summary: Core framework package (import as core_framework)
|
|
5
5
|
Project-URL: Homepage, https://github.com/NepNepFFXIV/core-framework
|
|
6
6
|
Project-URL: Repository, https://github.com/NepNepFFXIV/core-framework
|
|
@@ -8,7 +8,7 @@ License-Expression: MIT
|
|
|
8
8
|
License-File: LICENSE
|
|
9
9
|
Requires-Python: >=3.14
|
|
10
10
|
Requires-Dist: aiofiles>=25.1.0
|
|
11
|
-
Requires-Dist: alembic>=1.
|
|
11
|
+
Requires-Dist: alembic>=1.20.0
|
|
12
12
|
Requires-Dist: arq>=0.28.0
|
|
13
13
|
Requires-Dist: asyncer>=0.0.18
|
|
14
14
|
Requires-Dist: asyncpg>=0.31.0
|
|
@@ -30,11 +30,11 @@ Requires-Dist: opentelemetry-instrumentation-redis<0.66,>=0.65b0
|
|
|
30
30
|
Requires-Dist: opentelemetry-sdk<1.45,>=1.44.0
|
|
31
31
|
Requires-Dist: opentelemetry-semantic-conventions<0.66,>=0.65b0
|
|
32
32
|
Requires-Dist: orjson>=3.12.0
|
|
33
|
-
Requires-Dist: pillow-heif>=1.
|
|
33
|
+
Requires-Dist: pillow-heif>=1.7.0
|
|
34
34
|
Requires-Dist: pillow>=12.3.0
|
|
35
35
|
Requires-Dist: pyinstrument>=5.1.3
|
|
36
36
|
Requires-Dist: python-ulid>=4.0.1
|
|
37
|
-
Requires-Dist: resend[async]>=2.
|
|
37
|
+
Requires-Dist: resend[async]>=2.44.0
|
|
38
38
|
Requires-Dist: structlog>=26.1.0
|
|
39
39
|
Requires-Dist: tenacity>=9.1.4
|
|
40
40
|
Provides-Extra: testing
|
|
@@ -123,7 +123,7 @@ class UserDetailResponse(BaseModel):
|
|
|
123
123
|
class UserChangeHistoryItem(BaseModel):
|
|
124
124
|
user_id: UserID
|
|
125
125
|
actor: UserReference
|
|
126
|
-
entity_type:
|
|
126
|
+
entity_type: Literal["users", "user_profiles", "user_deletions"]
|
|
127
127
|
field: str
|
|
128
128
|
old_value: str | None
|
|
129
129
|
new_value: str | None
|
|
@@ -2,7 +2,12 @@ from typing import Annotated
|
|
|
2
2
|
|
|
3
3
|
from pydantic import AfterValidator, Field
|
|
4
4
|
|
|
5
|
-
from core_framework.domains.comment import
|
|
5
|
+
from core_framework.domains.comment import (
|
|
6
|
+
MAX_CONTENT_LENGTH,
|
|
7
|
+
SUBJECT_ID_MAX_LENGTH,
|
|
8
|
+
SUBJECT_KIND_MAX_LENGTH,
|
|
9
|
+
SUBJECT_KIND_PATTERN,
|
|
10
|
+
)
|
|
6
11
|
|
|
7
12
|
|
|
8
13
|
def _validate_comment_content_not_blank(v: str) -> str:
|
|
@@ -23,7 +28,16 @@ CommentSubjectKind = Annotated[
|
|
|
23
28
|
Field(min_length=1, max_length=SUBJECT_KIND_MAX_LENGTH, pattern=SUBJECT_KIND_PATTERN),
|
|
24
29
|
]
|
|
25
30
|
|
|
31
|
+
|
|
32
|
+
def _validate_comment_subject_id_not_blank(v: str) -> str:
|
|
33
|
+
stripped = v.strip()
|
|
34
|
+
if not stripped:
|
|
35
|
+
raise ValueError("must not be blank")
|
|
36
|
+
return stripped
|
|
37
|
+
|
|
38
|
+
|
|
26
39
|
CommentSubjectId = Annotated[
|
|
27
40
|
str,
|
|
28
|
-
Field(min_length=1, max_length=
|
|
41
|
+
Field(min_length=1, max_length=SUBJECT_ID_MAX_LENGTH),
|
|
42
|
+
AfterValidator(_validate_comment_subject_id_not_blank),
|
|
29
43
|
]
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
from asyncio import TaskGroup
|
|
1
|
+
from asyncio import TaskGroup, timeout
|
|
2
|
+
from collections.abc import Awaitable
|
|
2
3
|
from typing import Final
|
|
3
4
|
|
|
4
5
|
from cashews import cache
|
|
5
6
|
from fastapi import APIRouter, Request, Response, status
|
|
7
|
+
from structlog import get_logger
|
|
6
8
|
|
|
7
9
|
from core_framework.core.runtime import CoreRuntime
|
|
8
10
|
|
|
@@ -12,6 +14,9 @@ router = APIRouter(
|
|
|
12
14
|
|
|
13
15
|
OK_STATUS: Final[str] = "OK"
|
|
14
16
|
ERROR_STATUS: Final[str] = "ERROR"
|
|
17
|
+
PROBE_TIMEOUT_SECONDS: Final[float] = 2.0
|
|
18
|
+
|
|
19
|
+
logger = get_logger(__name__)
|
|
15
20
|
|
|
16
21
|
|
|
17
22
|
def _get_runtime(request: Request) -> CoreRuntime:
|
|
@@ -24,40 +29,34 @@ def _get_runtime(request: Request) -> CoreRuntime:
|
|
|
24
29
|
)
|
|
25
30
|
|
|
26
31
|
|
|
27
|
-
async def
|
|
32
|
+
async def _run_probe(name: str, probe: Awaitable[object]) -> str:
|
|
28
33
|
try:
|
|
29
|
-
async with
|
|
30
|
-
await
|
|
34
|
+
async with timeout(PROBE_TIMEOUT_SECONDS):
|
|
35
|
+
await probe
|
|
31
36
|
except Exception:
|
|
37
|
+
logger.exception("Readiness probe failed", dependency=name)
|
|
32
38
|
return ERROR_STATUS
|
|
33
39
|
return OK_STATUS
|
|
34
40
|
|
|
35
41
|
|
|
36
|
-
async def
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
await connection.fetchval("select 1")
|
|
40
|
-
except Exception:
|
|
41
|
-
return ERROR_STATUS
|
|
42
|
-
return OK_STATUS
|
|
42
|
+
async def _probe_write_postgres(runtime: CoreRuntime) -> None:
|
|
43
|
+
async with runtime.write_postgres.get_connection() as connection:
|
|
44
|
+
await connection.fetchval("select 1")
|
|
43
45
|
|
|
44
46
|
|
|
45
|
-
async def
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
return ERROR_STATUS
|
|
49
|
-
await cache.ping()
|
|
50
|
-
except Exception:
|
|
51
|
-
return ERROR_STATUS
|
|
52
|
-
return OK_STATUS
|
|
47
|
+
async def _probe_read_postgres(runtime: CoreRuntime) -> None:
|
|
48
|
+
async with runtime.read_postgres.get_connection() as connection:
|
|
49
|
+
await connection.fetchval("select 1")
|
|
53
50
|
|
|
54
51
|
|
|
55
|
-
async def
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
52
|
+
async def _probe_cashews_cache() -> None:
|
|
53
|
+
if not cache.is_setup() or not cache.is_init:
|
|
54
|
+
raise RuntimeError("Cashews backend is not ready")
|
|
55
|
+
await cache.ping()
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
async def _probe_redis_queue(runtime: CoreRuntime) -> None:
|
|
59
|
+
await runtime.redis_queue.redis_queue.ping()
|
|
61
60
|
|
|
62
61
|
|
|
63
62
|
@router.get("/health")
|
|
@@ -70,10 +69,10 @@ async def readiness_check(request: Request, response: Response) -> dict[str, str
|
|
|
70
69
|
runtime = _get_runtime(request)
|
|
71
70
|
|
|
72
71
|
async with TaskGroup() as tg:
|
|
73
|
-
write_task = tg.create_task(_probe_write_postgres(runtime))
|
|
74
|
-
read_task = tg.create_task(_probe_read_postgres(runtime))
|
|
75
|
-
cashews_task = tg.create_task(_probe_cashews_cache())
|
|
76
|
-
queue_task = tg.create_task(_probe_redis_queue(runtime))
|
|
72
|
+
write_task = tg.create_task(_run_probe("write_postgres", _probe_write_postgres(runtime)))
|
|
73
|
+
read_task = tg.create_task(_run_probe("read_postgres", _probe_read_postgres(runtime)))
|
|
74
|
+
cashews_task = tg.create_task(_run_probe("cashews_cache", _probe_cashews_cache()))
|
|
75
|
+
queue_task = tg.create_task(_run_probe("redis_queue", _probe_redis_queue(runtime)))
|
|
77
76
|
|
|
78
77
|
write_postgres_status = write_task.result()
|
|
79
78
|
read_postgres_status = read_task.result()
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/auth/access_service.py
RENAMED
|
@@ -6,7 +6,8 @@ import core_framework.domains.moderation.dependencies as moderation_deps
|
|
|
6
6
|
import core_framework.domains.user.dependencies as user_deps
|
|
7
7
|
from core_framework.application.auth.models import UserDetail
|
|
8
8
|
from core_framework.core import CacheKey
|
|
9
|
-
from core_framework.domains.
|
|
9
|
+
from core_framework.domains.moderation import UserModeration
|
|
10
|
+
from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
|
|
10
11
|
|
|
11
12
|
|
|
12
13
|
@cache.early(
|
|
@@ -17,6 +18,12 @@ from core_framework.domains.user import UserIdentity
|
|
|
17
18
|
)
|
|
18
19
|
async def get_user_detail(*, user_id: str) -> UserDetail:
|
|
19
20
|
"""Return cached identity, moderation, and account-removal fence."""
|
|
21
|
+
if user_id in RESERVED_USER_IDS:
|
|
22
|
+
return UserDetail(
|
|
23
|
+
identity=UserIdentity.DEFAULT,
|
|
24
|
+
moderation=UserModeration.DEFAULT,
|
|
25
|
+
account_removal_in_progress=False,
|
|
26
|
+
)
|
|
20
27
|
async with asyncio.TaskGroup() as tg:
|
|
21
28
|
identity_task = tg.create_task(user_deps.user_service.retrieve_user_identity_mapping(user_ids={user_id}))
|
|
22
29
|
moderation_task = tg.create_task(
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/admin_service.py
RENAMED
|
@@ -156,7 +156,7 @@ async def retrieve_admin_comments(
|
|
|
156
156
|
|
|
157
157
|
|
|
158
158
|
async def tombstone_comment_for_moderator(*, actor_id: str, comment_id: str) -> None:
|
|
159
|
-
"""Tombstone a comment as ``tombstoned_by_moderator`` and
|
|
159
|
+
"""Tombstone a comment as ``tombstoned_by_moderator`` and enqueue cleanup."""
|
|
160
160
|
impact = await comment_deps.comment_service.tombstone_comment(
|
|
161
161
|
comment_id=comment_id,
|
|
162
162
|
tombstone_status=CommentStatus.TOMBSTONED_BY_MODERATOR,
|
|
@@ -164,15 +164,7 @@ async def tombstone_comment_for_moderator(*, actor_id: str, comment_id: str) ->
|
|
|
164
164
|
if impact is None:
|
|
165
165
|
raise ContentNotFoundException()
|
|
166
166
|
|
|
167
|
-
await enqueue_comment_tombstone_cleanup(impact=impact)
|
|
168
|
-
await moderation_deps.moderation_service.record_moderation_action(
|
|
169
|
-
actor_id=actor_id,
|
|
170
|
-
action_type=ModerationActionType.TOMBSTONE_COMMENT,
|
|
171
|
-
action_metadata={
|
|
172
|
-
"comment_id": comment_id,
|
|
173
|
-
"author_id": impact.author_id_before_tombstone,
|
|
174
|
-
},
|
|
175
|
-
)
|
|
167
|
+
await enqueue_comment_tombstone_cleanup(impact=impact, actor_id=actor_id)
|
|
176
168
|
stats_impact = CommentStatsImpact(
|
|
177
169
|
comment_id=impact.comment_id,
|
|
178
170
|
subject_kind=impact.subject_kind,
|
|
@@ -395,7 +387,7 @@ async def run_destructive_comment_delete(
|
|
|
395
387
|
subject_id=impact.subject_id,
|
|
396
388
|
parent_comment_id=impact.parent_comment_id,
|
|
397
389
|
)
|
|
398
|
-
|
|
390
|
+
else:
|
|
399
391
|
if resolved_subject_kind is None or resolved_subject_id is None:
|
|
400
392
|
logger.error(
|
|
401
393
|
"Destructive comment delete missing subject context; finalizing without stats",
|
|
@@ -404,7 +396,7 @@ async def run_destructive_comment_delete(
|
|
|
404
396
|
attachment_asset_count=len(precollected_attachment_asset_ids),
|
|
405
397
|
)
|
|
406
398
|
await finalize_deleted_comments_cleanup(
|
|
407
|
-
deleted_comment_ids=precollected_comment_ids,
|
|
399
|
+
deleted_comment_ids=precollected_comment_ids | {comment_id},
|
|
408
400
|
attachment_asset_ids=precollected_attachment_asset_ids,
|
|
409
401
|
)
|
|
410
402
|
else:
|
|
@@ -1,14 +1,10 @@
|
|
|
1
1
|
from asyncio import TaskGroup
|
|
2
2
|
|
|
3
|
-
from structlog import get_logger
|
|
4
|
-
|
|
5
3
|
import core_framework.domains.comment.dependencies as comment_deps
|
|
6
4
|
import core_framework.domains.moderation.dependencies as moderation_deps
|
|
7
5
|
from core_framework.application.comments.kind_registry import get_comment_kind_subject
|
|
8
6
|
from core_framework.domains.comment import CommentStatsImpact
|
|
9
7
|
|
|
10
|
-
logger = get_logger(__name__)
|
|
11
|
-
|
|
12
8
|
|
|
13
9
|
async def aggregate_comment_stats(*, comment_id: str) -> None:
|
|
14
10
|
"""Recompute and persist aggregate stats for a comment."""
|
|
@@ -46,12 +42,4 @@ async def mark_parent_stats_dirty_for_comment_impact(*, impact: CommentStatsImpa
|
|
|
46
42
|
port = get_comment_kind_subject(kind=impact.subject_kind)
|
|
47
43
|
if port is None:
|
|
48
44
|
return
|
|
49
|
-
|
|
50
|
-
await port.mark_parent_stats_dirty(subject_id=impact.subject_id)
|
|
51
|
-
except Exception:
|
|
52
|
-
logger.exception(
|
|
53
|
-
"Failed to mark parent stats dirty",
|
|
54
|
-
comment_id=impact.comment_id,
|
|
55
|
-
subject_kind=impact.subject_kind,
|
|
56
|
-
subject_id=impact.subject_id,
|
|
57
|
-
)
|
|
45
|
+
await port.mark_parent_stats_dirty(subject_id=impact.subject_id)
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/cleanup_service.py
RENAMED
|
@@ -17,6 +17,7 @@ from core_framework.domains.comment import (
|
|
|
17
17
|
CommentStatus,
|
|
18
18
|
CommentTombstoneImpact,
|
|
19
19
|
)
|
|
20
|
+
from core_framework.domains.moderation import ModerationActionType
|
|
20
21
|
|
|
21
22
|
logger = get_logger(__name__)
|
|
22
23
|
|
|
@@ -56,8 +57,10 @@ async def run_comment_tombstone_cleanup(
|
|
|
56
57
|
parent_comment_id: str | None,
|
|
57
58
|
tombstone_status: str,
|
|
58
59
|
attachment_asset_ids: list[str],
|
|
60
|
+
actor_id: str | None = None,
|
|
61
|
+
worker_job_id: str | None = None,
|
|
59
62
|
) -> None:
|
|
60
|
-
"""Rebuild tombstone impact from ARQ primitives
|
|
63
|
+
"""Rebuild tombstone impact from ARQ primitives, run finalize cleanup, and audit when queued by a moderator."""
|
|
61
64
|
await finalize_comment_tombstone_cleanup(
|
|
62
65
|
impact=CommentTombstoneImpact(
|
|
63
66
|
comment_id=comment_id,
|
|
@@ -69,9 +72,19 @@ async def run_comment_tombstone_cleanup(
|
|
|
69
72
|
attachment_asset_ids=tuple(attachment_asset_ids),
|
|
70
73
|
)
|
|
71
74
|
)
|
|
75
|
+
if actor_id is not None:
|
|
76
|
+
await moderation_deps.moderation_service.record_moderation_action_for_job(
|
|
77
|
+
job_id=worker_job_id,
|
|
78
|
+
actor_id=actor_id,
|
|
79
|
+
action_type=ModerationActionType.TOMBSTONE_COMMENT,
|
|
80
|
+
action_metadata={
|
|
81
|
+
"comment_id": comment_id,
|
|
82
|
+
"author_id": author_id_before_tombstone,
|
|
83
|
+
},
|
|
84
|
+
)
|
|
72
85
|
|
|
73
86
|
|
|
74
|
-
async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact) -> None:
|
|
87
|
+
async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact, actor_id: str | None = None) -> None:
|
|
75
88
|
"""Best-effort enqueue of comment tombstone cross-domain cleanup."""
|
|
76
89
|
job_id = f"comment_tombstone_cleanup:{impact.comment_id}"
|
|
77
90
|
try:
|
|
@@ -84,6 +97,7 @@ async def enqueue_comment_tombstone_cleanup(*, impact: CommentTombstoneImpact) -
|
|
|
84
97
|
parent_comment_id=impact.parent_comment_id,
|
|
85
98
|
tombstone_status=impact.tombstone_status.value,
|
|
86
99
|
attachment_asset_ids=list(impact.attachment_asset_ids),
|
|
100
|
+
actor_id=actor_id,
|
|
87
101
|
_job_id=job_id,
|
|
88
102
|
)
|
|
89
103
|
if job is None:
|
|
@@ -157,7 +171,7 @@ async def finalize_deleted_comments_cleanup(
|
|
|
157
171
|
async def finalize_comment_destructive_delete_cleanup(*, impact: CommentDestructiveDeleteImpact) -> None:
|
|
158
172
|
"""Run cross-domain cleanup after comment-schema destructive deletion completes."""
|
|
159
173
|
await finalize_deleted_comments_cleanup(
|
|
160
|
-
deleted_comment_ids=impact.deleted_comment_ids,
|
|
174
|
+
deleted_comment_ids=impact.deleted_comment_ids | {impact.root_comment_id},
|
|
161
175
|
attachment_asset_ids=impact.attachment_asset_ids,
|
|
162
176
|
)
|
|
163
177
|
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/post_subject.py
RENAMED
|
@@ -32,7 +32,7 @@ class PostCommentSubjectPort:
|
|
|
32
32
|
|
|
33
33
|
async def resolve_inbox_recipients(self, *, subject_id: str, mention_user_ids: set[str]) -> CommentInboxRecipients:
|
|
34
34
|
"""Return the post author as owner and mention candidates allowed by post visibility."""
|
|
35
|
-
post = await post_deps.post_service.
|
|
35
|
+
post = await post_deps.post_service.retrieve_post_with_metadata_by_id_if_exists(post_id=subject_id)
|
|
36
36
|
if post is None or post.visibility is PostVisibility.PRIVATE:
|
|
37
37
|
return CommentInboxRecipients(owner_user_ids=frozenset(), mention_user_ids=frozenset())
|
|
38
38
|
mention_user_ids = set(mention_user_ids)
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/comments/rating_subject.py
RENAMED
|
@@ -33,7 +33,7 @@ class RatingCommentSubjectPort:
|
|
|
33
33
|
|
|
34
34
|
async def resolve_inbox_recipients(self, *, subject_id: str, mention_user_ids: set[str]) -> CommentInboxRecipients:
|
|
35
35
|
"""Return the rating author as owner and pass mention candidates through."""
|
|
36
|
-
rating = await rating_deps.rating_service.
|
|
36
|
+
rating = await rating_deps.rating_service.retrieve_rating_by_id(rating_id=subject_id)
|
|
37
37
|
if rating is None:
|
|
38
38
|
return CommentInboxRecipients(owner_user_ids=frozenset(), mention_user_ids=frozenset())
|
|
39
39
|
return CommentInboxRecipients(
|
|
@@ -40,7 +40,11 @@ async def render_and_send_transactional_email(
|
|
|
40
40
|
try:
|
|
41
41
|
subject, html_body, plain_text_body = renderer(context)
|
|
42
42
|
except Exception:
|
|
43
|
-
logger.exception(
|
|
43
|
+
logger.exception(
|
|
44
|
+
"Transactional email render failed",
|
|
45
|
+
reason="renderer_exception",
|
|
46
|
+
kind=kind,
|
|
47
|
+
)
|
|
44
48
|
raise
|
|
45
49
|
|
|
46
50
|
await email_service.send(
|
|
@@ -30,7 +30,7 @@ async def _existing_mention_recipient_ids(*, mention_user_ids: list[str], author
|
|
|
30
30
|
candidate_recipient_ids = set(mention_user_ids) - {author_id} - RESERVED_USER_IDS
|
|
31
31
|
if not candidate_recipient_ids:
|
|
32
32
|
return set()
|
|
33
|
-
identity_mapping = await user_deps.user_service.
|
|
33
|
+
identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(
|
|
34
34
|
user_ids=candidate_recipient_ids,
|
|
35
35
|
)
|
|
36
36
|
return {uid for uid in candidate_recipient_ids if uid in identity_mapping}
|
|
@@ -150,7 +150,7 @@ async def _handle_new_reply_notifications(
|
|
|
150
150
|
parent_comment_id: str,
|
|
151
151
|
content: str | None,
|
|
152
152
|
) -> None:
|
|
153
|
-
parent = await comment_deps.comment_service.
|
|
153
|
+
parent = await comment_deps.comment_service.retrieve_comment_with_metadata_by_id_if_exists(
|
|
154
154
|
comment_id=parent_comment_id,
|
|
155
155
|
)
|
|
156
156
|
if parent is None:
|
|
@@ -31,6 +31,10 @@ type OutboxEventHandler = Callable[..., Awaitable[None]]
|
|
|
31
31
|
|
|
32
32
|
def _require_payload_strings(*, row: OutboxRow, keys: tuple[str, ...]) -> dict[str, str]:
|
|
33
33
|
"""Extract required payload strings, dead-lettering invalid payload shape (decision #22)."""
|
|
34
|
+
if not isinstance(row.payload, dict):
|
|
35
|
+
raise NonRetryableOutboxHandlerError(
|
|
36
|
+
f"invalid payload shape {type(row.payload).__name__} for event {row.event_name!r}"
|
|
37
|
+
)
|
|
34
38
|
invalid = [key for key in keys if not isinstance(row.payload.get(key), str) or not row.payload[key].strip()]
|
|
35
39
|
if invalid:
|
|
36
40
|
raise NonRetryableOutboxHandlerError(f"invalid required payload keys {invalid!r} for event {row.event_name!r}")
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/admin_service.py
RENAMED
|
@@ -147,7 +147,7 @@ async def retrieve_post_by_id(*, post_id: str) -> dict[str, Any]:
|
|
|
147
147
|
|
|
148
148
|
|
|
149
149
|
async def tombstone_post_for_moderator(*, actor_id: str, post_id: str) -> None:
|
|
150
|
-
"""Tombstone a post as ``tombstoned_by_moderator`` and
|
|
150
|
+
"""Tombstone a post as ``tombstoned_by_moderator`` and enqueue cleanup."""
|
|
151
151
|
impact = await post_deps.post_service.tombstone_post(
|
|
152
152
|
post_id=post_id,
|
|
153
153
|
tombstone_status=PostStatus.TOMBSTONED_BY_MODERATOR,
|
|
@@ -155,15 +155,7 @@ async def tombstone_post_for_moderator(*, actor_id: str, post_id: str) -> None:
|
|
|
155
155
|
if impact is None:
|
|
156
156
|
raise ContentNotFoundException()
|
|
157
157
|
|
|
158
|
-
await enqueue_post_tombstone_cleanup(impact=impact)
|
|
159
|
-
await moderation_deps.moderation_service.record_moderation_action(
|
|
160
|
-
actor_id=actor_id,
|
|
161
|
-
action_type=ModerationActionType.TOMBSTONE_POST,
|
|
162
|
-
action_metadata={
|
|
163
|
-
"post_id": post_id,
|
|
164
|
-
"author_id": impact.author_id_before_tombstone,
|
|
165
|
-
},
|
|
166
|
-
)
|
|
158
|
+
await enqueue_post_tombstone_cleanup(impact=impact, actor_id=actor_id)
|
|
167
159
|
|
|
168
160
|
|
|
169
161
|
async def accept_destructive_post_delete(*, actor_id: str, post_id: str) -> None:
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/cleanup_service.py
RENAMED
|
@@ -10,6 +10,7 @@ import core_framework.domains.notification.dependencies as notification_deps
|
|
|
10
10
|
import core_framework.domains.post.dependencies as post_deps
|
|
11
11
|
from core_framework.application.shared import worker_jobs
|
|
12
12
|
from core_framework.application.shared.enums import WorkerJobName
|
|
13
|
+
from core_framework.domains.moderation import ModerationActionType
|
|
13
14
|
from core_framework.domains.post import (
|
|
14
15
|
PostAuthorDestructiveDeleteImpact,
|
|
15
16
|
PostAuthorTombstoneImpact,
|
|
@@ -54,8 +55,10 @@ async def run_post_tombstone_cleanup(
|
|
|
54
55
|
author_id_before_tombstone: str,
|
|
55
56
|
tombstone_status: str,
|
|
56
57
|
attachment_asset_ids: list[str],
|
|
58
|
+
actor_id: str | None = None,
|
|
59
|
+
worker_job_id: str | None = None,
|
|
57
60
|
) -> None:
|
|
58
|
-
"""Rebuild tombstone impact from ARQ primitives
|
|
61
|
+
"""Rebuild tombstone impact from ARQ primitives, run finalize cleanup, and audit when queued by a moderator."""
|
|
59
62
|
await finalize_post_tombstone_cleanup(
|
|
60
63
|
impact=PostTombstoneImpact(
|
|
61
64
|
post_id=post_id,
|
|
@@ -64,9 +67,19 @@ async def run_post_tombstone_cleanup(
|
|
|
64
67
|
attachment_asset_ids=tuple(attachment_asset_ids),
|
|
65
68
|
)
|
|
66
69
|
)
|
|
70
|
+
if actor_id is not None:
|
|
71
|
+
await moderation_deps.moderation_service.record_moderation_action_for_job(
|
|
72
|
+
job_id=worker_job_id,
|
|
73
|
+
actor_id=actor_id,
|
|
74
|
+
action_type=ModerationActionType.TOMBSTONE_POST,
|
|
75
|
+
action_metadata={
|
|
76
|
+
"post_id": post_id,
|
|
77
|
+
"author_id": author_id_before_tombstone,
|
|
78
|
+
},
|
|
79
|
+
)
|
|
67
80
|
|
|
68
81
|
|
|
69
|
-
async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact) -> None:
|
|
82
|
+
async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact, actor_id: str | None = None) -> None:
|
|
70
83
|
"""Best-effort enqueue of post tombstone cross-domain cleanup."""
|
|
71
84
|
job_id = f"post_tombstone_cleanup:{impact.post_id}"
|
|
72
85
|
try:
|
|
@@ -76,6 +89,7 @@ async def enqueue_post_tombstone_cleanup(*, impact: PostTombstoneImpact) -> None
|
|
|
76
89
|
author_id_before_tombstone=impact.author_id_before_tombstone,
|
|
77
90
|
tombstone_status=impact.tombstone_status.value,
|
|
78
91
|
attachment_asset_ids=list(impact.attachment_asset_ids),
|
|
92
|
+
actor_id=actor_id,
|
|
79
93
|
_job_id=job_id,
|
|
80
94
|
)
|
|
81
95
|
if job is None:
|
{core_framework-4.0.0 → core_framework-4.0.1}/core_framework/application/posts/public_service.py
RENAMED
|
@@ -19,7 +19,7 @@ from core_framework.domains.post import (
|
|
|
19
19
|
PostStatus,
|
|
20
20
|
PostWithMetadata,
|
|
21
21
|
)
|
|
22
|
-
from core_framework.domains.user import UserIdentity
|
|
22
|
+
from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
|
|
23
23
|
|
|
24
24
|
|
|
25
25
|
def _mentioned_user_ids_for_posts(
|
|
@@ -82,6 +82,11 @@ def _serialize_post(
|
|
|
82
82
|
stats = post_stats_mapping[post.id]
|
|
83
83
|
hashtags = hashtags_mapping[post.id]
|
|
84
84
|
author_identity = user_identity_mapping[post.author_id]
|
|
85
|
+
if author_identity == UserIdentity.DEFAULT:
|
|
86
|
+
author_identity = UserIdentity.REDACTED_AUTHOR
|
|
87
|
+
author_id = UserIdentity.REDACTED_AUTHOR.user_id
|
|
88
|
+
else:
|
|
89
|
+
author_id = post.author_id
|
|
85
90
|
is_tombstone = post.status.is_tombstone
|
|
86
91
|
viewer_context = None
|
|
87
92
|
if not is_tombstone and liked_ids is not None and reported_ids is not None:
|
|
@@ -99,7 +104,7 @@ def _serialize_post(
|
|
|
99
104
|
return {
|
|
100
105
|
"id": post.id,
|
|
101
106
|
"author": {
|
|
102
|
-
"user_id":
|
|
107
|
+
"user_id": author_id,
|
|
103
108
|
"username": author_identity.username,
|
|
104
109
|
"display_name": author_identity.display_name,
|
|
105
110
|
},
|
|
@@ -139,9 +144,24 @@ async def _hydrate_posts(*, posts: list[PostWithMetadata], viewer_id: str | None
|
|
|
139
144
|
"""Batch-load stats, tags, attachments, identities, and viewer/author context for public post payloads."""
|
|
140
145
|
if not posts:
|
|
141
146
|
return []
|
|
142
|
-
post_ids = {post.id for post in posts}
|
|
143
147
|
author_ids = {post.author_id for post in posts}
|
|
144
|
-
|
|
148
|
+
active_posts = [post for post in posts if not post.status.is_tombstone]
|
|
149
|
+
if not active_posts:
|
|
150
|
+
user_identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(user_ids=author_ids)
|
|
151
|
+
return [
|
|
152
|
+
_serialize_post(
|
|
153
|
+
post=post,
|
|
154
|
+
post_stats_mapping=defaultdict(lambda: PostStats.DEFAULT),
|
|
155
|
+
hashtags_mapping=defaultdict(list),
|
|
156
|
+
mentions_mapping=defaultdict(list),
|
|
157
|
+
attachments_mapping=defaultdict(list),
|
|
158
|
+
user_identity_mapping=user_identity_mapping,
|
|
159
|
+
viewer_id=viewer_id,
|
|
160
|
+
)
|
|
161
|
+
for post in posts
|
|
162
|
+
]
|
|
163
|
+
post_ids = {post.id for post in active_posts}
|
|
164
|
+
owned_post_ids = {p.id for p in active_posts if viewer_id is not None and p.author_id == viewer_id}
|
|
145
165
|
async with TaskGroup() as tg:
|
|
146
166
|
liked_reported_task = tg.create_task(_retrieve_viewer_context_ids(viewer_id=viewer_id, post_ids=post_ids))
|
|
147
167
|
stats_task = tg.create_task(post_deps.post_service.retrieve_post_stats_mapping(post_ids=post_ids))
|
|
@@ -159,7 +179,7 @@ async def _hydrate_posts(*, posts: list[PostWithMetadata], viewer_id: str | None
|
|
|
159
179
|
)
|
|
160
180
|
liked_ids, reported_ids = liked_reported_task.result()
|
|
161
181
|
mentions_mapping = mentions_task.result()
|
|
162
|
-
mention_user_ids = _mentioned_user_ids_for_posts(posts=
|
|
182
|
+
mention_user_ids = _mentioned_user_ids_for_posts(posts=active_posts, mentions_mapping=mentions_mapping)
|
|
163
183
|
user_identity_mapping = await user_deps.user_service.retrieve_user_identity_mapping(
|
|
164
184
|
user_ids=author_ids | mention_user_ids
|
|
165
185
|
)
|
|
@@ -220,6 +240,8 @@ async def retrieve_posts_by_user_id(
|
|
|
220
240
|
limit: int,
|
|
221
241
|
) -> list[dict[str, Any]]:
|
|
222
242
|
"""Return a paginated profile feed for ``user_id`` visible to ``viewer_id``."""
|
|
243
|
+
if user_id in RESERVED_USER_IDS:
|
|
244
|
+
return []
|
|
223
245
|
posts = await post_deps.post_service.retrieve_posts_by_user_id(
|
|
224
246
|
user_id=user_id,
|
|
225
247
|
cursor=cursor,
|
|
@@ -24,11 +24,11 @@ async def upsert_my_rating(
|
|
|
24
24
|
body=body,
|
|
25
25
|
)
|
|
26
26
|
if rating.body is None:
|
|
27
|
-
|
|
27
|
+
await rating_deps.rating_service.remove_rating_upvotes_for_rating(rating_id=rating.id)
|
|
28
28
|
dropped_reports = await moderation_deps.moderation_service.remove_review_reports_by_target_ids(
|
|
29
29
|
target_ids={rating.id},
|
|
30
30
|
)
|
|
31
|
-
if
|
|
31
|
+
if dropped_reports:
|
|
32
32
|
await rating_deps.rating_service.insert_rating_stats_dirty(rating_id=rating.id)
|
|
33
33
|
|
|
34
34
|
|