core-framework 4.2.0__tar.gz → 4.2.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.2.0 → core_framework-4.2.1}/CHANGELOG.md +8 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/PKG-INFO +1 -1
- core_framework-4.2.1/alembic/user/alembic/versions/089f4398f943_user_add_preference_switches.py +40 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/entitlements/router.py +1 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/entitlements/schemas.py +1 -1
- core_framework-4.2.1/core_framework/api/users/authenticated/mappers.py +42 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/router.py +5 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/schemas.py +26 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/entitlement/grant_service.py +6 -6
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/entitlement/registry.py +28 -39
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/friendship_notification_service.py +6 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/group_invite_notification_service.py +6 -1
- core_framework-4.2.1/core_framework/application/notifications/inbox_type_switch.py +54 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/notification_service.py +33 -6
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/models.py +24 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/repository.py +57 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/service.py +14 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/README.md +34 -32
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/entitlement-design.md +7 -7
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/entitlement-implementation.md +11 -11
- core_framework-4.2.1/docs/design/preference-enhancement-design.md +204 -0
- core_framework-4.2.1/docs/design/preference-enhancement-implementation.md +199 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/README.md +18 -18
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/entitlement/entitlements.md +2 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-redesign-design.md +3 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/notifications/notification_inbox.md +1 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/rating-design.md +4 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/preferences.md +1 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/package-api.md +8 -8
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/architecture-decisions.md +2 -2
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/glossary.md +4 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/todo.md +5 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/pyproject.toml +1 -1
- {core_framework-4.2.0 → core_framework-4.2.1}/uv.lock +1 -1
- core_framework-4.2.0/core_framework/api/users/authenticated/mappers.py +0 -19
- {core_framework-4.2.0 → core_framework-4.2.1}/.agents/skills/building-pydantic-ai-agents +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.agents/skills/fastapi +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/alembic-migrations.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/constitution.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/domain-imports.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/domain-services-and-adapters.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/error-boundary.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/flow-documentation.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/repository-schema-isolation.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/strong-reads.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/building-pydantic-ai-agents +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/code-review/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/design-review/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/fastapi +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/grill/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/implement-feature/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.dockerignore +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/ci/package-lock.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/ci/package-smoke.sh +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/ci/package.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/ci/package_smoke.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/_deploy.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/dev-ci-cd.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/manual-deployment.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/manual-observability-deployment.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.github/workflows/test.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.gitignore +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.pre-commit-config.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/.python-version +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/LICENSE +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/analytics/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/comment/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/entitlement/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/entitlement/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/entitlement/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/entitlement/alembic/versions/b7ed2400e94e_entitlement_schema.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/entitlement/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/extension/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/extension/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/extension/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/media/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/moderation/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/notification/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/0a89b4c23746_post_stats_like_created_post_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/b3c61daef9b5_post_add_post_bookmarks.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/post/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/rating/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/README +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/env.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/script.py.mako +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/alembic/user/alembic.ini +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/config.toml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/config.toml.template +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/agent/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/agent/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/analytics/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/cache/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/cache/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/comments/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/entitlements/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/outbox/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/posts/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/ratings/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/ratings/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/users/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/admin/users/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/attachments/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/attachments/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/auth/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/mappers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/authenticated/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/public/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/comments/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/entitlements/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/events/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/events/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/events/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/groups/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/groups/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ingest_guards.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/notifications/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/pagination.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/mappers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/authenticated/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/public/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ratings/authenticated/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ratings/pagination.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ratings/public/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ratings/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/ratings/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/system/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/system/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/upload.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/public/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/router.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/shared/mappers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/shared/schemas.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/agent/probe.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/bucket_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/read_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/refresh_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/auth/access_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/auth/auth_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/auth/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/auth/token_verification.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/bootstrap.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/cache/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/admin_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/aggregation_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/authenticated_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/cleanup_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/host_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/kind_registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/post_subject.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/public_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/comments/rating_subject.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/email/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/email/account_deletion_scheduled.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/email/enqueue.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/email/registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/email/send.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/entitlement/signature.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/entitlement/webhook_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/event_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/event_token.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/groups/authenticated_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/groups/cleanup_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/groups/group_invite_link_token.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/groups/strip_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/attachment_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/avatar_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/banner_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/appeal_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/moderator_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/report_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/moderation/user_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/inbox_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/mute_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/preview.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/notifications/wipe_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/block_mirrors.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/events.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/handlers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/ops_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/processing_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/outbox/restriction_mirrors.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/admin_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/aggregation_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/authenticated_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/cleanup_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/posts/public_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/admin_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/aggregation_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/authenticated_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/kind_registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/public_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/purge_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/serialization.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/ratings/subject_existence.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/shared/worker_jobs.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/contributors.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/registry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/account_removal/runner.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/admin_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/aggregation_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/authenticated_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/identity_enrichment.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/public_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/scheduled_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/users/user_deletion_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/asgi.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/bundled_alembic.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/cache.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/context.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/database.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/application.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/common.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/exception_handlers/setup.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/firebase.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/http_client.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/http_probes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/logging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/middleware.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/observability.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/pagination.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/process.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/rate_limit.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/redis.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/runtime.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/core/settings.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/agent/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/agent/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/agent/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/agent/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/analytics/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/ports/auth.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/auth/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/ports/subject.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/comment/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/email/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/ports/revenuecat.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/entitlement/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/attachment/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/avatar/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/banner/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/outbox_repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/outbox_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/moderation/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/notification/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/admin.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/outbox/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/discovery_rank.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/post/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/models.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/ports/subject_existence.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/rating/service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/repository_sql.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/constants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/dependencies.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/enums.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/group_repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/group_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/outbox_repository.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/outbox_service.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/outcomes.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/user/utils.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/domains/utils.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/agent/anthropic_agent_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/agent/openai_agent_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/firebase/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/infrastructure/revenuecat/revenuecat_entitlement_adapter.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/main.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/migrate_cli.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/py.typed +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/arq.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/auth.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/blockbuster.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/config.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/containers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/firebase.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/media.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/migrations.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/testing/plugin.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/main.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_account_deletion.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_transactional_email.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/core_framework/worker/worker_context.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/app/docker-compose.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/app/dockerfile +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/.env.example +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/docker-compose.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/loki.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/prometheus.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets.default/node.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets.default/postgres.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets.default/redis.yml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/targets.example/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/deploy/observability/tempo.yaml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/deploy-playbook.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/e2e-smoke-tests-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/edge-rate-limits.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/edge-upload-limits.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/examples/Caddyfile.example +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/caddy-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/postgres-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/redis-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/host-config-defaults-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/host-config-defaults-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/postgres-backup-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/deployments/release-playbook.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/account-removal-spine-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/account-removal-spine-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/analytics-rollup-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/analytics-warehouse-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/bookmark-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/cache-invalidation-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/comment-subject-kinds-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/create-idempotency-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/event-outbox-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/events-ingest-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/list-sort-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/list-sort-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/media-cpu-off-api-refactor.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/media-storage-topology.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/model-call-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/model-call-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/moderation-restriction-fanout-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/moderator-surfaces-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/moderator-surfaces-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/observability-lgtm-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/outbox-admin-ops-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/rating-implementation-plan.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/rating-thread-owner-cue-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/restriction-and-block-visibility-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/transactional-email-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/design/utm-events-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/agent/model_call_probe.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/analytics/admin_analytics_reads.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/auth/access_control.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/auth/registration.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/cache/admin_cache_invalidation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/admin_comments.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/comment_like.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/comment_report.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/comment_stats_aggregation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/create_comment.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/delete_comment.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/edit_comment.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/comments/retrieve_comments.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/deletion/comments.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/deletion/overview.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/deletion/posts.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/deletion/ratings.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/deletion/users.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/events/events.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/attachment_upload.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/avatar-upload-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/banner-upload-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/post-comment-attachments-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/upload-pipeline-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/media/upload_pipeline.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/mentions/mentions_in_content.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/appeals.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/internal_notes.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/moderator_actions.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/reports.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/moderation/restrictions.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-hint-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/notifications/inbox-hint-implementation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/outbox/admin_outbox_ops.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/admin_posts.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/author_context.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/bookmark-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/bookmark.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/create_post.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/delete_post.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/edit_post.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/hashtag_discovery.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/post_like.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/post_report.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/post_stats_aggregation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/post_visibility.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/posts/retrieve_posts.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/admin_ratings.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/delete_rating.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/edit_rating.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/rating_report.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/rating_stats_aggregation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/rating_upvote.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/retrieve_ratings.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/ratings/upsert_rating.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/account.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/account_deletion.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/admin_users.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/avatar.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/banner.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/blocks.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/change_history.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/check_username_exists.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/follow-system-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/follow.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/friendship-system-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/friendship.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/groups-system-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/groups.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/my_posts_and_comments.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/profile.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/public_profile.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/user_removal.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/user_stats_aggregation.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/domains/users/username_suggest.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/api.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/capability-wiring.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/core-framework-migration.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/overview.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/testing-plugin-design.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/library/workers.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/client-error-visibility.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/conventions.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/database-triggers.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/domain-services-and-adapters.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/layers-and-boundaries.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/patch-update-typed-payload.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/platform/response-composition-and-caching.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/reviews/README.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/reviews/log.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/reviews/review-playbook.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/reviews/slices.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/docs/testing.md +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/firebase_config.example.json +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/makefile +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tach.toml +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/_auth.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/_canaries.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/_media.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/_settings.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/_upload_payloads.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/smoke/agent_probe_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/_http_error_details.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/_poll.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_auth_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_destructive_delete_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_http_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_user_deletion_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/_user_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/_auth_cases.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/analytics/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/cache/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/cache/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/comments/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/moderation/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/outbox/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/posts/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/posts/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/users/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/admin/users/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/attachments/_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/attachments/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/auth/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/auth/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/comments/public/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/create_idempotency_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/events/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/groups/groups_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/list_sort_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/notifications/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/notifications/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/bookmark_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/followers_visibility_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/post_deletion_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/posts/public/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/rate_limit_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/ratings/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/ratings/_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/ratings/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/account_deletion_email_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/profile_media_upload_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/authenticated/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/public/router_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/_arq_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/_media_upload_helpers.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/account_deletion_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/analytics_refresh_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/conftest.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/create_idempotency_retention_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/moderation_outbox_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/mute_lift_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/profile_media_upload_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/restriction_fanout_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/integration/worker/user_outbox_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/api/ratings/review_pagination_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/comments/kind_registry_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/notifications/preview_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/ratings/kind_registry_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/users/account_removal_registry_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/users/account_removal_runner_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/core/pagination_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/docs/api_routes_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/domains/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
- {core_framework-4.2.0 → core_framework-4.2.1}/tests/unit/worker/tasks_registration_test.py +0 -0
|
@@ -4,6 +4,12 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [4.2.1] - 2026-10-10
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- **Entitlement grant list:** `GET /users/me/entitlements` returns **`identifier`** instead of **`label`**. **`register_entitlement_tier`** takes one **`identifier`**, which is that tier's RevenueCat lookup key. Registering tier **1** replaces **`plus`**. A host that passed **`label`** or **`lookup_keys`** must pass **`identifier`**.
|
|
12
|
+
|
|
7
13
|
## [4.2.0] - 2026-10-08
|
|
8
14
|
|
|
9
15
|
### Added
|
|
@@ -812,4 +818,5 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
|
|
|
812
818
|
[4.0.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.0...v4.0.1
|
|
813
819
|
[4.1.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...v4.1.0
|
|
814
820
|
[4.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...v4.2.0
|
|
815
|
-
[
|
|
821
|
+
[4.2.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.0...v4.2.1
|
|
822
|
+
[unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.1...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 4.2.
|
|
3
|
+
Version: 4.2.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
|
core_framework-4.2.1/alembic/user/alembic/versions/089f4398f943_user_add_preference_switches.py
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"""add user_preferences inbox type switches
|
|
2
|
+
|
|
3
|
+
Revision ID: 089f4398f943
|
|
4
|
+
Revises: 24ba262c4ef2
|
|
5
|
+
Create Date: 2026-10-09 15:57:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "089f4398f943"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "24ba262c4ef2"
|
|
15
|
+
branch_labels: str | Sequence[str] | None = None
|
|
16
|
+
depends_on: str | Sequence[str] | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
op.execute("""
|
|
21
|
+
alter table user_preferences
|
|
22
|
+
add column comments boolean not null default true,
|
|
23
|
+
add column replies boolean not null default true,
|
|
24
|
+
add column mentions boolean not null default true,
|
|
25
|
+
add column follows boolean not null default true,
|
|
26
|
+
add column friend_requests boolean not null default true,
|
|
27
|
+
add column group_invites boolean not null default true;
|
|
28
|
+
""")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def downgrade() -> None:
|
|
32
|
+
op.execute("""
|
|
33
|
+
alter table user_preferences
|
|
34
|
+
drop column if exists comments,
|
|
35
|
+
drop column if exists replies,
|
|
36
|
+
drop column if exists mentions,
|
|
37
|
+
drop column if exists follows,
|
|
38
|
+
drop column if exists friend_requests,
|
|
39
|
+
drop column if exists group_invites;
|
|
40
|
+
""")
|
|
@@ -27,7 +27,7 @@ async def get_my_entitlements(user_id: RequiredUserID) -> Any:
|
|
|
27
27
|
items = await list_caller_entitlements(user_id=user_id)
|
|
28
28
|
return EntitlementsResponse(
|
|
29
29
|
items=[
|
|
30
|
-
EntitlementItemResponse(tier_id=item.tier_id,
|
|
30
|
+
EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
|
|
31
31
|
for item in items
|
|
32
32
|
]
|
|
33
33
|
)
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
from core_framework.api.users.authenticated.schemas import (
|
|
2
|
+
AccountUpdateRequest,
|
|
3
|
+
PreferencesResponse,
|
|
4
|
+
PreferencesUpdateRequest,
|
|
5
|
+
)
|
|
6
|
+
from core_framework.domains.user import AccountUpdate, Preferences, PreferencesUpdate
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def preferences_response(*, preferences: Preferences) -> PreferencesResponse:
|
|
10
|
+
return PreferencesResponse(
|
|
11
|
+
theme=preferences.theme,
|
|
12
|
+
language=preferences.language,
|
|
13
|
+
comments=preferences.comments,
|
|
14
|
+
replies=preferences.replies,
|
|
15
|
+
mentions=preferences.mentions,
|
|
16
|
+
follows=preferences.follows,
|
|
17
|
+
friend_requests=preferences.friend_requests,
|
|
18
|
+
group_invites=preferences.group_invites,
|
|
19
|
+
)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def preferences_update_from_request(*, request: PreferencesUpdateRequest) -> PreferencesUpdate:
|
|
23
|
+
fields_set = frozenset(request.model_fields_set)
|
|
24
|
+
return PreferencesUpdate(
|
|
25
|
+
fields_set=fields_set,
|
|
26
|
+
theme=request.theme if "theme" in fields_set else None,
|
|
27
|
+
language=request.language if "language" in fields_set else None,
|
|
28
|
+
comments=request.comments if "comments" in fields_set else None,
|
|
29
|
+
replies=request.replies if "replies" in fields_set else None,
|
|
30
|
+
mentions=request.mentions if "mentions" in fields_set else None,
|
|
31
|
+
follows=request.follows if "follows" in fields_set else None,
|
|
32
|
+
friend_requests=request.friend_requests if "friend_requests" in fields_set else None,
|
|
33
|
+
group_invites=request.group_invites if "group_invites" in fields_set else None,
|
|
34
|
+
)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def account_update_from_request(*, request: AccountUpdateRequest) -> AccountUpdate:
|
|
38
|
+
fields_set = frozenset(request.model_fields_set)
|
|
39
|
+
return AccountUpdate(
|
|
40
|
+
fields_set=fields_set,
|
|
41
|
+
username=request.username if "username" in fields_set else None,
|
|
42
|
+
)
|
{core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/router.py
RENAMED
|
@@ -22,6 +22,7 @@ from core_framework.api.ratings.schemas import RatingItemResponse
|
|
|
22
22
|
from core_framework.api.upload import iter_upload_chunks
|
|
23
23
|
from core_framework.api.users.authenticated.mappers import (
|
|
24
24
|
account_update_from_request,
|
|
25
|
+
preferences_response,
|
|
25
26
|
preferences_update_from_request,
|
|
26
27
|
)
|
|
27
28
|
from core_framework.api.users.authenticated.schemas import (
|
|
@@ -338,7 +339,8 @@ async def get_my_ratings(
|
|
|
338
339
|
dependencies=[Depends(check_caller_identity)],
|
|
339
340
|
)
|
|
340
341
|
async def get_my_preferences(user_id: RequiredUserID) -> Any:
|
|
341
|
-
|
|
342
|
+
preferences = await retrieve_my_preferences(user_id=user_id)
|
|
343
|
+
return preferences_response(preferences=preferences)
|
|
342
344
|
|
|
343
345
|
|
|
344
346
|
@router.patch(
|
|
@@ -347,10 +349,11 @@ async def get_my_preferences(user_id: RequiredUserID) -> Any:
|
|
|
347
349
|
dependencies=[Depends(check_caller_identity)],
|
|
348
350
|
)
|
|
349
351
|
async def patch_my_preferences(user_id: RequiredUserID, update_request: PreferencesUpdateRequest) -> Any:
|
|
350
|
-
|
|
352
|
+
preferences = await change_my_preferences(
|
|
351
353
|
user_id=user_id,
|
|
352
354
|
update=preferences_update_from_request(request=update_request),
|
|
353
355
|
)
|
|
356
|
+
return preferences_response(preferences=preferences)
|
|
354
357
|
|
|
355
358
|
|
|
356
359
|
@router.get(
|
{core_framework-4.2.0 → core_framework-4.2.1}/core_framework/api/users/authenticated/schemas.py
RENAMED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
from datetime import datetime
|
|
2
|
-
from typing import Annotated
|
|
2
|
+
from typing import Annotated, Final
|
|
3
3
|
|
|
4
|
-
from pydantic import BaseModel, EmailStr, Field
|
|
4
|
+
from pydantic import BaseModel, EmailStr, Field, model_validator
|
|
5
5
|
|
|
6
6
|
from core_framework.api.schemas import BasePatchRequest
|
|
7
7
|
from core_framework.api.users.shared.schemas import (
|
|
@@ -103,8 +103,32 @@ class MyAppealsResponse(BaseModel):
|
|
|
103
103
|
class PreferencesResponse(BaseModel):
|
|
104
104
|
theme: Theme
|
|
105
105
|
language: str
|
|
106
|
+
comments: bool = True
|
|
107
|
+
replies: bool = True
|
|
108
|
+
mentions: bool = True
|
|
109
|
+
follows: bool = True
|
|
110
|
+
friend_requests: bool = True
|
|
111
|
+
group_invites: bool = True
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
_SWITCH_FIELDS: Final[frozenset[str]] = frozenset(
|
|
115
|
+
{"comments", "replies", "mentions", "follows", "friend_requests", "group_invites"}
|
|
116
|
+
)
|
|
106
117
|
|
|
107
118
|
|
|
108
119
|
class PreferencesUpdateRequest(BasePatchRequest):
|
|
109
120
|
theme: Theme | None = None
|
|
110
121
|
language: Annotated[str | None, Field(default=None, max_length=10)]
|
|
122
|
+
comments: bool | None = None
|
|
123
|
+
replies: bool | None = None
|
|
124
|
+
mentions: bool | None = None
|
|
125
|
+
follows: bool | None = None
|
|
126
|
+
friend_requests: bool | None = None
|
|
127
|
+
group_invites: bool | None = None
|
|
128
|
+
|
|
129
|
+
@model_validator(mode="after")
|
|
130
|
+
def reject_null_switches(self) -> PreferencesUpdateRequest:
|
|
131
|
+
for name in _SWITCH_FIELDS.intersection(self.model_fields_set):
|
|
132
|
+
if getattr(self, name) is None:
|
|
133
|
+
raise ValueError(f"{name} must not be null")
|
|
134
|
+
return self
|
|
@@ -4,7 +4,7 @@ from datetime import UTC, datetime
|
|
|
4
4
|
import core_framework.domains.entitlement.dependencies as entitlement_deps
|
|
5
5
|
import core_framework.domains.moderation.dependencies as moderation_deps
|
|
6
6
|
import core_framework.domains.user.dependencies as user_deps
|
|
7
|
-
from core_framework.application.entitlement.registry import entitlements_enabled,
|
|
7
|
+
from core_framework.application.entitlement.registry import entitlements_enabled, tier_identifier, tier_is_registered
|
|
8
8
|
from core_framework.application.shared.exceptions import (
|
|
9
9
|
EntitlementRequiredException,
|
|
10
10
|
UnprocessableEntityException,
|
|
@@ -17,19 +17,19 @@ from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
|
|
|
17
17
|
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
18
18
|
class CallerEntitlement:
|
|
19
19
|
tier_id: int
|
|
20
|
-
|
|
20
|
+
identifier: str
|
|
21
21
|
expires_at: datetime | None
|
|
22
22
|
|
|
23
23
|
|
|
24
24
|
async def list_caller_entitlements(*, user_id: str) -> list[CallerEntitlement]:
|
|
25
|
-
"""Return this caller's active tiers with
|
|
25
|
+
"""Return this caller's active tiers with each tier's identifier."""
|
|
26
26
|
tiers = await entitlement_deps.entitlement_service.list_active_tiers(user_id=user_id)
|
|
27
27
|
items: list[CallerEntitlement] = []
|
|
28
28
|
for tier in tiers:
|
|
29
|
-
|
|
30
|
-
if
|
|
29
|
+
identifier = tier_identifier(tier.tier_id)
|
|
30
|
+
if identifier is None:
|
|
31
31
|
continue
|
|
32
|
-
items.append(CallerEntitlement(tier_id=tier.tier_id,
|
|
32
|
+
items.append(CallerEntitlement(tier_id=tier.tier_id, identifier=identifier, expires_at=tier.expires_at))
|
|
33
33
|
return items
|
|
34
34
|
|
|
35
35
|
|
{core_framework-4.2.0 → core_framework-4.2.1}/core_framework/application/entitlement/registry.py
RENAMED
|
@@ -14,8 +14,7 @@ _gate_tier_ids: set[int] = set()
|
|
|
14
14
|
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
15
15
|
class TierRegistration:
|
|
16
16
|
tier_id: int
|
|
17
|
-
|
|
18
|
-
lookup_keys: frozenset[str]
|
|
17
|
+
identifier: str
|
|
19
18
|
|
|
20
19
|
|
|
21
20
|
def configure_entitlement(
|
|
@@ -35,7 +34,7 @@ def configure_entitlement(
|
|
|
35
34
|
_tiers = {}
|
|
36
35
|
_lookup_keys = {}
|
|
37
36
|
_tier_one_registered_by_host = False
|
|
38
|
-
_install_tier(tier_id=1,
|
|
37
|
+
_install_tier(tier_id=1, identifier="plus")
|
|
39
38
|
|
|
40
39
|
|
|
41
40
|
def entitlements_enabled() -> bool:
|
|
@@ -58,32 +57,29 @@ def email_sending_enabled() -> bool:
|
|
|
58
57
|
return _email_enabled
|
|
59
58
|
|
|
60
59
|
|
|
61
|
-
def register_entitlement_tier(*, tier_id: int,
|
|
62
|
-
"""Register a host tier, or
|
|
60
|
+
def register_entitlement_tier(*, tier_id: int, identifier: str) -> None:
|
|
61
|
+
"""Register a host tier, or replace tier 1's identifier.
|
|
63
62
|
|
|
64
|
-
|
|
65
|
-
A
|
|
63
|
+
The identifier is that tier's RevenueCat lookup key. Registering tier 1
|
|
64
|
+
replaces ``plus``. A second registration of the same tier id fails. An
|
|
65
|
+
identifier listed on two tiers fails. The API lifespan checks recorded
|
|
66
66
|
gates after the host factory returns.
|
|
67
67
|
"""
|
|
68
68
|
global _tier_one_registered_by_host
|
|
69
|
-
|
|
69
|
+
cleaned_identifier = identifier.strip()
|
|
70
70
|
if tier_id < 1:
|
|
71
71
|
raise ValueError("tier id must be at least 1")
|
|
72
|
-
if not
|
|
73
|
-
raise ValueError("tier
|
|
74
|
-
cleaned_keys = [key.strip() for key in lookup_keys]
|
|
75
|
-
if any(not key for key in cleaned_keys):
|
|
76
|
-
raise ValueError("lookup key must be non-blank")
|
|
72
|
+
if not cleaned_identifier:
|
|
73
|
+
raise ValueError("tier identifier must be non-blank")
|
|
77
74
|
if tier_id == 1:
|
|
78
75
|
if _tier_one_registered_by_host:
|
|
79
76
|
raise ValueError("duplicate entitlement tier id: 1")
|
|
80
77
|
_tier_one_registered_by_host = True
|
|
81
|
-
|
|
82
|
-
_replace_tier(tier_id=1, label=cleaned_label, lookup_keys=keys)
|
|
78
|
+
_replace_tier(tier_id=1, identifier=cleaned_identifier)
|
|
83
79
|
return
|
|
84
80
|
if tier_id in _tiers:
|
|
85
81
|
raise ValueError(f"duplicate entitlement tier id: {tier_id}")
|
|
86
|
-
_install_tier(tier_id=tier_id,
|
|
82
|
+
_install_tier(tier_id=tier_id, identifier=cleaned_identifier)
|
|
87
83
|
|
|
88
84
|
|
|
89
85
|
def note_tier_gate(tier_id: int) -> None:
|
|
@@ -98,10 +94,10 @@ def validate_entitlement_tier_gates() -> None:
|
|
|
98
94
|
raise RuntimeError(f"entitlement tier gate is not on the map: {missing}")
|
|
99
95
|
|
|
100
96
|
|
|
101
|
-
def
|
|
102
|
-
"""Return the
|
|
97
|
+
def tier_identifier(tier_id: int) -> str | None:
|
|
98
|
+
"""Return the identifier for a tier id, or None when the tier is not on the map."""
|
|
103
99
|
tier = _tiers.get(tier_id)
|
|
104
|
-
return None if tier is None else tier.
|
|
100
|
+
return None if tier is None else tier.identifier
|
|
105
101
|
|
|
106
102
|
|
|
107
103
|
def tier_id_for_lookup_key(lookup_key: str) -> int | None:
|
|
@@ -114,27 +110,20 @@ def tier_is_registered(tier_id: int) -> bool:
|
|
|
114
110
|
return tier_id in _tiers
|
|
115
111
|
|
|
116
112
|
|
|
117
|
-
def _install_tier(*, tier_id: int,
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
for key in unique_keys:
|
|
124
|
-
_lookup_keys[key] = tier_id
|
|
125
|
-
_tiers[tier_id] = TierRegistration(tier_id=tier_id, label=label, lookup_keys=frozenset(unique_keys))
|
|
113
|
+
def _install_tier(*, tier_id: int, identifier: str) -> None:
|
|
114
|
+
owner = _lookup_keys.get(identifier)
|
|
115
|
+
if owner is not None and owner != tier_id:
|
|
116
|
+
raise ValueError(f"identifier {identifier} is already listed on tier {owner}")
|
|
117
|
+
_lookup_keys[identifier] = tier_id
|
|
118
|
+
_tiers[tier_id] = TierRegistration(tier_id=tier_id, identifier=identifier)
|
|
126
119
|
|
|
127
120
|
|
|
128
|
-
def _replace_tier(*, tier_id: int,
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
if owner is not None and owner != tier_id:
|
|
133
|
-
raise ValueError(f"lookup key {key} is already listed on tier {owner}")
|
|
121
|
+
def _replace_tier(*, tier_id: int, identifier: str) -> None:
|
|
122
|
+
owner = _lookup_keys.get(identifier)
|
|
123
|
+
if owner is not None and owner != tier_id:
|
|
124
|
+
raise ValueError(f"identifier {identifier} is already listed on tier {owner}")
|
|
134
125
|
previous = _tiers.get(tier_id)
|
|
135
126
|
if previous is not None:
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
_lookup_keys[key] = tier_id
|
|
140
|
-
_tiers[tier_id] = TierRegistration(tier_id=tier_id, label=label, lookup_keys=frozenset(unique_keys))
|
|
127
|
+
_lookup_keys.pop(previous.identifier, None)
|
|
128
|
+
_lookup_keys[identifier] = tier_id
|
|
129
|
+
_tiers[tier_id] = TierRegistration(tier_id=tier_id, identifier=identifier)
|
|
@@ -3,6 +3,7 @@ from typing import Final
|
|
|
3
3
|
from structlog import get_logger
|
|
4
4
|
|
|
5
5
|
import core_framework.domains.notification.dependencies as notification_deps
|
|
6
|
+
from core_framework.application.notifications.inbox_type_switch import recipient_ids_allowing_inbox_type
|
|
6
7
|
from core_framework.domains.notification import NotificationSubjectKind, NotificationType
|
|
7
8
|
|
|
8
9
|
logger = get_logger(__name__)
|
|
@@ -14,8 +15,12 @@ _PENDING_REQUEST_WIPE_LIMIT: Final[int] = 500
|
|
|
14
15
|
async def notify_friend_request(*, requester_id: str, recipient_id: str) -> None:
|
|
15
16
|
"""Create the best-effort ``friend_request`` inbox row for the recipient."""
|
|
16
17
|
try:
|
|
17
|
-
await
|
|
18
|
+
allowed_recipient_ids = await recipient_ids_allowing_inbox_type(
|
|
18
19
|
recipient_ids={recipient_id},
|
|
20
|
+
notification_type=NotificationType.FRIEND_REQUEST,
|
|
21
|
+
)
|
|
22
|
+
await notification_deps.notification_service.add_notification(
|
|
23
|
+
recipient_ids=allowed_recipient_ids,
|
|
19
24
|
actor_id=requester_id,
|
|
20
25
|
notification_type=NotificationType.FRIEND_REQUEST,
|
|
21
26
|
subject_id=requester_id,
|
|
@@ -3,6 +3,7 @@ from typing import Final
|
|
|
3
3
|
from structlog import get_logger
|
|
4
4
|
|
|
5
5
|
import core_framework.domains.notification.dependencies as notification_deps
|
|
6
|
+
from core_framework.application.notifications.inbox_type_switch import recipient_ids_allowing_inbox_type
|
|
6
7
|
from core_framework.domains.notification import NotificationSubjectKind, NotificationType
|
|
7
8
|
|
|
8
9
|
logger = get_logger(__name__)
|
|
@@ -20,8 +21,12 @@ async def notify_group_invite(
|
|
|
20
21
|
) -> None:
|
|
21
22
|
"""Create the best-effort ``group_invite`` inbox row for the invitee."""
|
|
22
23
|
try:
|
|
23
|
-
await
|
|
24
|
+
allowed_recipient_ids = await recipient_ids_allowing_inbox_type(
|
|
24
25
|
recipient_ids={invitee_id},
|
|
26
|
+
notification_type=NotificationType.GROUP_INVITE,
|
|
27
|
+
)
|
|
28
|
+
await notification_deps.notification_service.add_notification(
|
|
29
|
+
recipient_ids=allowed_recipient_ids,
|
|
25
30
|
actor_id=inviter_id,
|
|
26
31
|
notification_type=NotificationType.GROUP_INVITE,
|
|
27
32
|
subject_id=group_id,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
from structlog import get_logger
|
|
2
|
+
|
|
3
|
+
import core_framework.domains.user.dependencies as user_deps
|
|
4
|
+
from core_framework.domains.notification import NotificationType
|
|
5
|
+
from core_framework.domains.user import Preferences
|
|
6
|
+
|
|
7
|
+
logger = get_logger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def _switch_is_on(*, preferences: Preferences, notification_type: NotificationType) -> bool:
|
|
11
|
+
match notification_type:
|
|
12
|
+
case NotificationType.COMMENT_ON_POST | NotificationType.COMMENT_ON_RATING:
|
|
13
|
+
return preferences.comments
|
|
14
|
+
case NotificationType.REPLY_TO_COMMENT:
|
|
15
|
+
return preferences.replies
|
|
16
|
+
case NotificationType.MENTION:
|
|
17
|
+
return preferences.mentions
|
|
18
|
+
case NotificationType.NEW_FOLLOWER:
|
|
19
|
+
return preferences.follows
|
|
20
|
+
case NotificationType.FRIEND_REQUEST:
|
|
21
|
+
return preferences.friend_requests
|
|
22
|
+
case NotificationType.GROUP_INVITE:
|
|
23
|
+
return preferences.group_invites
|
|
24
|
+
case _:
|
|
25
|
+
return True
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def recipient_ids_allowing_inbox_type(
|
|
29
|
+
*,
|
|
30
|
+
recipient_ids: set[str],
|
|
31
|
+
notification_type: NotificationType,
|
|
32
|
+
) -> set[str]:
|
|
33
|
+
"""Return recipients whose switch is on. Empty when the preferences read fails."""
|
|
34
|
+
if not recipient_ids:
|
|
35
|
+
return set()
|
|
36
|
+
try:
|
|
37
|
+
preferences_by_user_id = await user_deps.user_service.retrieve_preferences_mapping_strong(
|
|
38
|
+
user_ids=recipient_ids,
|
|
39
|
+
)
|
|
40
|
+
except Exception:
|
|
41
|
+
logger.exception(
|
|
42
|
+
"Failed to read inbox type switches",
|
|
43
|
+
notification_type=notification_type.value,
|
|
44
|
+
)
|
|
45
|
+
return set()
|
|
46
|
+
return {
|
|
47
|
+
recipient_id
|
|
48
|
+
for recipient_id in recipient_ids
|
|
49
|
+
if recipient_id not in preferences_by_user_id
|
|
50
|
+
or _switch_is_on(
|
|
51
|
+
preferences=preferences_by_user_id[recipient_id],
|
|
52
|
+
notification_type=notification_type,
|
|
53
|
+
)
|
|
54
|
+
}
|
|
@@ -9,6 +9,7 @@ import core_framework.domains.comment.dependencies as comment_deps
|
|
|
9
9
|
import core_framework.domains.notification.dependencies as notification_deps
|
|
10
10
|
import core_framework.domains.user.dependencies as user_deps
|
|
11
11
|
from core_framework.application.comments.kind_registry import get_comment_kind_subject
|
|
12
|
+
from core_framework.application.notifications.inbox_type_switch import recipient_ids_allowing_inbox_type
|
|
12
13
|
from core_framework.application.notifications.preview import truncate_notification_preview
|
|
13
14
|
from core_framework.domains.comment import POST_SUBJECT_KIND, RATING_SUBJECT_KIND
|
|
14
15
|
from core_framework.domains.notification import NotificationSubjectKind, NotificationType
|
|
@@ -25,6 +26,32 @@ _OWNER_CUE_BY_COMMENT_KIND: Final[Mapping[str, tuple[NotificationType, Notificat
|
|
|
25
26
|
)
|
|
26
27
|
|
|
27
28
|
|
|
29
|
+
async def _add_notification(
|
|
30
|
+
*,
|
|
31
|
+
recipient_ids: set[str],
|
|
32
|
+
actor_id: str,
|
|
33
|
+
notification_type: NotificationType,
|
|
34
|
+
subject_id: str,
|
|
35
|
+
subject_kind: NotificationSubjectKind,
|
|
36
|
+
reference_id: str,
|
|
37
|
+
preview_text: str | None,
|
|
38
|
+
) -> None:
|
|
39
|
+
"""Insert an inbox row for recipients whose type switch is on."""
|
|
40
|
+
allowed_recipient_ids = await recipient_ids_allowing_inbox_type(
|
|
41
|
+
recipient_ids=recipient_ids,
|
|
42
|
+
notification_type=notification_type,
|
|
43
|
+
)
|
|
44
|
+
await notification_deps.notification_service.add_notification(
|
|
45
|
+
recipient_ids=allowed_recipient_ids,
|
|
46
|
+
actor_id=actor_id,
|
|
47
|
+
notification_type=notification_type,
|
|
48
|
+
subject_id=subject_id,
|
|
49
|
+
subject_kind=subject_kind,
|
|
50
|
+
reference_id=reference_id,
|
|
51
|
+
preview_text=preview_text,
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
28
55
|
async def _existing_mention_recipient_ids(*, mention_user_ids: list[str], author_id: str) -> set[str]:
|
|
29
56
|
"""Return mention targets that exist as real users (not author or reserved sentinels)."""
|
|
30
57
|
candidate_recipient_ids = set(mention_user_ids) - {author_id} - RESERVED_USER_IDS
|
|
@@ -73,7 +100,7 @@ async def _handle_new_post_notifications(
|
|
|
73
100
|
followee_id=author_id,
|
|
74
101
|
)
|
|
75
102
|
preview_text = truncate_notification_preview(content=content)
|
|
76
|
-
await
|
|
103
|
+
await _add_notification(
|
|
77
104
|
recipient_ids=existing_recipient_ids,
|
|
78
105
|
actor_id=author_id,
|
|
79
106
|
notification_type=NotificationType.MENTION,
|
|
@@ -122,7 +149,7 @@ async def _handle_new_root_comment_notifications(
|
|
|
122
149
|
notification_type, notification_subject_kind = owner_cue
|
|
123
150
|
owner_ids = set(recipients.owner_user_ids) - {author_id} - RESERVED_USER_IDS
|
|
124
151
|
if owner_ids:
|
|
125
|
-
await
|
|
152
|
+
await _add_notification(
|
|
126
153
|
recipient_ids=owner_ids,
|
|
127
154
|
actor_id=author_id,
|
|
128
155
|
notification_type=notification_type,
|
|
@@ -131,7 +158,7 @@ async def _handle_new_root_comment_notifications(
|
|
|
131
158
|
reference_id=new_comment_id,
|
|
132
159
|
preview_text=preview_text,
|
|
133
160
|
)
|
|
134
|
-
await
|
|
161
|
+
await _add_notification(
|
|
135
162
|
recipient_ids=set(recipients.mention_user_ids) & existing_recipient_ids,
|
|
136
163
|
actor_id=author_id,
|
|
137
164
|
notification_type=NotificationType.MENTION,
|
|
@@ -157,7 +184,7 @@ async def _handle_new_reply_notifications(
|
|
|
157
184
|
return
|
|
158
185
|
preview_text = truncate_notification_preview(content=content)
|
|
159
186
|
if parent.author_id != author_id and parent.author_id not in RESERVED_USER_IDS:
|
|
160
|
-
await
|
|
187
|
+
await _add_notification(
|
|
161
188
|
recipient_ids={parent.author_id},
|
|
162
189
|
actor_id=author_id,
|
|
163
190
|
notification_type=NotificationType.REPLY_TO_COMMENT,
|
|
@@ -170,7 +197,7 @@ async def _handle_new_reply_notifications(
|
|
|
170
197
|
mention_user_ids=mention_user_ids,
|
|
171
198
|
author_id=author_id,
|
|
172
199
|
)
|
|
173
|
-
await
|
|
200
|
+
await _add_notification(
|
|
174
201
|
recipient_ids=existing_recipient_ids,
|
|
175
202
|
actor_id=author_id,
|
|
176
203
|
notification_type=NotificationType.MENTION,
|
|
@@ -182,7 +209,7 @@ async def _handle_new_reply_notifications(
|
|
|
182
209
|
|
|
183
210
|
|
|
184
211
|
async def _handle_new_follower_notification(*, follower_id: str, followee_id: str) -> None:
|
|
185
|
-
await
|
|
212
|
+
await _add_notification(
|
|
186
213
|
recipient_ids={followee_id},
|
|
187
214
|
actor_id=follower_id,
|
|
188
215
|
notification_type=NotificationType.NEW_FOLLOWER,
|
|
@@ -128,6 +128,12 @@ UsernameSuggestion = UserCard
|
|
|
128
128
|
class Preferences:
|
|
129
129
|
theme: Theme
|
|
130
130
|
language: str
|
|
131
|
+
comments: bool
|
|
132
|
+
replies: bool
|
|
133
|
+
mentions: bool
|
|
134
|
+
follows: bool
|
|
135
|
+
friend_requests: bool
|
|
136
|
+
group_invites: bool
|
|
131
137
|
|
|
132
138
|
DEFAULT: ClassVar[Preferences]
|
|
133
139
|
|
|
@@ -135,6 +141,12 @@ class Preferences:
|
|
|
135
141
|
Preferences.DEFAULT = Preferences(
|
|
136
142
|
theme=Theme.LIGHT,
|
|
137
143
|
language="en",
|
|
144
|
+
comments=True,
|
|
145
|
+
replies=True,
|
|
146
|
+
mentions=True,
|
|
147
|
+
follows=True,
|
|
148
|
+
friend_requests=True,
|
|
149
|
+
group_invites=True,
|
|
138
150
|
)
|
|
139
151
|
|
|
140
152
|
|
|
@@ -144,6 +156,12 @@ class PreferencesUpdate:
|
|
|
144
156
|
{
|
|
145
157
|
"theme": "theme",
|
|
146
158
|
"language": "language",
|
|
159
|
+
"comments": "comments",
|
|
160
|
+
"replies": "replies",
|
|
161
|
+
"mentions": "mentions",
|
|
162
|
+
"follows": "follows",
|
|
163
|
+
"friend_requests": "friend_requests",
|
|
164
|
+
"group_invites": "group_invites",
|
|
147
165
|
}
|
|
148
166
|
)
|
|
149
167
|
UPDATE_FIELDS: ClassVar[frozenset[str]] = frozenset(UPDATE_COLUMNS.keys())
|
|
@@ -151,6 +169,12 @@ class PreferencesUpdate:
|
|
|
151
169
|
fields_set: frozenset[str]
|
|
152
170
|
theme: Theme | None = None
|
|
153
171
|
language: str | None = None
|
|
172
|
+
comments: bool | None = None
|
|
173
|
+
replies: bool | None = None
|
|
174
|
+
mentions: bool | None = None
|
|
175
|
+
follows: bool | None = None
|
|
176
|
+
friend_requests: bool | None = None
|
|
177
|
+
group_invites: bool | None = None
|
|
154
178
|
|
|
155
179
|
def require_has_updates(self) -> None:
|
|
156
180
|
"""
|