core-framework 4.2.1__tar.gz → 4.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/application-layer.mdc +6 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-services-and-adapters.mdc +6 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/strong-reads.mdc +1 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/implement-feature/SKILL.md +2 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/CHANGELOG.md +19 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/PKG-INFO +1 -1
- core_framework-4.3.0/alembic/entitlement/alembic/versions/244cc7430989_entitlement_standalone_grants.py +32 -0
- core_framework-4.3.0/alembic/entitlement/alembic/versions/8ef1f563ccb4_entitlement_paid_grant_nullable_expiry.py +30 -0
- core_framework-4.3.0/alembic/user/alembic/versions/d438cfba40c0_user_login_events_user_created_at_index.py +27 -0
- core_framework-4.3.0/core_framework/api/admin/entitlements/router.py +74 -0
- core_framework-4.3.0/core_framework/api/entitlements/dependencies.py +44 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/entitlements/router.py +19 -3
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/entitlements/schemas.py +7 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/router.py +34 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/schemas.py +16 -6
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/registry.py +9 -5
- core_framework-4.3.0/core_framework/application/entitlement/core_user.py +24 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/grant_service.py +43 -13
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/registry.py +60 -9
- core_framework-4.3.0/core_framework/application/entitlement/sync_service.py +154 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/webhook_service.py +57 -42
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/README.md +3 -3
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/exceptions.py +24 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/authenticated_service.py +18 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/application.py +30 -0
- core_framework-4.3.0/core_framework/domains/entitlement/README.md +23 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/__init__.py +2 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/models.py +13 -1
- core_framework-4.3.0/core_framework/domains/entitlement/repository.py +541 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/service.py +50 -5
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/README.md +2 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/README.md +2 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/__init__.py +2 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/models.py +10 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/repository.py +87 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/service.py +62 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/revenuecat/revenuecat_entitlement_adapter.py +11 -4
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/README.md +38 -34
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/account-removal-spine-design.md +18 -18
- core_framework-4.3.0/docs/design/entitlement-admin-sync-design.md +126 -0
- core_framework-4.3.0/docs/design/entitlement-admin-sync-implementation.md +227 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/entitlement-design.md +50 -48
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/entitlement-implementation.md +6 -5
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/preference-enhancement-design.md +2 -5
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/preference-enhancement-implementation.md +1 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-thread-owner-cue-design.md +4 -2
- core_framework-4.3.0/docs/design/standalone-tier-design.md +197 -0
- core_framework-4.3.0/docs/design/standalone-tier-implementation.md +273 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/transactional-email-design.md +5 -5
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/README.md +18 -18
- core_framework-4.3.0/docs/domains/entitlement/entitlements.md +294 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-redesign-design.md +1 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/notification_inbox.md +27 -7
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/follow.md +2 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/friendship.md +5 -4
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/groups.md +3 -3
- core_framework-4.3.0/docs/domains/users/login-history-design.md +135 -0
- core_framework-4.3.0/docs/domains/users/login_history.md +73 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/preferences.md +14 -9
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/api.md +3 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/overview.md +1 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/package-api.md +22 -8
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/architecture-decisions.md +57 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/client-error-visibility.md +11 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/conventions.md +1 -1
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/glossary.md +15 -3
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/patch-update-typed-payload.md +2 -2
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/todo.md +0 -6
- {core_framework-4.2.1 → core_framework-4.3.0}/pyproject.toml +1 -1
- core_framework-4.3.0/tests/integration/api/users/authenticated/preference_switches_integration_test.py +295 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/profile_media_upload_test.py +2 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/router_test.py +194 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/uv.lock +1 -1
- core_framework-4.2.1/core_framework/api/admin/entitlements/router.py +0 -41
- core_framework-4.2.1/core_framework/api/entitlements/dependencies.py +0 -23
- core_framework-4.2.1/core_framework/domains/entitlement/README.md +0 -22
- core_framework-4.2.1/core_framework/domains/entitlement/repository.py +0 -289
- core_framework-4.2.1/docs/domains/entitlement/entitlements.md +0 -191
- {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/building-pydantic-ai-agents +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/fastapi +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/library-skills/.library-skills.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.agents/skills/library-skills/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/alembic-migrations.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-layer.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-reference-docs.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/constitution.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/database-triggers.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/docstrings.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-imports.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/error-boundary.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/flow-documentation.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/ignore-analytics-warehouse.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/inline-raise-messages.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/repository-schema-isolation.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/add-domain/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/building-pydantic-ai-agents +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/code-review/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/design-review/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/fastapi +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/grill/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/sync-host-rules/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.cursor/skills/write-flow-doc/SKILL.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.dockerignore +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package-lock.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package-smoke.sh +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/ci/package_smoke.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/_deploy.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/dev-ci-cd.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/manual-deployment.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/manual-observability-deployment.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.github/workflows/test.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.gitignore +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.pre-commit-config.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/.python-version +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/LICENSE +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/2d61a5e88d76_analytics_utm_events_add_kind.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/585105e1149e_analytics_add_utm_events.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/5b9ac98bb150_analytics_daily_fact.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic/versions/7f2a9c1d4e8b_analytics_daily_fact_day_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/analytics/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_attachments.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_add_comment_mentions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_subject_kind_varchar.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/comment_tombstone_status_model.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/comment/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic/versions/b7ed2400e94e_entitlement_schema.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/entitlement/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/extension/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_add_attachment_staging_registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/media_attachment_staging_registry_published_at.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/media/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/3027828c2c80_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/5be85718122a_moderation_add_review_reports.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/moderation_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/moderation/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/2fdd68777706_notification_read_at_retention_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/a5f29155815d_notification_add_friendship_types.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/b1263ed1a303_notification_inbox_redesign_preview.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/c6b9941065ec_notification_add_group_invite_type.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/fbe8476b4437_notification_add_rating_owner_cue_labels.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/notification/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/0a89b4c23746_post_stats_like_created_post_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/954f00734f36_post_add_post_discovery_rank.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/b3c61daef9b5_post_add_post_bookmarks.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_attachments.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_create_idempotency_created_at_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_add_post_mentions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_post_views_retention_high_water_mark.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/post_tombstone_status_model.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/post/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/versions/04182d734619_rating_list_indexes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic/versions/2ef924b0be4c_rating_schema.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/rating/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/README +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/env.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/script.py.mako +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/089f4398f943_user_add_preference_switches.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/24ba262c4ef2_user_add_account_removal_started_at.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/2dc1d398a840_user_add_groups.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/44df70a45ba6_user_add_signup_events.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/7078e4313554_user_add_friendships.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/922eece707db_align_dead_outbox_keyset_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox_dead_indexes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_add_event_outbox_pending_created_at_index.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/user_reserve_sentinel_user_ids.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/alembic/user/alembic.ini +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/config.toml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/config.toml.template +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/agent/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/agent/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/analytics/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/cache/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/comments/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/outbox/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/posts/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/ratings/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/ratings/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/admin/users/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/attachments/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/mappers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/authenticated/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/comments/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/events/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/groups/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/groups/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/idempotency/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/idempotency/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ingest_guards.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/notifications/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/pagination.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/mappers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/authenticated/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/authenticated/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/pagination.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/public/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/ratings/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/system/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/system/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/upload.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/router.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/mappers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/shared/schemas.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/agent/probe.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/bucket_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/prune_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/read_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/refresh_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/comment_created.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/post_created.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/post_viewed.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/analytics/sources/user_registered.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/access_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/auth_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/auth/token_verification.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/bootstrap.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/invalidate_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/cache/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/admin_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/aggregation_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/authenticated_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/cleanup_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/host_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/kind_registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/post_subject.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/public_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/comments/rating_subject.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/account_deletion_scheduled.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/enqueue.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/email/send.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/entitlement/signature.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/event_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/event_token.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/events/utm_capture_kinds.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/authenticated_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/cleanup_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/group_invite_link_token.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/groups/strip_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/attachment_read.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/attachment_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/avatar_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/banner_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/media/read_url_config.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/appeal_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/moderator_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/report_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/heals.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/mirrors.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/reactions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/restriction_fanout/runner.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/scheduled_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/moderation/user_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/friendship_notification_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/group_invite_notification_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/inbox_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/inbox_type_switch.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/mute_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/notification_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/preview.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/prune_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/notifications/wipe_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/block_mirrors.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/events.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/follow_mirrors.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/handlers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/ops_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/polling_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/processing_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/outbox/restriction_mirrors.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/admin_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/aggregation_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/authenticated_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/cleanup_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/posts/public_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/admin_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/aggregation_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/authenticated_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/kind_registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/public_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/purge_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/serialization.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/ratings/subject_existence.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/deletion_cleanup_ledger.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/request_context.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/shared/worker_jobs.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/contributors.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/registry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/account_removal/runner.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/admin_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/aggregation_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/deletion_audit.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/identity_enrichment.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/public_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/scheduled_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/application/users/user_deletion_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/asgi.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/bundled_alembic.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/cache.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/context.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/database.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/common.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exception_handlers/setup.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/firebase.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/http_client.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/http_probes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/logging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/middleware.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/observability.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/pagination.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/process.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/rate_limit.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/redis.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/runtime.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/core/settings.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/agent/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/ports/activity_source.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/analytics/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/ports/auth.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/auth/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/ports/subject.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/comment/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/ports/send.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/email/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/entitlement/ports/revenuecat.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/components/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/ports/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/attachment/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/components/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/avatar/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/components/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/finals_publisher.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/ports/variant_encoder.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/banner/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/media/shared/utils.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outbox_repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outbox_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/moderation/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/notification/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/admin.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/consumer.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/ports/producer.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/outbox/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/discovery_rank.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/post/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/models.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/ports/subject_existence.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/rating/service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/repository_sql.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/constants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/dependencies.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/enums.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/group_repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/group_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outbox_repository.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outbox_service.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/outcomes.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/user/utils.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/domains/utils.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/agent/anthropic_agent_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/agent/openai_agent_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/email/resend_email_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/firebase/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/firebase/firebase_auth_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/attachment_staging_display_geometry.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_attachment_staging_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_avatar_staging_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/local_banner_staging_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_attachment_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_avatar_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/pillow_staging_image.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_attachment_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/media/staging_paths.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/outbox_consumer_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/infrastructure/outbox/outbox_producer_adapter.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/main.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/migrate_cli.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/py.typed +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/arq.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/auth.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/blockbuster.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/config.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/containers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/firebase.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/firebase_identity_toolkit.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/httpx_test_client.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/media.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/migrations.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/testing/plugin.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/main.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/analytics_refresh_cron.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_rating_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_poll_outbox.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_analytics_daily_facts.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_post_views.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_prune_read_notifications.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_purge_expired_create_idempotency_keys.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_purge_expired_group_invites.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_refresh_analytics.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_restriction_heals.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_attachment_staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_attachment_finals.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/delete_superseded_banner_finals.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_account_deletion.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_account_deletion_scheduled_email.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_admin_user_deletion.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_rating_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_rating_subject_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_attachment_asset_variants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_banner_asset_variants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_block_notification_wipe.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_cache_pattern_invalidation.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_comment_tombstone_cleanup.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_destructive_comment_delete.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_destructive_post_delete.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_friendship_pair_notification_wipe.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_group_invite_notification_wipe.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_media_asset_variants.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_mute_lift.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_outbox_row.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_post_private_notification_wipe.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_post_tombstone_cleanup.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_refresh_analytics_bucket.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_restriction_reactions.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_transactional_email.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/tasks/process_user_content_deletion.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/core_framework/worker/worker_context.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/docker-compose.dev.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/docker-compose.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/app/dockerfile +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/.env.example +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/docker-compose.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/application/api-http.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/application/worker-jobs.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/node-exporter.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/postgres-exporter.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/dashboards/infrastructure/redis-exporter.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/provisioning/dashboards/dashboards.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/grafana/provisioning/datasources/datasources.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/loki.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/otel-collector-config.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/prometheus.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/node/.gitkeep +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/postgres/.gitkeep +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets/redis/.gitkeep +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/node.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/postgres.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.default/redis.yml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/targets.example/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/deploy/observability/tempo.yaml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/deploy-playbook.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/e2e-smoke-tests-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/edge-rate-limits.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/edge-upload-limits.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/Caddyfile.example +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/Caddyfile.observability.example +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/examples/image-server-known-hosts.example +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/playbook/postgres-backup-playbook.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/playbook/py-spy-playbook.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/app-server-deploy-ssh.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/caddy-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/cloudflare-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/image-server-ssh.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/observability-lgtm-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/postgres-backup-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/postgres-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/py-spy-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/redis-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/guides/setup/ubuntu-server-setup.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/host-config-defaults-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/host-config-defaults-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/postgres-backup-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/deployments/release-playbook.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/account-removal-spine-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/analytics-rollup-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/analytics-warehouse-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/bookmark-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/cache-invalidation-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/comment-subject-kinds-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/create-idempotency-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/event-outbox-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/events-ingest-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/list-sort-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/list-sort-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/media-cpu-off-api-refactor.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/media-storage-topology.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/model-call-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/model-call-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderation-restriction-fanout-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderation-restriction-fanout-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderator-surfaces-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/moderator-surfaces-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/observability-lgtm-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/outbox-admin-ops-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-implementation-plan.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/rating-thread-owner-cue-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/restriction-and-block-visibility-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/restriction-and-block-visibility-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/design/utm-events-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/agent/model_call_probe.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/analytics/admin_analytics_reads.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/auth/access_control.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/auth/registration.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/cache/admin_cache_invalidation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/admin_comments.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_like.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_report.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/comment_stats_aggregation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/create_comment.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/delete_comment.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/edit_comment.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/comments/retrieve_comments.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/comments.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/overview.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/posts.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/ratings.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/deletion/users.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/events/events.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/attachment_upload.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/avatar-upload-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/banner-upload-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/post-comment-attachments-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/upload-pipeline-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/media/upload_pipeline.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/mentions/mentions_in_content.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/appeals.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/internal_notes.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/moderator_actions.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/reports.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/moderation/restrictions.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-hint-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/notifications/inbox-hint-implementation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/outbox/admin_outbox_ops.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/admin_posts.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/author_context.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/bookmark-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/bookmark.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/create_post.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/delete_post.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/edit_post.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/hashtag_discovery.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_like.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_report.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_stats_aggregation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/post_visibility.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/posts/retrieve_posts.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/admin_ratings.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/delete_rating.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/edit_rating.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_report.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_stats_aggregation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/rating_upvote.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/retrieve_ratings.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/ratings/upsert_rating.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/account.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/account_deletion.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/admin_users.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/avatar.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/banner.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/blocks.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/change_history.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/check_username_exists.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/follow-system-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/friendship-system-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/groups-system-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/my_posts_and_comments.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/profile.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/public_profile.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/user_removal.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/user_stats_aggregation.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/domains/users/username_suggest.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/capability-wiring.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/core-framework-migration.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/testing-plugin-design.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/library/workers.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/database-triggers.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/domain-services-and-adapters.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/layers-and-boundaries.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/platform/response-composition-and-caching.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/README.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/log.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/review-playbook.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/reviews/slices.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/docs/testing.md +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/firebase_config.example.json +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/makefile +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tach.toml +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_auth.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_canaries.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_media.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_settings.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/_upload_payloads.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/media/pipeline_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/agent_probe_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/canary_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/media_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/system_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/e2e/smoke/tls_host_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/_http_error_details.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/_poll.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/analytics/_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_auth_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_destructive_delete_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_http_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_outbox_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_user_deletion_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/_user_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/_auth_cases.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/analytics/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/analytics/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/cache/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/cache/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/comments/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderation/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderation/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/moderator_surfaces_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/outbox/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/outbox/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/posts/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/posts/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/users/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/admin/users/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/attachment_upload_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/attachments/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/auth/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/auth/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/comment_attachments_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/comment_kind_registry_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/comments/public/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/create_idempotency_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/events/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/groups/groups_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/list_sort_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/media/ingest_contract_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/mentions/mentions_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/inbox_redesign_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/notifications/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/bookmark_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/followers_visibility_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_attachments_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_deletion_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/posts/public/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/public_read_by_id_unavailable_detail_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/rate_limit_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/ratings_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/ratings/ratings_visibility_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/restriction_visibility_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/system/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/account_deletion_email_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/authenticated/friendship_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/deletion_audit_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/public/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/public/router_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/api/users/user_deletion_integration_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_aggregate_stats_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_arq_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/_media_upload_helpers.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/account_deletion_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/analytics_prune_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/analytics_refresh_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/attachment_upload_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/conftest.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/create_idempotency_retention_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/moderation_outbox_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/mute_lift_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/profile_media_upload_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/read_notifications_retention_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/restriction_fanout_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/stale_staging_sweep_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/integration/worker/user_outbox_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/comments/authenticated/comment_request_schemas_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/dedupe_preserving_order_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/posts/authenticated/post_update_mapper_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/ratings/review_pagination_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/api/users/profile_update_mapper_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/comments/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/comments/kind_registry_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/email/account_deletion_scheduled_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/moderation/restriction_fanout_registry_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/notifications/preview_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/ratings/kind_registry_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/shared/request_context_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/account_removal_registry_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/account_removal_runner_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/application/users/deletion_audit_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/core/pagination_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/docs/_api_reference.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/docs/api_routes_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/comment/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/post/models_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
- {core_framework-4.2.1 → core_framework-4.3.0}/tests/unit/worker/tasks_registration_test.py +0 -0
|
@@ -17,10 +17,14 @@ Application services orchestrate use cases shared by API and workers. They stay
|
|
|
17
17
|
## Outcomes
|
|
18
18
|
|
|
19
19
|
- Return plain Python/domain values: `dict`, `list[dict]`, dataclasses, primitives, `None`, or empty collections.
|
|
20
|
-
- Do not return API/Pydantic `BaseModel` instances.
|
|
20
|
+
- Do not return API/Pydantic `BaseModel` instances. Pydantic stays in `core_framework/api/`.
|
|
21
21
|
- Signal HTTP-meaningful failures with **`application.shared.exceptions`** or plain outcomes (`None`, empty), never typed domain exceptions. Full boundary contract: **`error-boundary.mdc`**.
|
|
22
22
|
|
|
23
|
-
|
|
23
|
+
A fixed set of fields that crosses a layer is a dataclass: a domain row, an outcome, or a `*Update` body. Partial writes take that `*Update` type. See `docs/platform/patch-update-typed-payload.md`.
|
|
24
|
+
|
|
25
|
+
- Return a domain dataclass when one domain row matches the result.
|
|
26
|
+
- Return a `dict` when the value is a mapping: a payload assembled from several sources, an id-to-row lookup, or an open bag (outbox payload, action metadata).
|
|
27
|
+
- Job and worker arguments stay JSON-friendly primitives: strings, numbers, booleans, `None`, lists, and dicts.
|
|
24
28
|
|
|
25
29
|
## Function shape
|
|
26
30
|
|
{core_framework-4.2.1 → core_framework-4.3.0}/.cursor/rules/domain-services-and-adapters.mdc
RENAMED
|
@@ -21,6 +21,12 @@ See **`docs/platform/domain-services-and-adapters.md`** for the full model. Appl
|
|
|
21
21
|
- **Repositories** remain **Postgres-only** (SQL in repository + row mapping).
|
|
22
22
|
- **Non-SQL I/O** uses **ports**, **components**, and **adapters**—not `*Repository`.
|
|
23
23
|
|
|
24
|
+
## Records and mappings
|
|
25
|
+
|
|
26
|
+
- Domain rows, outcomes, and `*Update` bodies are dataclasses. Partial writes take `*Update`; column assignments come from `iter_column_updates()`. See `docs/platform/patch-update-typed-payload.md`.
|
|
27
|
+
- A `dict` in the domain is a mapping: an id-to-row lookup, or an open bag such as an outbox payload or action metadata.
|
|
28
|
+
- Composed application return values and job arguments: **`application-layer.mdc`**.
|
|
29
|
+
|
|
24
30
|
## Multiple services per domain
|
|
25
31
|
|
|
26
32
|
- Facade **`*Service`** is wired in `dependencies`; internal **`*Component`** classes wrap ports.
|
|
@@ -12,6 +12,7 @@ globs:
|
|
|
12
12
|
## Policy
|
|
13
13
|
|
|
14
14
|
- **Read-after-write** in the same HTTP request or worker job → **strong** read (required). Refetch with `strong_read_database`, `*_strong` repository methods, or service accessors that call them.
|
|
15
|
+
- A **later request** after a create uses a **normal** read. Trust the replica to catch up. A miss or a stale row in that window is accepted. Do not strong-read that request only because an earlier request created the row. See **`docs/platform/architecture-decisions.md`** → *A later request after create uses the replica (Accepted)*.
|
|
15
16
|
- **Decision-critical guards** where stale data can cause incorrect branching → **strong** read (required). These are reads performed to decide a branch (for example pre-write existence, role, or state checks that determine whether a write runs or which outcome is returned), even when there is no immediate prior write in the flow. See the "Read Consistency (Strong vs Normal Reads)" ADR.
|
|
16
17
|
- **Accepted exception:** **`check_caller_identity`** / **`check_not_banned`** (alias) / **`get_user_detail`** (`USER_DETAIL_V2` cache + normal reads) — ban, deleted-user, and account-removal-in-progress visibility are eventually consistent by design. The removal-started fence rides that cache; do not strong-read it on every gated request. See **`docs/platform/architecture-decisions.md`** → *Ban / identity gate via cached `USER_DETAIL` is eventually consistent*. Do not flag as a strong-read defect unless that ADR is updated.
|
|
17
18
|
- **Accepted exception:** account-removal media **owner listing** of avatar/banner/attachment staging-registry rows uses the **read replica**. Replica lag or swallowed per-blob staging deletes can leave orphan staging after a successful spine. See **`docs/platform/architecture-decisions.md`** → *Account-removal staging leftovers (Accepted)*. Do not flag as a must-succeed or strong-read defect unless that ADR is updated.
|
|
@@ -43,6 +43,7 @@ After the user accepts the API layer (or if there was no API layer):
|
|
|
43
43
|
|
|
44
44
|
- Implement the **Repository** for the domain layer (Postgres only).
|
|
45
45
|
- Include the **domain model** if data is retrieved from the database.
|
|
46
|
+
- Domain rows, outcomes, and `*Update` bodies are dataclasses. A `dict` in the domain is a mapping or an open bag. Follow **`domain-services-and-adapters`** (records and mappings).
|
|
46
47
|
- If the feature needs non-SQL I/O (filesystem, HTTP, SSH), add **ports** in the domain and **adapter implementations** under `core_framework/infrastructure/<domain>/` per `docs/platform/domain-services-and-adapters.md` — not in the repository.
|
|
47
48
|
- Wait for the user to review and accept before proceeding.
|
|
48
49
|
|
|
@@ -52,6 +53,7 @@ After the user accepts the repository (and any ports/adapters):
|
|
|
52
53
|
|
|
53
54
|
- Implement **domain service(s)** (persistence and any port-backed collaborators); wire in `dependencies.py`.
|
|
54
55
|
- Implement the **application** layer (orchestration across domains and transports — no permanent home for raw I/O libraries).
|
|
56
|
+
- Follow **`application-layer`** for dataclass vs `dict`: a fixed field set that crosses a layer is a dataclass; a mapping, a composed payload, or an open bag is a `dict`; job arguments stay JSON-friendly primitives.
|
|
55
57
|
- Wire everything together (replace 501 with real logic).
|
|
56
58
|
- Wait for the user to review and accept before proceeding.
|
|
57
59
|
|
|
@@ -4,6 +4,23 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [4.3.0] - 2026-10-21
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Paid grant with no expiry:** `paid_grants.expires_at` may be null. Null means the grant has no end, and the tier gate treats it as active. When several active items map to one tier and any of them has no expiry, the row's expiry is null. Otherwise the row keeps the latest expiry. The row is deleted when the active list omits that tier.
|
|
12
|
+
- **Standalone tiers:** a one-time hold with a stable string id, outside the numbered ladder. The webhook replace writes it in the same pass as ordered paid rows and deletes it when the active list omits it. The row stores no expiry. After configure, call **`register_standalone_tier`** on the API and the worker. **`require_standalone_tier`** gates a host route on that id. Core ships no such route. **`GET /users/me/entitlements`** adds **`standalone_items`** (always present; empty when the caller holds none). Account removal deletes standalone rows with the other grant rows. Delivery rows stay.
|
|
13
|
+
- **Admin entitlement sync:** `POST /admin/users/{target_user_id}/entitlements/sync` replaces one user's ordered paid rows and standalone rows from RevenueCat. No body. An **admin** calls it. A **moderator** receives **403**. The route stays mounted while entitlements are off and then returns **404** after the identity gate, without calling RevenueCat. A held lock is **409** **Sync in progress**. An unknown entitlement id is **409** **Unknown entitlement**. An unmapped lookup key is **409** **Unmapped entitlement**. A failed fetch is **503**. A successful replace sets that user's cursor to the later of the stored cursor and the fetch start. Complimentary rows stay. There is no moderator-action row and no delivery row.
|
|
14
|
+
- **Login telemetry list:** `GET /users/me/login-history` returns the caller's stored login rows, newest first: **`created_at`**, **`country_code`**, **`client_type`**, **`browser_name`**, and **`os_name`**. Writes stay on `POST /events` with `type: login`.
|
|
15
|
+
|
|
16
|
+
### Changed
|
|
17
|
+
|
|
18
|
+
- **Preferences:** an inbox type switch on `PATCH /users/me/preferences` must be a JSON boolean. `1`, `0`, and `null` are **422**. `theme` and `language` still clear with **`null`**.
|
|
19
|
+
|
|
20
|
+
### Database
|
|
21
|
+
|
|
22
|
+
- Run **`cf-alembic`** before API and worker start. **entitlement** applies **`8ef1f563ccb4`** (`paid_grants.expires_at` nullable) and **`244cc7430989`** (`standalone_grants`). **user** applies **`d438cfba40c0`** (`idx_user_login_events_user_created_at` on `(user_id, created_at desc, id desc)`).
|
|
23
|
+
|
|
7
24
|
## [4.2.1] - 2026-10-10
|
|
8
25
|
|
|
9
26
|
### Changed
|
|
@@ -819,4 +836,5 @@ First **SemVer-stable** release per **`docs/library/package-api.md`**.
|
|
|
819
836
|
[4.1.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.0.1...v4.1.0
|
|
820
837
|
[4.2.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.1.0...v4.2.0
|
|
821
838
|
[4.2.1]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.0...v4.2.1
|
|
822
|
-
[
|
|
839
|
+
[4.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v4.2.1...v4.3.0
|
|
840
|
+
[unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v4.3.0...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 4.
|
|
3
|
+
Version: 4.3.0
|
|
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
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""create standalone grants
|
|
2
|
+
|
|
3
|
+
Revision ID: 244cc7430989
|
|
4
|
+
Revises: 8ef1f563ccb4
|
|
5
|
+
Create Date: 2026-10-18 06:26:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "244cc7430989"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "8ef1f563ccb4"
|
|
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
|
+
create table standalone_grants (
|
|
22
|
+
user_id varchar(128) not null,
|
|
23
|
+
standalone_id varchar(64) not null,
|
|
24
|
+
synced_at timestamptz not null,
|
|
25
|
+
primary key (user_id, standalone_id),
|
|
26
|
+
constraint standalone_grants_standalone_id_not_blank check (length(trim(standalone_id)) > 0)
|
|
27
|
+
);
|
|
28
|
+
""")
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
def downgrade() -> None:
|
|
32
|
+
op.execute("drop table standalone_grants;")
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""allow a paid grant to omit expires_at
|
|
2
|
+
|
|
3
|
+
Revision ID: 8ef1f563ccb4
|
|
4
|
+
Revises: b7ed2400e94e
|
|
5
|
+
Create Date: 2026-10-18 05:50:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "8ef1f563ccb4"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "b7ed2400e94e"
|
|
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 paid_grants
|
|
22
|
+
alter column expires_at drop not null;
|
|
23
|
+
""")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
op.execute("""
|
|
28
|
+
alter table paid_grants
|
|
29
|
+
alter column expires_at set not null;
|
|
30
|
+
""")
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"""index user login telemetry by user, newest first
|
|
2
|
+
|
|
3
|
+
Revision ID: d438cfba40c0
|
|
4
|
+
Revises: 089f4398f943
|
|
5
|
+
Create Date: 2026-10-13 05:44:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "d438cfba40c0"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "089f4398f943"
|
|
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
|
+
create index if not exists idx_user_login_events_user_created_at
|
|
22
|
+
on user_login_events (user_id, created_at desc, id desc);
|
|
23
|
+
""")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def downgrade() -> None:
|
|
27
|
+
op.execute("drop index if exists idx_user_login_events_user_created_at;")
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
from typing import Annotated, Any
|
|
2
|
+
|
|
3
|
+
from fastapi import APIRouter, Depends, HTTPException, Path, status
|
|
4
|
+
|
|
5
|
+
from core_framework.api.dependencies import RequiredUserID, check_admin_role
|
|
6
|
+
from core_framework.api.entitlements.schemas import (
|
|
7
|
+
EntitlementItemResponse,
|
|
8
|
+
EntitlementsResponse,
|
|
9
|
+
StandaloneEntitlementItemResponse,
|
|
10
|
+
)
|
|
11
|
+
from core_framework.api.users.shared.schemas import validate_user_id
|
|
12
|
+
from core_framework.application.entitlement.grant_service import grant_complimentary_tier, remove_complimentary_tier
|
|
13
|
+
from core_framework.application.entitlement.registry import entitlements_enabled
|
|
14
|
+
from core_framework.application.entitlement.sync_service import sync_user_paid_entitlements
|
|
15
|
+
from core_framework.core.exception_handlers.common import GENERIC_NOT_FOUND_DETAIL
|
|
16
|
+
|
|
17
|
+
router = APIRouter(
|
|
18
|
+
prefix="/users",
|
|
19
|
+
tags=["entitlements - admin"],
|
|
20
|
+
dependencies=[Depends(check_admin_role)],
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
@router.put("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
25
|
+
async def put_complimentary_entitlement(
|
|
26
|
+
actor_id: RequiredUserID,
|
|
27
|
+
target_user_id: str,
|
|
28
|
+
tier_id: Annotated[int, Path(ge=1)],
|
|
29
|
+
) -> None:
|
|
30
|
+
validated_target_user_id = validate_user_id(user_id=target_user_id)
|
|
31
|
+
await grant_complimentary_tier(
|
|
32
|
+
actor_id=actor_id,
|
|
33
|
+
target_user_id=validated_target_user_id,
|
|
34
|
+
tier_id=tier_id,
|
|
35
|
+
)
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
@router.delete("/{target_user_id}/entitlements/{tier_id}", status_code=status.HTTP_204_NO_CONTENT)
|
|
39
|
+
async def delete_complimentary_entitlement(
|
|
40
|
+
actor_id: RequiredUserID,
|
|
41
|
+
target_user_id: str,
|
|
42
|
+
tier_id: Annotated[int, Path(ge=1)],
|
|
43
|
+
) -> None:
|
|
44
|
+
validated_target_user_id = validate_user_id(user_id=target_user_id)
|
|
45
|
+
await remove_complimentary_tier(
|
|
46
|
+
actor_id=actor_id,
|
|
47
|
+
target_user_id=validated_target_user_id,
|
|
48
|
+
tier_id=tier_id,
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
@router.post("/{target_user_id}/entitlements/sync", response_model=EntitlementsResponse)
|
|
53
|
+
async def sync_user_entitlements(actor_id: RequiredUserID, target_user_id: str) -> Any:
|
|
54
|
+
if not entitlements_enabled():
|
|
55
|
+
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=GENERIC_NOT_FOUND_DETAIL)
|
|
56
|
+
validated_target_user_id = validate_user_id(user_id=target_user_id)
|
|
57
|
+
items, standalone_items = await sync_user_paid_entitlements(
|
|
58
|
+
actor_id=actor_id,
|
|
59
|
+
target_user_id=validated_target_user_id,
|
|
60
|
+
)
|
|
61
|
+
return EntitlementsResponse(
|
|
62
|
+
items=[
|
|
63
|
+
EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
|
|
64
|
+
for item in items
|
|
65
|
+
],
|
|
66
|
+
standalone_items=[
|
|
67
|
+
StandaloneEntitlementItemResponse(
|
|
68
|
+
standalone_id=item.standalone_id,
|
|
69
|
+
identifier=item.identifier,
|
|
70
|
+
expires_at=item.expires_at,
|
|
71
|
+
)
|
|
72
|
+
for item in standalone_items
|
|
73
|
+
],
|
|
74
|
+
)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
from typing import Annotated
|
|
2
|
+
|
|
3
|
+
from fastapi import Depends
|
|
4
|
+
|
|
5
|
+
from core_framework.api.dependencies import RequiredUserID, check_caller_identity
|
|
6
|
+
from core_framework.application.entitlement.grant_service import require_caller_standalone_tier, require_caller_tier
|
|
7
|
+
from core_framework.application.entitlement.registry import note_standalone_gate, note_tier_gate
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def require_tier(tier_id: int):
|
|
11
|
+
"""Route dependency for one tier id. Allows the route while entitlements are off."""
|
|
12
|
+
if tier_id < 1:
|
|
13
|
+
raise ValueError("tier_id must be at least 1")
|
|
14
|
+
note_tier_gate(tier_id)
|
|
15
|
+
|
|
16
|
+
async def gate(
|
|
17
|
+
user_id: RequiredUserID,
|
|
18
|
+
_: Annotated[None, Depends(check_caller_identity)],
|
|
19
|
+
) -> None:
|
|
20
|
+
del _
|
|
21
|
+
await require_caller_tier(user_id=user_id, tier_id=tier_id)
|
|
22
|
+
|
|
23
|
+
return gate
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def require_standalone_tier(standalone_id: str):
|
|
27
|
+
"""Route dependency for one standalone id. Allows the route while entitlements are off."""
|
|
28
|
+
cleaned_id = standalone_id.strip()
|
|
29
|
+
if not cleaned_id:
|
|
30
|
+
raise ValueError("standalone tier id must be non-blank")
|
|
31
|
+
if "\r" in cleaned_id or "\n" in cleaned_id:
|
|
32
|
+
raise ValueError("standalone tier id must not contain a carriage return or line feed")
|
|
33
|
+
if len(cleaned_id) > 64:
|
|
34
|
+
raise ValueError("standalone tier id must be at most 64 characters")
|
|
35
|
+
note_standalone_gate(cleaned_id)
|
|
36
|
+
|
|
37
|
+
async def gate(
|
|
38
|
+
user_id: RequiredUserID,
|
|
39
|
+
_: Annotated[None, Depends(check_caller_identity)],
|
|
40
|
+
) -> None:
|
|
41
|
+
del _
|
|
42
|
+
await require_caller_standalone_tier(user_id=user_id, standalone_id=cleaned_id)
|
|
43
|
+
|
|
44
|
+
return gate
|
|
@@ -3,8 +3,15 @@ from typing import Any
|
|
|
3
3
|
from fastapi import APIRouter, Depends, Request
|
|
4
4
|
|
|
5
5
|
from core_framework.api.dependencies import RequiredUserID, check_caller_identity
|
|
6
|
-
from core_framework.api.entitlements.schemas import
|
|
7
|
-
|
|
6
|
+
from core_framework.api.entitlements.schemas import (
|
|
7
|
+
EntitlementItemResponse,
|
|
8
|
+
EntitlementsResponse,
|
|
9
|
+
StandaloneEntitlementItemResponse,
|
|
10
|
+
)
|
|
11
|
+
from core_framework.application.entitlement.grant_service import (
|
|
12
|
+
list_caller_entitlements,
|
|
13
|
+
list_caller_standalone_entitlements,
|
|
14
|
+
)
|
|
8
15
|
from core_framework.application.entitlement.webhook_service import handle_revenuecat_webhook
|
|
9
16
|
|
|
10
17
|
webhook_router = APIRouter(tags=["entitlements"])
|
|
@@ -25,9 +32,18 @@ async def post_revenuecat_webhook(request: Request) -> None:
|
|
|
25
32
|
)
|
|
26
33
|
async def get_my_entitlements(user_id: RequiredUserID) -> Any:
|
|
27
34
|
items = await list_caller_entitlements(user_id=user_id)
|
|
35
|
+
standalone_items = await list_caller_standalone_entitlements(user_id=user_id)
|
|
28
36
|
return EntitlementsResponse(
|
|
29
37
|
items=[
|
|
30
38
|
EntitlementItemResponse(tier_id=item.tier_id, identifier=item.identifier, expires_at=item.expires_at)
|
|
31
39
|
for item in items
|
|
32
|
-
]
|
|
40
|
+
],
|
|
41
|
+
standalone_items=[
|
|
42
|
+
StandaloneEntitlementItemResponse(
|
|
43
|
+
standalone_id=item.standalone_id,
|
|
44
|
+
identifier=item.identifier,
|
|
45
|
+
expires_at=item.expires_at,
|
|
46
|
+
)
|
|
47
|
+
for item in standalone_items
|
|
48
|
+
],
|
|
33
49
|
)
|
|
@@ -9,5 +9,12 @@ class EntitlementItemResponse(BaseModel):
|
|
|
9
9
|
expires_at: datetime | None
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
class StandaloneEntitlementItemResponse(BaseModel):
|
|
13
|
+
standalone_id: str = Field(min_length=1, max_length=64)
|
|
14
|
+
identifier: str = Field(min_length=1)
|
|
15
|
+
expires_at: datetime | None
|
|
16
|
+
|
|
17
|
+
|
|
12
18
|
class EntitlementsResponse(BaseModel):
|
|
13
19
|
items: list[EntitlementItemResponse]
|
|
20
|
+
standalone_items: list[StandaloneEntitlementItemResponse]
|
{core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/router.py
RENAMED
|
@@ -34,6 +34,7 @@ from core_framework.api.users.authenticated.schemas import (
|
|
|
34
34
|
BlockedUserResponse,
|
|
35
35
|
FollowUserResponse,
|
|
36
36
|
FriendUserResponse,
|
|
37
|
+
LoginHistoryItemResponse,
|
|
37
38
|
MyAppealsResponse,
|
|
38
39
|
PreferencesResponse,
|
|
39
40
|
PreferencesUpdateRequest,
|
|
@@ -79,6 +80,7 @@ from core_framework.application.users.authenticated_service import (
|
|
|
79
80
|
retrieve_my_followers,
|
|
80
81
|
retrieve_my_following,
|
|
81
82
|
retrieve_my_friends,
|
|
83
|
+
retrieve_my_login_telemetry,
|
|
82
84
|
retrieve_my_preferences,
|
|
83
85
|
retrieve_my_profile,
|
|
84
86
|
retrieve_my_username_suggestions,
|
|
@@ -93,6 +95,7 @@ from core_framework.application.users.authenticated_service import (
|
|
|
93
95
|
)
|
|
94
96
|
from core_framework.application.users.user_deletion_service import accept_delete_my_content
|
|
95
97
|
from core_framework.core import RateLimitKey
|
|
98
|
+
from core_framework.core.exceptions import InvalidPageTokenError
|
|
96
99
|
from core_framework.domains.media import (
|
|
97
100
|
AVATAR_INGEST_MAX_BYTES,
|
|
98
101
|
AVATAR_INGEST_UPLOAD_CHUNK_BYTES,
|
|
@@ -333,6 +336,37 @@ async def get_my_ratings(
|
|
|
333
336
|
)
|
|
334
337
|
|
|
335
338
|
|
|
339
|
+
@router.get(
|
|
340
|
+
"/me/login-history",
|
|
341
|
+
response_model=PaginationResponse[LoginHistoryItemResponse],
|
|
342
|
+
dependencies=[Depends(check_caller_identity)],
|
|
343
|
+
)
|
|
344
|
+
async def get_my_login_history(
|
|
345
|
+
request: Request,
|
|
346
|
+
user_id: RequiredUserID,
|
|
347
|
+
pagination_params: Annotated[TokenCursorQueryParams, Depends()],
|
|
348
|
+
) -> Any:
|
|
349
|
+
cursor_id: int | None = None
|
|
350
|
+
if pagination_params.cursor_string_id is not None:
|
|
351
|
+
try:
|
|
352
|
+
cursor_id = int(pagination_params.cursor_string_id)
|
|
353
|
+
except ValueError:
|
|
354
|
+
raise InvalidPageTokenError() from None
|
|
355
|
+
if cursor_id < 1 or cursor_id > 2**63 - 1:
|
|
356
|
+
raise InvalidPageTokenError()
|
|
357
|
+
items = await retrieve_my_login_telemetry(
|
|
358
|
+
user_id=user_id,
|
|
359
|
+
cursor_created_at=pagination_params.cursor if cursor_id is not None else None,
|
|
360
|
+
cursor_id=cursor_id,
|
|
361
|
+
limit=pagination_params.limit,
|
|
362
|
+
)
|
|
363
|
+
return paginate_datetime_id_cursor(
|
|
364
|
+
request=request,
|
|
365
|
+
items=items,
|
|
366
|
+
pagination_params=pagination_params,
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
|
|
336
370
|
@router.get(
|
|
337
371
|
"/me/preferences",
|
|
338
372
|
response_model=PreferencesResponse,
|
{core_framework-4.2.1 → core_framework-4.3.0}/core_framework/api/users/authenticated/schemas.py
RENAMED
|
@@ -49,6 +49,14 @@ class FriendUserResponse(BaseModel):
|
|
|
49
49
|
accepted_at: datetime
|
|
50
50
|
|
|
51
51
|
|
|
52
|
+
class LoginHistoryItemResponse(BaseModel):
|
|
53
|
+
created_at: datetime
|
|
54
|
+
country_code: str | None
|
|
55
|
+
client_type: str | None
|
|
56
|
+
browser_name: str | None
|
|
57
|
+
os_name: str | None
|
|
58
|
+
|
|
59
|
+
|
|
52
60
|
class ProfileResponse(AvatarMixin, BannerMixin):
|
|
53
61
|
display_name: DisplayName | None
|
|
54
62
|
bio: Bio | None
|
|
@@ -111,6 +119,8 @@ class PreferencesResponse(BaseModel):
|
|
|
111
119
|
group_invites: bool = True
|
|
112
120
|
|
|
113
121
|
|
|
122
|
+
_StrictBool = Annotated[bool, Field(strict=True)]
|
|
123
|
+
|
|
114
124
|
_SWITCH_FIELDS: Final[frozenset[str]] = frozenset(
|
|
115
125
|
{"comments", "replies", "mentions", "follows", "friend_requests", "group_invites"}
|
|
116
126
|
)
|
|
@@ -119,12 +129,12 @@ _SWITCH_FIELDS: Final[frozenset[str]] = frozenset(
|
|
|
119
129
|
class PreferencesUpdateRequest(BasePatchRequest):
|
|
120
130
|
theme: Theme | None = None
|
|
121
131
|
language: Annotated[str | None, Field(default=None, max_length=10)]
|
|
122
|
-
comments:
|
|
123
|
-
replies:
|
|
124
|
-
mentions:
|
|
125
|
-
follows:
|
|
126
|
-
friend_requests:
|
|
127
|
-
group_invites:
|
|
132
|
+
comments: _StrictBool | None = None
|
|
133
|
+
replies: _StrictBool | None = None
|
|
134
|
+
mentions: _StrictBool | None = None
|
|
135
|
+
follows: _StrictBool | None = None
|
|
136
|
+
friend_requests: _StrictBool | None = None
|
|
137
|
+
group_invites: _StrictBool | None = None
|
|
128
138
|
|
|
129
139
|
@model_validator(mode="after")
|
|
130
140
|
def reject_null_switches(self) -> PreferencesUpdateRequest:
|
|
@@ -78,25 +78,29 @@ def render_entitlement_grant_refused(context: Mapping[str, Any]) -> tuple[str, s
|
|
|
78
78
|
lookup_key = context.get("lookup_key")
|
|
79
79
|
lookup_line = f"Lookup key: {lookup_key}\n" if lookup_key is not None else ""
|
|
80
80
|
lookup_html = f"<p>Lookup key: {escape(str(lookup_key))}</p>" if lookup_key is not None else ""
|
|
81
|
-
subject = "Entitlement grant refused"
|
|
81
|
+
subject = "Entitlement grant refused: ordered tier map or standalone map"
|
|
82
82
|
plain_text_body = (
|
|
83
|
-
"
|
|
83
|
+
"An entitlement grant was refused and needs attention. "
|
|
84
|
+
"Paid rows and standalone rows were left unchanged.\n\n"
|
|
84
85
|
f"Reason: {reason}\n"
|
|
85
86
|
f"Entitlement id: {entitlement_id}\n"
|
|
86
87
|
f"{lookup_line}"
|
|
87
88
|
f"User id: {user_id}\n"
|
|
88
89
|
f"Event id: {event_id}\n\n"
|
|
89
|
-
"Fix the tier map or the
|
|
90
|
+
"Fix the ordered tier map or the standalone map, or the RevenueCat entitlement, "
|
|
91
|
+
"restart the API after an entitlement change, "
|
|
90
92
|
"and resend this event from the RevenueCat dashboard.\n"
|
|
91
93
|
)
|
|
92
94
|
html_body = (
|
|
93
|
-
"<p>
|
|
95
|
+
"<p>An entitlement grant was refused and needs attention. "
|
|
96
|
+
"Paid rows and standalone rows were left unchanged.</p>"
|
|
94
97
|
f"<p>Reason: {escape(reason)}</p>"
|
|
95
98
|
f"<p>Entitlement id: {escape(entitlement_id)}</p>"
|
|
96
99
|
f"{lookup_html}"
|
|
97
100
|
f"<p>User id: {escape(user_id)}</p>"
|
|
98
101
|
f"<p>Event id: {escape(event_id)}</p>"
|
|
99
|
-
"<p>Fix the tier map or the
|
|
102
|
+
"<p>Fix the ordered tier map or the standalone map, or the RevenueCat entitlement, "
|
|
103
|
+
"restart the API after an entitlement change, "
|
|
100
104
|
"and resend this event from the RevenueCat dashboard.</p>"
|
|
101
105
|
)
|
|
102
106
|
return subject, html_body, plain_text_body
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import asyncpg
|
|
2
|
+
|
|
3
|
+
import core_framework.domains.user.dependencies as user_deps
|
|
4
|
+
from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
async def is_core_user(*, user_id: str) -> bool:
|
|
8
|
+
"""Return whether this id is a core user whose account removal has not started."""
|
|
9
|
+
if user_id in RESERVED_USER_IDS:
|
|
10
|
+
return False
|
|
11
|
+
identity = await user_deps.user_service.retrieve_user_identity_strong(user_id=user_id)
|
|
12
|
+
if identity == UserIdentity.DEFAULT:
|
|
13
|
+
return False
|
|
14
|
+
return not await user_deps.user_service.retrieve_account_removal_in_progress_strong(user_id=user_id)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
async def is_core_user_on_connection(*, connection: asyncpg.Connection, user_id: str) -> bool:
|
|
18
|
+
"""Return whether this id is a core user on a primary session already checked out."""
|
|
19
|
+
if user_id in RESERVED_USER_IDS:
|
|
20
|
+
return False
|
|
21
|
+
return await user_deps.user_service.retrieve_user_removal_not_started_on_connection(
|
|
22
|
+
connection=connection,
|
|
23
|
+
user_id=user_id,
|
|
24
|
+
)
|
|
@@ -3,15 +3,19 @@ from datetime import UTC, datetime
|
|
|
3
3
|
|
|
4
4
|
import core_framework.domains.entitlement.dependencies as entitlement_deps
|
|
5
5
|
import core_framework.domains.moderation.dependencies as moderation_deps
|
|
6
|
-
|
|
7
|
-
from core_framework.application.entitlement.registry import
|
|
6
|
+
from core_framework.application.entitlement.core_user import is_core_user
|
|
7
|
+
from core_framework.application.entitlement.registry import (
|
|
8
|
+
entitlements_enabled,
|
|
9
|
+
standalone_identifier,
|
|
10
|
+
tier_identifier,
|
|
11
|
+
tier_is_registered,
|
|
12
|
+
)
|
|
8
13
|
from core_framework.application.shared.exceptions import (
|
|
9
14
|
EntitlementRequiredException,
|
|
10
15
|
UnprocessableEntityException,
|
|
11
16
|
UserNotFoundException,
|
|
12
17
|
)
|
|
13
18
|
from core_framework.domains.moderation import ModerationActionType
|
|
14
|
-
from core_framework.domains.user import RESERVED_USER_IDS, UserIdentity
|
|
15
19
|
|
|
16
20
|
|
|
17
21
|
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
@@ -21,6 +25,13 @@ class CallerEntitlement:
|
|
|
21
25
|
expires_at: datetime | None
|
|
22
26
|
|
|
23
27
|
|
|
28
|
+
@dataclass(frozen=True, slots=True, kw_only=True)
|
|
29
|
+
class CallerStandaloneEntitlement:
|
|
30
|
+
standalone_id: str
|
|
31
|
+
identifier: str
|
|
32
|
+
expires_at: datetime | None
|
|
33
|
+
|
|
34
|
+
|
|
24
35
|
async def list_caller_entitlements(*, user_id: str) -> list[CallerEntitlement]:
|
|
25
36
|
"""Return this caller's active tiers with each tier's identifier."""
|
|
26
37
|
tiers = await entitlement_deps.entitlement_service.list_active_tiers(user_id=user_id)
|
|
@@ -33,6 +44,18 @@ async def list_caller_entitlements(*, user_id: str) -> list[CallerEntitlement]:
|
|
|
33
44
|
return items
|
|
34
45
|
|
|
35
46
|
|
|
47
|
+
async def list_caller_standalone_entitlements(*, user_id: str) -> list[CallerStandaloneEntitlement]:
|
|
48
|
+
"""Return this caller's standalone holds with each id's lookup key."""
|
|
49
|
+
standalone_ids = await entitlement_deps.entitlement_service.list_standalone_ids(user_id=user_id)
|
|
50
|
+
items: list[CallerStandaloneEntitlement] = []
|
|
51
|
+
for standalone_id in standalone_ids:
|
|
52
|
+
identifier = standalone_identifier(standalone_id)
|
|
53
|
+
if identifier is None:
|
|
54
|
+
continue
|
|
55
|
+
items.append(CallerStandaloneEntitlement(standalone_id=standalone_id, identifier=identifier, expires_at=None))
|
|
56
|
+
return items
|
|
57
|
+
|
|
58
|
+
|
|
36
59
|
async def caller_holds_tier(*, user_id: str, tier_id: int) -> bool:
|
|
37
60
|
"""Return whether the caller holds an active tier at or above the gate. Off means yes."""
|
|
38
61
|
if not entitlements_enabled():
|
|
@@ -47,11 +70,27 @@ async def require_caller_tier(*, user_id: str, tier_id: int) -> None:
|
|
|
47
70
|
raise EntitlementRequiredException()
|
|
48
71
|
|
|
49
72
|
|
|
73
|
+
async def caller_holds_standalone_tier(*, user_id: str, standalone_id: str) -> bool:
|
|
74
|
+
"""Return whether the caller holds that standalone id. Off means yes."""
|
|
75
|
+
if not entitlements_enabled():
|
|
76
|
+
return True
|
|
77
|
+
return await entitlement_deps.entitlement_service.standalone_grant_exists(
|
|
78
|
+
user_id=user_id,
|
|
79
|
+
standalone_id=standalone_id,
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
async def require_caller_standalone_tier(*, user_id: str, standalone_id: str) -> None:
|
|
84
|
+
"""Raise when entitlements are on and the caller does not hold that standalone id."""
|
|
85
|
+
if not await caller_holds_standalone_tier(user_id=user_id, standalone_id=standalone_id):
|
|
86
|
+
raise EntitlementRequiredException()
|
|
87
|
+
|
|
88
|
+
|
|
50
89
|
async def grant_complimentary_tier(*, actor_id: str, target_user_id: str, tier_id: int) -> None:
|
|
51
90
|
"""Grant a complimentary tier. Unknown tier is 422. A missing or removing target is 404."""
|
|
52
91
|
if not tier_is_registered(tier_id):
|
|
53
92
|
raise UnprocessableEntityException()
|
|
54
|
-
if not await
|
|
93
|
+
if not await is_core_user(user_id=target_user_id):
|
|
55
94
|
raise UserNotFoundException()
|
|
56
95
|
inserted = await entitlement_deps.entitlement_service.insert_complimentary_grant(
|
|
57
96
|
user_id=target_user_id,
|
|
@@ -85,12 +124,3 @@ async def remove_complimentary_tier(*, actor_id: str, target_user_id: str, tier_
|
|
|
85
124
|
target_user_id=target_user_id,
|
|
86
125
|
action_metadata={"tier_id": tier_id},
|
|
87
126
|
)
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
async def _is_core_user(*, user_id: str) -> bool:
|
|
91
|
-
if user_id in RESERVED_USER_IDS:
|
|
92
|
-
return False
|
|
93
|
-
identity = await user_deps.user_service.retrieve_user_identity_strong(user_id=user_id)
|
|
94
|
-
if identity == UserIdentity.DEFAULT:
|
|
95
|
-
return False
|
|
96
|
-
return not await user_deps.user_service.retrieve_account_removal_in_progress_strong(user_id=user_id)
|