core-framework 1.5.0__tar.gz → 1.7.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-1.5.0 → core_framework-1.7.0}/.cursor/rules/api-layer.mdc +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/api-reference-docs.mdc +5 -5
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/database-triggers.md +4 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-services-and-adapters.mdc +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/flow-documentation.mdc +4 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/henry-cursor-rules-sync.mdc +5 -6
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/implementation-workflow.mdc +1 -1
- core_framework-1.7.0/.cursor/rules/karpathy-guidelines.mdc +70 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/skills/add-domain/SKILL.md +2 -2
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/skills/code-review/SKILL.md +5 -5
- {core_framework-1.5.0 → core_framework-1.7.0}/.github/workflows/_deploy.yml +9 -7
- {core_framework-1.5.0 → core_framework-1.7.0}/.gitignore +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/CHANGELOG.md +54 -25
- {core_framework-1.5.0 → core_framework-1.7.0}/PKG-INFO +3 -3
- {core_framework-1.5.0 → core_framework-1.7.0}/README.md +2 -2
- core_framework-1.7.0/alembic/media/alembic/versions/media_add_banner_staging_and_lease.py +43 -0
- core_framework-1.7.0/alembic/user/alembic/versions/user_add_banner_ingest_sequences.py +34 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/config.toml +9 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/config.toml.template +5 -3
- core_framework-1.7.0/core_framework/api/admin/cache/router.py +32 -0
- core_framework-1.7.0/core_framework/api/admin/cache/schemas.py +95 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/router.py +2 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/users/schemas.py +0 -2
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/router.py +51 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/schemas.py +5 -2
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/mappers.py +0 -20
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/shared/schemas.py +15 -6
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/auth/access_service.py +11 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/auth/auth_service.py +8 -0
- core_framework-1.7.0/core_framework/application/cache/invalidate_service.py +75 -0
- core_framework-1.7.0/core_framework/application/cache/models.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/comments/admin_service.py +42 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/comments/aggregation_service.py +7 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/comments/authenticated_service.py +52 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/comments/public_service.py +44 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/events/event_service.py +22 -0
- core_framework-1.7.0/core_framework/application/media/README.md +17 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/media/avatar_service.py +60 -0
- core_framework-1.7.0/core_framework/application/media/banner_service.py +149 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/appeal_service.py +29 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/moderator_service.py +13 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/report_service.py +16 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/scheduled_service.py +7 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/user_service.py +93 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/notifications/README.md +2 -2
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/notifications/inbox_service.py +32 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/notifications/mute_service.py +9 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/notifications/notification_service.py +19 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/posts/admin_service.py +33 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/posts/aggregation_service.py +7 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/posts/authenticated_service.py +29 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/posts/public_service.py +42 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/shared/enums.py +3 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/admin_service.py +108 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/aggregation_service.py +3 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/authenticated_service.py +54 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/public_service.py +1 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/scheduled_service.py +1 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/cache.py +14 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/media.py +40 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/settings.py +13 -9
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/README.md +5 -5
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/service.py +130 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/README.md +7 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/__init__.py +25 -0
- core_framework-1.7.0/core_framework/domains/media/avatar/components/finals_publisher.py +39 -0
- core_framework-1.7.0/core_framework/domains/media/avatar/components/staging.py +112 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/components/variant_encoder.py +15 -0
- core_framework-1.7.0/core_framework/domains/media/avatar/ports/finals_publisher.py +30 -0
- core_framework-1.7.0/core_framework/domains/media/avatar/ports/staging.py +41 -0
- core_framework-1.7.0/core_framework/domains/media/avatar/ports/variant_encoder.py +19 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/service.py +136 -0
- core_framework-1.7.0/core_framework/domains/media/banner/components/finals_publisher.py +14 -0
- {core_framework-1.5.0/core_framework/domains/media/avatar → core_framework-1.7.0/core_framework/domains/media/banner}/components/staging.py +18 -14
- core_framework-1.7.0/core_framework/domains/media/banner/components/variant_encoder.py +16 -0
- core_framework-1.7.0/core_framework/domains/media/banner/constants.py +26 -0
- core_framework-1.7.0/core_framework/domains/media/banner/exceptions.py +26 -0
- core_framework-1.7.0/core_framework/domains/media/banner/models.py +23 -0
- core_framework-1.7.0/core_framework/domains/media/banner/ports/finals_publisher.py +29 -0
- core_framework-1.7.0/core_framework/domains/media/banner/ports/staging.py +41 -0
- core_framework-1.7.0/core_framework/domains/media/banner/ports/variant_encoder.py +19 -0
- core_framework-1.7.0/core_framework/domains/media/banner/service.py +152 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/dependencies.py +58 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/shared/repository.py +166 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/shared/utils.py +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/README.md +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/service.py +94 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/README.md +3 -3
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/service.py +45 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/README.md +4 -4
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/service.py +135 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/README.md +1 -1
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/__init__.py +2 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/models.py +6 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/repository.py +57 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/service.py +117 -0
- core_framework-1.7.0/core_framework/infrastructure/media/local_banner_staging_adapter.py +61 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/infrastructure/media/local_staging_adapter.py +36 -0
- core_framework-1.7.0/core_framework/infrastructure/media/pillow_banner_variant_encoder_adapter.py +36 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/infrastructure/media/pillow_variant_encoder_adapter.py +16 -0
- core_framework-1.7.0/core_framework/infrastructure/media/ssh_banner_finals_publisher_adapter.py +82 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/infrastructure/media/ssh_finals_publisher_adapter.py +26 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/arq.py +13 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/auth.py +73 -0
- core_framework-1.7.0/core_framework/testing/config.py +44 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/containers.py +18 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/firebase.py +19 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/httpx_test_client.py +11 -0
- core_framework-1.7.0/core_framework/testing/media.py +197 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/plugin.py +39 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/__init__.py +10 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_comment_stats.py +16 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_post_stats.py +16 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_aggregate_user_stats.py +16 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_expired_account_deletions.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_expired_mute_lifts.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/schedules/schedule_sweep_stale_avatar_staging.py +12 -0
- core_framework-1.7.0/core_framework/worker/schedules/schedule_sweep_stale_banner_staging.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/__init__.py +6 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/delete_superseded_avatar_finals.py +12 -0
- core_framework-1.7.0/core_framework/worker/tasks/delete_superseded_banner_finals.py +17 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_account_deletion.py +14 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_comment_stats.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_post_stats.py +15 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_aggregate_user_stats.py +15 -0
- core_framework-1.5.0/core_framework/worker/tasks/process_media_asset_variants.py → core_framework-1.7.0/core_framework/worker/tasks/process_banner_asset_variants.py +6 -5
- core_framework-1.7.0/core_framework/worker/tasks/process_cache_pattern_invalidation.py +26 -0
- core_framework-1.7.0/core_framework/worker/tasks/process_media_asset_variants.py +46 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/tasks/process_mute_lift.py +13 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/docker-compose.yml +2 -2
- core_framework-1.7.0/docs/README.md +28 -0
- core_framework-1.7.0/docs/deployments/README.md +31 -0
- core_framework-1.7.0/docs/deployments/deploy-playbook.md +133 -0
- {core_framework-1.5.0/docs/deployment → core_framework-1.7.0/docs/deployments}/edge-upload-limits.md +14 -12
- {core_framework-1.5.0/docs/deployment → core_framework-1.7.0/docs/deployments/examples}/Caddyfile.example +14 -2
- core_framework-1.7.0/docs/deployments/guides/app-server-deploy-ssh.md +50 -0
- core_framework-1.7.0/docs/deployments/guides/image-server-ssh.md +57 -0
- core_framework-1.7.0/docs/deployments/guides/postgres-setup.md +153 -0
- core_framework-1.7.0/docs/deployments/guides/redis-setup.md +109 -0
- core_framework-1.7.0/docs/deployments/guides/ubuntu-server-setup.md +173 -0
- core_framework-1.7.0/docs/domains/README.md +16 -0
- core_framework-1.7.0/docs/domains/cache/admin_cache_invalidation.md +219 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/comment_report.md +1 -1
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/create_comment.md +1 -1
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/retrieve_comments.md +1 -1
- core_framework-1.7.0/docs/domains/media/avatar-upload-design.md +109 -0
- core_framework-1.7.0/docs/domains/media/banner-upload-design.md +150 -0
- core_framework-1.5.0/docs/media-upload-pipeline-design.md → core_framework-1.7.0/docs/domains/media/upload-pipeline-design.md +33 -28
- core_framework-1.7.0/docs/domains/media/upload_pipeline.md +60 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/mentions/mentions_in_content.md +7 -7
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/reports.md +1 -1
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/notifications/notification_inbox.md +8 -8
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/author_context.md +5 -5
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/hashtag_discovery.md +1 -1
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_visibility.md +1 -1
- core_framework-1.7.0/docs/domains/users/banner.md +79 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/domains/users}/follow-system-design.md +28 -27
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/follow.md +3 -3
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/my_posts_and_comments.md +7 -7
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/profile.md +61 -7
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/user_removal.md +2 -2
- core_framework-1.7.0/docs/library/README.md +11 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/library}/api.md +8 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/library}/core-framework-migration.md +11 -11
- core_framework-1.7.0/docs/library/overview.md +49 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/library}/package-api.md +8 -8
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/library}/testing-plugin-design.md +2 -2
- core_framework-1.7.0/docs/platform/README.md +13 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/platform}/architecture-decisions.md +9 -9
- core_framework-1.7.0/docs/platform/conventions.md +75 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/platform}/database-triggers.md +1 -1
- core_framework-1.7.0/docs/platform/domain-services-and-adapters.md +91 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/platform}/event-outbox-design.md +45 -45
- core_framework-1.7.0/docs/platform/layers-and-boundaries.md +46 -0
- {core_framework-1.5.0/docs → core_framework-1.7.0/docs/platform}/patch-update-typed-payload.md +3 -3
- {core_framework-1.5.0 → core_framework-1.7.0}/docs/todo.md +0 -2
- {core_framework-1.5.0 → core_framework-1.7.0}/pyproject.toml +1 -1
- core_framework-1.7.0/tests/integration/api/admin/cache/router_test.py +357 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/admin/users/router_test.py +4 -1
- core_framework-1.7.0/tests/integration/api/users/authenticated/banner_upload_test.py +165 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/users/authenticated/router_test.py +90 -2
- core_framework-1.7.0/tests/integration/worker/banner_upload_test.py +164 -0
- core_framework-1.7.0/tests/unit/infrastructure/media/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/uv.lock +1 -1
- core_framework-1.5.0/.cursor/rules/no-docstrings.mdc +0 -13
- core_framework-1.5.0/core_framework/application/media/README.md +0 -11
- core_framework-1.5.0/core_framework/domains/media/avatar/components/finals_publisher.py +0 -16
- core_framework-1.5.0/core_framework/domains/media/avatar/ports/finals_publisher.py +0 -7
- core_framework-1.5.0/core_framework/domains/media/avatar/ports/staging.py +0 -10
- core_framework-1.5.0/core_framework/domains/media/avatar/ports/variant_encoder.py +0 -7
- core_framework-1.5.0/core_framework/testing/config.py +0 -28
- core_framework-1.5.0/core_framework/testing/media.py +0 -81
- core_framework-1.5.0/docs/README.md +0 -22
- core_framework-1.5.0/docs/architecture.md +0 -137
- core_framework-1.5.0/docs/conventions.md +0 -173
- core_framework-1.5.0/docs/deployment/image-server-ssh.md +0 -84
- core_framework-1.5.0/docs/domain-services-and-adapters.md +0 -179
- core_framework-1.5.0/docs/flows/media/upload_pipeline.md +0 -37
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/api-security.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/api-validation.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/application-layer.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/code-review-output.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/constants-final.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-caller-context.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-imports.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-input-guards.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-repository-exceptions.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/exception-handlers.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/integration-test-strategy.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/layer-boundaries.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/no-code-in-docs.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/postgres-config-conventions.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/repository-read-consistency.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/strong-read-opt-in.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/structured-logging.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/tech-stack.mdc +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/skills/add-config/SKILL.md +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.cursor/skills/recommend-features/SKILL.md +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.dockerignore +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.github/workflows/dev-ci-cd.yaml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.github/workflows/manual-deployment.yaml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.github/workflows/publish-pypi.yml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.github/workflows/test.yaml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.pre-commit-config.yaml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/.python-version +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/LICENSE +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/comment/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/comment/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/comment/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/comment/alembic/versions/v1_comment_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/comment/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/extension/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/extension/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/extension/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/extension/alembic/versions/v1_ext_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/extension/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/media/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/media/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/media/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/media/alembic/versions/v1_media_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/media/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/moderation/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/moderation/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/moderation/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/moderation/alembic/versions/v1_mod_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/moderation/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/notification/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/notification/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/notification/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/notification/alembic/versions/v1_notif_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/notification/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/post/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/post/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/post/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/post/alembic/versions/v1_post_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/post/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/README +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/env.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/script.py.mako +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/versions/user_add_avatar_ingest_sequences.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/versions/user_add_date_of_birth_to_profiles.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic/versions/v1_user_init_baseline.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/alembic/user/alembic.ini +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/comments/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/comments/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/moderation/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/posts/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/posts/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/users/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/admin/users/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/auth/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/auth/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/auth/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/mappers.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/authenticated/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/public/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/public/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/comments/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/events/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/events/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/notifications/authenticated/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/notifications/authenticated/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/notifications/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/mappers.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/authenticated/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/public/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/public/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/posts/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/system/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/system/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/authenticated/mappers.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/public/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/public/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/public/schemas.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/api/users/router.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/auth/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/auth/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/bootstrap.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/events/README.md +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/events/event_token.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/events/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/moderation/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/notifications/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/shared/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/shared/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/shared/user_agent.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/shared/worker_jobs.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/application/users/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/asgi.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/bundled_alembic.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/context.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/database.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/comment.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/common.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/moderation.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/notification.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/post.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/setup.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/exception_handlers/user.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/firebase.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/http_client.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/logging.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/middleware.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/observability.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/pagination.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/redis.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/core/runtime.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/comment/repository.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/components/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/avatar/ports/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/shared/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/shared/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/media/shared/service.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/moderation/repository.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/notification/repository.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/models.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/post/repository.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/constants.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/dependencies.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/enums.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/exceptions.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/user/utils.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/domains/utils.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/infrastructure/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/infrastructure/media/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/main.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/migrate_cli.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/hookspecs.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/testing/migrations.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/main.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/core_framework/worker/worker_context.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/docker-compose.dev.yaml +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/dockerfile +0 -0
- {core_framework-1.5.0/docs/deployment → core_framework-1.7.0/docs/deployments/examples}/image-server-known-hosts.example +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/auth/access_control.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/auth/registration.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/admin_comments.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/comment_stats_aggregation.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/delete_comment.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/comments/edit_comment.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/events/events.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/appeals.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/internal_notes.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/moderator_actions.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/moderation/restrictions.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/admin_posts.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_like.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/posts/post_stats_aggregation.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/account.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/account_deletion.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/avatar.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/blocks.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/change_history.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/check_username_exists.md +0 -0
- {core_framework-1.5.0/docs/flows → core_framework-1.7.0/docs/domains}/users/preferences.md +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/firebase_config.example.json +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/makefile +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/conftest.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/_http_helpers.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/admin/__init__.py +0 -0
- {core_framework-1.5.0/tests/integration/api/admin/comments → core_framework-1.7.0/tests/integration/api/admin/cache}/__init__.py +0 -0
- {core_framework-1.5.0/tests/integration/api/admin/moderation → core_framework-1.7.0/tests/integration/api/admin/comments}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/admin/comments/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/admin/posts → core_framework-1.7.0/tests/integration/api/admin/moderation}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/admin/moderation/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/admin/users → core_framework-1.7.0/tests/integration/api/admin/posts}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/admin/posts/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/auth → core_framework-1.7.0/tests/integration/api/admin/users}/__init__.py +0 -0
- {core_framework-1.5.0/tests/integration/api/comments → core_framework-1.7.0/tests/integration/api/auth}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/auth/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/comments/public → core_framework-1.7.0/tests/integration/api/comments}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/comments/authenticated/comment_writes_integration_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/notifications → core_framework-1.7.0/tests/integration/api/comments/public}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/comments/public/router_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/events/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/posts → core_framework-1.7.0/tests/integration/api/notifications}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/notifications/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/posts/public → core_framework-1.7.0/tests/integration/api/posts}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/posts/authenticated/post_writes_integration_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/posts/comment_count_aggregation_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/posts/followers_visibility_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/posts/post_stats_dirty_marking_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/system → core_framework-1.7.0/tests/integration/api/posts/public}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/posts/public/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/users → core_framework-1.7.0/tests/integration/api/system}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/system/router_test.py +0 -0
- {core_framework-1.5.0/tests/integration/api/users/authenticated → core_framework-1.7.0/tests/integration/api/users}/__init__.py +0 -0
- {core_framework-1.5.0/tests/integration/api/users/public → core_framework-1.7.0/tests/integration/api/users/authenticated}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/users/authenticated/avatar_upload_test.py +0 -0
- {core_framework-1.5.0/tests/integration/worker → core_framework-1.7.0/tests/integration/api/users/public}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/api/users/public/router_test.py +0 -0
- {core_framework-1.5.0/tests/unit → core_framework-1.7.0/tests/integration/worker}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/account_deletion_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_comment_stats_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_post_stats_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/aggregate_user_stats_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/avatar_upload_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/conftest.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/mute_lift_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/integration/worker/utils_test.py +0 -0
- {core_framework-1.5.0/tests/unit/application/comments → core_framework-1.7.0/tests/unit}/__init__.py +0 -0
- {core_framework-1.5.0/tests/unit/domains → core_framework-1.7.0/tests/unit/application/comments}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/application/events/event_service_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/application/notifications/inbox_service_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/core/bundled_alembic_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/core/migrate_cli_test.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/core/pagination_test.py +0 -0
- {core_framework-1.5.0/tests/unit/domains/comment → core_framework-1.7.0/tests/unit/domains}/__init__.py +0 -0
- {core_framework-1.5.0/tests/unit/infrastructure → core_framework-1.7.0/tests/unit/domains/comment}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/domains/user/service_test.py +0 -0
- {core_framework-1.5.0/tests/unit/infrastructure/media → core_framework-1.7.0/tests/unit/infrastructure}/__init__.py +0 -0
- {core_framework-1.5.0 → core_framework-1.7.0}/tests/unit/infrastructure/media/ssh_finals_publisher_adapter_test.py +0 -0
|
@@ -23,7 +23,7 @@ The API layer is an HTTP adapter, not a business-logic layer.
|
|
|
23
23
|
|
|
24
24
|
## Route decorators (OpenAPI)
|
|
25
25
|
|
|
26
|
-
- Do **not** set **`summary=`** or **`description=`** on **`@router.get`**, **`post`**, **`patch`**, **`put`**, **`delete`**, or **`APIRoute`-style** registrations. Rely on paths, handler names, **`response_model`**, and Pydantic schemas. Do **not** add route **docstrings** for the same purpose either
|
|
26
|
+
- Do **not** set **`summary=`** or **`description=`** on **`@router.get`**, **`post`**, **`patch`**, **`put`**, **`delete`**, or **`APIRoute`-style** registrations. Rely on paths, handler names, **`response_model`**, and Pydantic schemas. Do **not** add route **docstrings** for the same purpose either.
|
|
27
27
|
|
|
28
28
|
## Response Models
|
|
29
29
|
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: docs/api.md is a minimal API index only
|
|
2
|
+
description: docs/library/api.md is a minimal API index only
|
|
3
3
|
globs:
|
|
4
|
-
- docs/api.md
|
|
4
|
+
- docs/library/api.md
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
# API Reference (docs/api.md)
|
|
7
|
+
# API Reference (docs/library/api.md)
|
|
8
8
|
|
|
9
|
-
`docs/api.md` is strictly for **quick viewing** of available APIs. It is an index, not detailed documentation.
|
|
9
|
+
`docs/library/api.md` is strictly for **quick viewing** of available APIs. It is an index, not detailed documentation.
|
|
10
10
|
|
|
11
11
|
## Format
|
|
12
12
|
|
|
@@ -28,4 +28,4 @@ globs:
|
|
|
28
28
|
- Any prose or bullet lists
|
|
29
29
|
- Detailed behavior notes
|
|
30
30
|
|
|
31
|
-
For detailed API behavior, create or update flow documentation in `docs/
|
|
31
|
+
For detailed API behavior, create or update flow documentation in `docs/domains/` instead.
|
|
@@ -178,7 +178,7 @@ If you ask for a trigger for business logic, I should:
|
|
|
178
178
|
|
|
179
179
|
## Related Documentation
|
|
180
180
|
|
|
181
|
-
- `docs/database-triggers.md` - **Catalog of all triggers** (update when adding new triggers)
|
|
182
|
-
- `docs/conventions.md` - Database Triggers section
|
|
183
|
-
- `docs/architecture-decisions.md` - Triggers Only for Audit/History
|
|
184
|
-
- `docs/
|
|
181
|
+
- `docs/platform/database-triggers.md` - **Catalog of all triggers** (update when adding new triggers)
|
|
182
|
+
- `docs/platform/conventions.md` - Database Triggers section
|
|
183
|
+
- `docs/platform/architecture-decisions.md` - Triggers Only for Audit/History
|
|
184
|
+
- `docs/domains/users/change_history.md` - Example of proper trigger usage
|
{core_framework-1.5.0 → core_framework-1.7.0}/.cursor/rules/domain-services-and-adapters.mdc
RENAMED
|
@@ -7,7 +7,7 @@ globs:
|
|
|
7
7
|
|
|
8
8
|
# Domain Services and Adapters
|
|
9
9
|
|
|
10
|
-
See **`docs/domain-services-and-adapters.md`** for the full model. Apply when adding or changing domain packages and application orchestration.
|
|
10
|
+
See **`docs/platform/domain-services-and-adapters.md`** for the full model. Apply when adding or changing domain packages and application orchestration.
|
|
11
11
|
|
|
12
12
|
## Application = orchestration
|
|
13
13
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: Flow docs describe user-facing API behavior. No JSON examples, no implementation details.
|
|
3
3
|
globs:
|
|
4
|
-
- docs/
|
|
4
|
+
- docs/domains/**/*.md
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Flow Documentation Rule
|
|
@@ -21,7 +21,7 @@ Create a new flow document when:
|
|
|
21
21
|
|
|
22
22
|
## File Location and Naming
|
|
23
23
|
|
|
24
|
-
- **Location**: `docs/
|
|
24
|
+
- **Location**: `docs/domains/{domain}/{feature}.md`
|
|
25
25
|
- **Naming**: Use lowercase with underscores (e.g., `account_deletion.md`, `change_history.md`)
|
|
26
26
|
- **Domain folders**: `auth`, `users`, `moderation`, `comments`, etc.
|
|
27
27
|
|
|
@@ -310,8 +310,8 @@ All endpoints require authentication via Firebase ID token with admin role.
|
|
|
310
310
|
|
|
311
311
|
When flow docs reference implementation details:
|
|
312
312
|
|
|
313
|
-
- **Architecture decisions**: Link to `docs/architecture-decisions.md`
|
|
314
|
-
- **API reference**: Already covered in `docs/api.md`
|
|
313
|
+
- **Architecture decisions**: Link to `docs/platform/architecture-decisions.md`
|
|
314
|
+
- **API reference**: Already covered in `docs/library/api.md`
|
|
315
315
|
- **Database schema**: Should be in migration files, not flow docs
|
|
316
316
|
- **Code structure**: Should be in code comments or architecture docs
|
|
317
317
|
|
|
@@ -38,14 +38,13 @@ When a rule encodes a new convention, check whether **`docs/`** in both repos ne
|
|
|
38
38
|
|
|
39
39
|
Sync to henry when core changes:
|
|
40
40
|
|
|
41
|
-
- **`docs/
|
|
42
|
-
- **`docs/
|
|
43
|
-
- **`docs/
|
|
44
|
-
- **`docs/deployment/`**, **`docs/media-upload-pipeline-design.md`** → sync when shared deploy/media docs change (adapt flow links in henry)
|
|
41
|
+
- **`docs/platform/`** — synced platform docs (layers, conventions, ADRs, adapters, etc.); adapt `docs/domains/…` links in henry to **`docs/core-product-docs.md`**
|
|
42
|
+
- **`docs/library/`** — canonical in core-framework only; henry points to it from **`docs/core-product-docs.md`** (do not add **`docs/library/`** under henry-backend)
|
|
43
|
+
- **`docs/deployments/`**, **`docs/domains/media/upload-pipeline-design.md`** → sync when shared deploy/media docs change (adapt flow links in henry)
|
|
45
44
|
|
|
46
|
-
**Do not** mirror **`docs/
|
|
45
|
+
**Do not** mirror **`docs/domains/`** into henry-backend. Henry maintains **`docs/core-product-docs.md`** as a pointer/index to core product documentation.
|
|
47
46
|
|
|
48
|
-
Do not overwrite henry-only docs (e.g. **`docs/henry
|
|
47
|
+
Do not overwrite henry-only docs (e.g. **`docs/domains/henry/`**, **`docs/core-product-docs.md`**).
|
|
49
48
|
|
|
50
49
|
## User-triggered sync
|
|
51
50
|
|
|
@@ -38,7 +38,7 @@ After the user accepts the API layer (or if there was no API layer):
|
|
|
38
38
|
|
|
39
39
|
- Implement the **Repository** for the domain layer (Postgres only).
|
|
40
40
|
- Include the **domain model** if data is retrieved from the database.
|
|
41
|
-
- 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/domain-services-and-adapters.md`—not in the repository.
|
|
41
|
+
- 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.
|
|
42
42
|
- Wait for the user to review and accept before proceeding.
|
|
43
43
|
|
|
44
44
|
## 4. Service and Application Layer
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Behavioral guidelines to reduce common LLM coding mistakes. Use when writing, reviewing, or refactoring code to avoid overcomplication, make surgical changes, surface assumptions, and define verifiable success criteria.
|
|
3
|
+
alwaysApply: true
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Karpathy behavioral guidelines
|
|
7
|
+
|
|
8
|
+
Behavioral guidelines to reduce common LLM coding mistakes. Merge with project-specific instructions as needed.
|
|
9
|
+
|
|
10
|
+
**Tradeoff:** These guidelines bias toward caution over speed. For trivial tasks, use judgment.
|
|
11
|
+
|
|
12
|
+
## 1. Think Before Coding
|
|
13
|
+
|
|
14
|
+
**Don't assume. Don't hide confusion. Surface tradeoffs.**
|
|
15
|
+
|
|
16
|
+
Before implementing:
|
|
17
|
+
- State your assumptions explicitly. If uncertain, ask.
|
|
18
|
+
- If multiple interpretations exist, present them - don't pick silently.
|
|
19
|
+
- If a simpler approach exists, say so. Push back when warranted.
|
|
20
|
+
- If something is unclear, stop. Name what's confusing. Ask.
|
|
21
|
+
|
|
22
|
+
## 2. Simplicity First
|
|
23
|
+
|
|
24
|
+
**Minimum code that solves the problem. Nothing speculative.**
|
|
25
|
+
|
|
26
|
+
- No features beyond what was asked.
|
|
27
|
+
- No abstractions for single-use code.
|
|
28
|
+
- No "flexibility" or "configurability" that wasn't requested.
|
|
29
|
+
- No error handling for impossible scenarios.
|
|
30
|
+
- If you write 200 lines and it could be 50, rewrite it.
|
|
31
|
+
|
|
32
|
+
Ask yourself: "Would a senior engineer say this is overcomplicated?" If yes, simplify.
|
|
33
|
+
|
|
34
|
+
## 3. Surgical Changes
|
|
35
|
+
|
|
36
|
+
**Touch only what you must. Clean up only your own mess.**
|
|
37
|
+
|
|
38
|
+
When editing existing code:
|
|
39
|
+
- Don't "improve" adjacent code, comments, or formatting.
|
|
40
|
+
- Don't refactor things that aren't broken.
|
|
41
|
+
- Match existing style, even if you'd do it differently.
|
|
42
|
+
- If you notice unrelated dead code, mention it - don't delete it.
|
|
43
|
+
|
|
44
|
+
When your changes create orphans:
|
|
45
|
+
- Remove imports/variables/functions that YOUR changes made unused.
|
|
46
|
+
- Don't remove pre-existing dead code unless asked.
|
|
47
|
+
|
|
48
|
+
The test: Every changed line should trace directly to the user's request.
|
|
49
|
+
|
|
50
|
+
## 4. Goal-Driven Execution
|
|
51
|
+
|
|
52
|
+
**Define success criteria. Loop until verified.**
|
|
53
|
+
|
|
54
|
+
Transform tasks into verifiable goals:
|
|
55
|
+
- "Add validation" → "Write tests for invalid inputs, then make them pass"
|
|
56
|
+
- "Fix the bug" → "Write a test that reproduces it, then make it pass"
|
|
57
|
+
- "Refactor X" → "Ensure tests pass before and after"
|
|
58
|
+
|
|
59
|
+
For multi-step tasks, state a brief plan:
|
|
60
|
+
```
|
|
61
|
+
1. [Step] → verify: [check]
|
|
62
|
+
2. [Step] → verify: [check]
|
|
63
|
+
3. [Step] → verify: [check]
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
Strong success criteria let you loop independently. Weak criteria ("make it work") require constant clarification.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
**These guidelines are working if:** fewer unnecessary changes in diffs, fewer rewrites due to overcomplication, and clarifying questions come before implementation rather than after mistakes.
|
|
@@ -111,7 +111,7 @@ A single `class <Domain>Service:` whose **`__init__`** takes `<Domain>Repository
|
|
|
111
111
|
|
|
112
112
|
When real behavior is added later, apply `repository-read-consistency` (`/.cursor/rules/repository-read-consistency.mdc`) for reads and `_strong` naming.
|
|
113
113
|
|
|
114
|
-
If the bounded context needs filesystem, HTTP, or SSH, add **ports/adapters** or extra domain collaborators per `docs/domain-services-and-adapters.md` — do not put that I/O in `repository.py`.
|
|
114
|
+
If the bounded context needs filesystem, HTTP, or SSH, add **ports/adapters** or extra domain collaborators per `docs/platform/domain-services-and-adapters.md` — do not put that I/O in `repository.py`.
|
|
115
115
|
|
|
116
116
|
### `__init__.py`
|
|
117
117
|
|
|
@@ -175,7 +175,7 @@ Worker `startup` and API `init_app` already call `configure_application_dependen
|
|
|
175
175
|
|
|
176
176
|
- `core_framework/domains/<domain>/README.md` — domain exists in code; `alembic/<domain>/` exists with **empty** `versions/`; **not** in `ALEMBIC_DOMAINS` until first revision; **no** DB schema object until a migration creates it.
|
|
177
177
|
- `CHANGELOG.md` — `### Added` under `[Unreleased]` for domain package, `schema_<domain>`, and Alembic skeleton path (optional). **Do not** list `ALEMBIC_DOMAINS` or revision ids until the first migration lands.
|
|
178
|
-
- Update `docs/
|
|
178
|
+
- Update `docs/library/overview.md` and `docs/library/package-api.md` only when the domain exposes anything to the public surface.
|
|
179
179
|
|
|
180
180
|
## Follow-up: first revision + enroll in `cf-alembic`
|
|
181
181
|
|
|
@@ -35,17 +35,17 @@ Apply **`.cursor/rules/code-review-output.mdc`**. The user wants **actionable fi
|
|
|
35
35
|
|
|
36
36
|
Read these files **before** proceeding with the review:
|
|
37
37
|
|
|
38
|
-
1. **`docs/
|
|
39
|
-
1. **`docs/domain-services-and-adapters.md`** – Application orchestration vs domain services, ports/adapters, multiple collaborators per bounded context
|
|
40
|
-
1. **`docs/conventions.md`** – Coding conventions, domain rules, caching, Redis, exception handling, API layer rules
|
|
41
|
-
1. **`docs/architecture-decisions.md`** – Intentional design choices; do not flag these as issues
|
|
38
|
+
1. **`docs/platform/layers-and-boundaries.md`** – Domain boundaries, prohibited practices, and dependency rules
|
|
39
|
+
1. **`docs/platform/domain-services-and-adapters.md`** – Application orchestration vs domain services, ports/adapters, multiple collaborators per bounded context
|
|
40
|
+
1. **`docs/platform/conventions.md`** – Coding conventions, domain rules, caching, Redis, exception handling, API layer rules
|
|
41
|
+
1. **`docs/platform/architecture-decisions.md`** – Intentional design choices; do not flag these as issues
|
|
42
42
|
1. **`.cursor/rules/api-layer.mdc`**, **`.cursor/rules/application-layer.mdc`**, **`.cursor/rules/domain-services-and-adapters.mdc`**, **`.cursor/rules/domain-imports.mdc`**, **`.cursor/rules/domain-caller-context.mdc`** – Apply when reviewing API/application/domain code
|
|
43
43
|
|
|
44
44
|
## Step 2: Key Context
|
|
45
45
|
|
|
46
46
|
### Architecture Decisions (do not flag as issues)
|
|
47
47
|
|
|
48
|
-
- TOML as primary deploy artifact; environment variables can override (see `docs/architecture-decisions.md`)
|
|
48
|
+
- TOML as primary deploy artifact; environment variables can override (see `docs/platform/architecture-decisions.md`)
|
|
49
49
|
- `trusted_hosts=["*"]` in ProxyHeadersMiddleware (runs behind reverse proxy)
|
|
50
50
|
- `-> Any` return types when `response_model` is specified
|
|
51
51
|
- Silent `ForeignKeyViolationError` in `insert_user_block`
|
|
@@ -41,8 +41,10 @@ jobs:
|
|
|
41
41
|
ALLOWED_HOSTS: ${{ secrets.ALLOWED_HOSTS }}
|
|
42
42
|
AVATAR_HOST_DOMAIN: ${{ secrets.AVATAR_HOST_DOMAIN }}
|
|
43
43
|
AVATAR_DEFAULT_IMAGE: ${{ secrets.AVATAR_DEFAULT_IMAGE }}
|
|
44
|
+
AVATAR_PUBLISH_ROOT: ${{ secrets.AVATAR_PUBLISH_ROOT }}
|
|
44
45
|
BANNER_HOST_DOMAIN: ${{ secrets.BANNER_HOST_DOMAIN }}
|
|
45
46
|
BANNER_DEFAULT_IMAGE: ${{ secrets.BANNER_DEFAULT_IMAGE }}
|
|
47
|
+
BANNER_PUBLISH_ROOT: ${{ secrets.BANNER_PUBLISH_ROOT }}
|
|
46
48
|
IMAGE_SERVER_HOST: ${{ secrets.IMAGE_SERVER_HOST }}
|
|
47
49
|
IMAGE_SERVER_PORT: ${{ secrets.IMAGE_SERVER_PORT }}
|
|
48
50
|
IMAGE_SERVER_USER: ${{ secrets.IMAGE_SERVER_USER }}
|
|
@@ -138,7 +140,7 @@ jobs:
|
|
|
138
140
|
DOCKERHUB_USERNAME="${{ inputs.dockerhub_username }}"
|
|
139
141
|
CONFIG_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/config.toml"
|
|
140
142
|
FIREBASE_CONFIG_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/firebase_config.json"
|
|
141
|
-
|
|
143
|
+
MEDIA_STAGING_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/media-staging"
|
|
142
144
|
IMAGE_SERVER_SSH_KEY_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/image_server_ssh_key"
|
|
143
145
|
IMAGE_SERVER_KNOWN_HOSTS_PATH="/home/${{ secrets.SERVER_USER }}/app_configs/core-framework/image_server_known_hosts"
|
|
144
146
|
|
|
@@ -146,21 +148,21 @@ jobs:
|
|
|
146
148
|
DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
|
|
147
149
|
CONFIG_PATH="$CONFIG_PATH" \
|
|
148
150
|
FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
|
|
149
|
-
|
|
151
|
+
MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
|
|
150
152
|
IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
|
|
151
153
|
IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
|
|
152
154
|
docker compose -f "$COMPOSE_FILE" pull
|
|
153
155
|
|
|
154
|
-
echo "Preparing
|
|
155
|
-
mkdir -p "$
|
|
156
|
+
echo "Preparing media staging directory and image server SSH key permissions"
|
|
157
|
+
mkdir -p "$MEDIA_STAGING_PATH"
|
|
156
158
|
docker run --rm \
|
|
157
159
|
--user root \
|
|
158
|
-
-v "$
|
|
160
|
+
-v "$MEDIA_STAGING_PATH:/app/media-staging" \
|
|
159
161
|
-v "$IMAGE_SERVER_SSH_KEY_PATH:/app/image-server-ssh-key" \
|
|
160
162
|
-v "$IMAGE_SERVER_KNOWN_HOSTS_PATH:/app/image-server-known-hosts" \
|
|
161
163
|
--entrypoint "" \
|
|
162
164
|
"$DOCKERHUB_USERNAME/core-framework:latest" \
|
|
163
|
-
sh -c 'mkdir -p /app/
|
|
165
|
+
sh -c 'mkdir -p /app/media-staging && chown -R appuser:appgroup /app/media-staging && chown appuser:appgroup /app/image-server-ssh-key && chmod 600 /app/image-server-ssh-key && chown appuser:appgroup /app/image-server-known-hosts && chmod 644 /app/image-server-known-hosts'
|
|
164
166
|
|
|
165
167
|
echo "Running database migrations (cf-alembic iterates core_framework.bundled_alembic.ALEMBIC_DOMAINS in order)"
|
|
166
168
|
docker run --rm \
|
|
@@ -173,7 +175,7 @@ jobs:
|
|
|
173
175
|
DOCKERHUB_USERNAME="$DOCKERHUB_USERNAME" \
|
|
174
176
|
CONFIG_PATH="$CONFIG_PATH" \
|
|
175
177
|
FIREBASE_CONFIG_PATH="$FIREBASE_CONFIG_PATH" \
|
|
176
|
-
|
|
178
|
+
MEDIA_STAGING_PATH="$MEDIA_STAGING_PATH" \
|
|
177
179
|
IMAGE_SERVER_SSH_KEY_PATH="$IMAGE_SERVER_SSH_KEY_PATH" \
|
|
178
180
|
IMAGE_SERVER_KNOWN_HOSTS_PATH="$IMAGE_SERVER_KNOWN_HOSTS_PATH" \
|
|
179
181
|
docker compose -f "$COMPOSE_FILE" up -d \
|
|
@@ -1,14 +1,41 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
-
Notable changes to **core-framework** (import **`core_framework`**). Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org/spec/v2.0.0.html). Stable surface: **`docs/package-api.md`**.
|
|
3
|
+
Notable changes to **core-framework** (import **`core_framework`**). Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/); versioning is [SemVer](https://semver.org/spec/v2.0.0.html). Stable surface: **`docs/library/package-api.md`**.
|
|
4
4
|
|
|
5
5
|
## [Unreleased]
|
|
6
6
|
|
|
7
|
+
## [1.7.0] - 2026-06-01
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
|
|
11
|
+
- **Banner upload (v1):** **`POST /users/me/profile/banner`**, **`media.banner_staging_registry`** / **`banner_ingest_lease`**, worker jobs **`process_banner_asset_variants`** and **`delete_superseded_banner_finals`**, stale banner staging cron, shared **`[media].staging_root`**. **`PATCH /users/me/profile`** no longer accepts **`banner_id`**. See **`docs/domains/media/upload_pipeline.md`**, **`docs/domains/users/banner.md`**, and **`docs/domains/users/profile.md`**.
|
|
12
|
+
|
|
13
|
+
### Changed
|
|
14
|
+
|
|
15
|
+
- **Breaking (API):** Profile **`banner`** is now an object **`{ "url": "…", "fallback": "…" }`** instead of a single URL string. **`fallback`** is always the default banner URL for load-error UX.
|
|
16
|
+
- **Breaking (hosts):** **`[avatar].staging_root`** removed; use **`[media].staging_root`** (**`MEDIA_STAGING_PATH`** / **`media-staging`**). Migrate existing host **`avatar-staging`** directories to **`media-staging`** on deploy.
|
|
17
|
+
|
|
18
|
+
### Database
|
|
19
|
+
|
|
20
|
+
- **Media** migration **`media_banner_staging_lease`**: **`banner_staging_registry`**, **`banner_ingest_lease`**.
|
|
21
|
+
- **User** migration **`user_add_banner_ingest_sequences`**: **`banner_ingest_sequence`**, **`banner_applied_sequence`** on **`user_profiles`**.
|
|
22
|
+
- Run **`uv run cf-alembic`** (or the host **`cf-alembic`** step) before deploying code that uses banner upload.
|
|
23
|
+
|
|
24
|
+
### Documentation
|
|
25
|
+
|
|
26
|
+
- **`docs/domains/users/banner.md`**, profile and upload-pipeline updates, **`docs/deployments/edge-upload-limits.md`** and **`Caddyfile.example`** — banner route body limit.
|
|
27
|
+
|
|
28
|
+
## [1.6.0] - 2026-05-27
|
|
29
|
+
|
|
30
|
+
### Changed
|
|
31
|
+
|
|
32
|
+
- **Deploy:** **`[avatar].publish_root`** and **`[banner].publish_root`** are rendered from GitHub environment secrets **`AVATAR_PUBLISH_ROOT`** and **`BANNER_PUBLISH_ROOT`** (via **`config.toml.template`**) so image-server docroots can differ per environment. Local **`config.toml`** defaults are unchanged.
|
|
33
|
+
|
|
7
34
|
## [1.5.0] - 2026-05-26
|
|
8
35
|
|
|
9
36
|
### Added
|
|
10
37
|
|
|
11
|
-
- **Avatar upload (v1):** **`POST /users/me/profile/avatar`**, **`media`** schema, worker variant processing, staging sweep cron, **`[avatar].staging_root`** config. See **`docs/
|
|
38
|
+
- **Avatar upload (v1):** **`POST /users/me/profile/avatar`**, **`media`** schema, worker variant processing, staging sweep cron, **`[avatar].staging_root`** config. See **`docs/domains/media/upload_pipeline.md`** and **`docs/domains/users/profile.md`**.
|
|
12
39
|
|
|
13
40
|
### Fixed
|
|
14
41
|
|
|
@@ -17,7 +44,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
17
44
|
|
|
18
45
|
### Changed
|
|
19
46
|
|
|
20
|
-
- **Breaking:** **`[image_server].known_hosts_path`** is required; **`SshAvatarFinalsPublisherAdapter`** verifies the image server SSH host key (no longer **`known_hosts=None`**). Deploy must provide **`IMAGE_SERVER_KNOWN_HOSTS`** and mount **`/app/image-server-known-hosts`** on the worker. See **`docs/
|
|
47
|
+
- **Breaking:** **`[image_server].known_hosts_path`** is required; **`SshAvatarFinalsPublisherAdapter`** verifies the image server SSH host key (no longer **`known_hosts=None`**). Deploy must provide **`IMAGE_SERVER_KNOWN_HOSTS`** and mount **`/app/image-server-known-hosts`** on the worker. See **`docs/deployments/guides/image-server-ssh.md`**.
|
|
21
48
|
- **Breaking:** **`[avatar].avatar_host_domain`** is **host-only** in **`config.toml`** and deploy secret **`AVATAR_HOST_DOMAIN`** (for example **`avatar.example.com`**, no **`https://`**). The application prepends **`https://`** when assembling public avatar URLs. Values that still include a scheme are normalized at load time.
|
|
22
49
|
- **Breaking:** **`[banner]`** config aligns with **`[avatar]`**: **`banner_host_domain`** + **`default_banner_image`** (deploy secrets **`BANNER_HOST_DOMAIN`**, **`BANNER_DEFAULT_IMAGE`**) replace **`base_url`** / **`default_url`**. Hostname is host-only; public banner URLs derive **`https://`** in application code.
|
|
23
50
|
|
|
@@ -29,21 +56,21 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
29
56
|
|
|
30
57
|
### Documentation
|
|
31
58
|
|
|
32
|
-
- **Avatar upload edge limits:** **`docs/
|
|
33
|
-
- **Image server SSH:** **`docs/
|
|
34
|
-
- **`docs/
|
|
35
|
-
- **`docs/
|
|
36
|
-
- **`docs/
|
|
37
|
-
- **`docs/
|
|
38
|
-
- **`docs/domain-services-and-adapters.md`**: **`banner_host_domain`** / **`default_banner_image`** config shape documented alongside avatar.
|
|
59
|
+
- **Avatar upload edge limits:** **`docs/deployments/edge-upload-limits.md`**, **`docs/deployments/examples/Caddyfile.example`** — route-scoped reverse-proxy **`max_size`** (**6 MiB** recommended) for **`POST /users/me/profile/avatar`**; updated **`docs/domains/media/upload_pipeline.md`** and **`docs/domains/users/profile.md`**.
|
|
60
|
+
- **Image server SSH:** **`docs/deployments/guides/image-server-ssh.md`**, **`docs/deployments/examples/image-server-known-hosts.example`** — production checklist for **`known_hosts_path`** and **`IMAGE_SERVER_KNOWN_HOSTS`**.
|
|
61
|
+
- **`docs/domains/media/upload_pipeline.md`**: status and HTTP surface aligned with shipped v1 implementation.
|
|
62
|
+
- **`docs/domains/users/profile.md`**: **`POST /users/me/profile/avatar`** flow; **`PATCH`** no longer documents **`avatar_id`** as planned.
|
|
63
|
+
- **`docs/domains/users/avatar.md`**, **`docs/domains/users/change_history.md`**: avatar change path and ingest MIME notes updated.
|
|
64
|
+
- **`docs/domains/users/avatar.md`**, **`docs/domains/users/profile.md`**: **`avatar_host_domain`** documented as host-only; public URLs derive **`https://`** in application code.
|
|
65
|
+
- **`docs/platform/domain-services-and-adapters.md`**: **`banner_host_domain`** / **`default_banner_image`** config shape documented alongside avatar.
|
|
39
66
|
|
|
40
67
|
## [1.4.0] - 2026-05-19
|
|
41
68
|
|
|
42
69
|
### Changed
|
|
43
70
|
|
|
44
|
-
- **Breaking:** **`avatar`** on profile and related user responses is an object (**`size_128`**, **`size_500`**, **`fallback`**) instead of a single URL string. See **`docs/
|
|
71
|
+
- **Breaking:** **`avatar`** on profile and related user responses is an object (**`size_128`**, **`size_500`**, **`fallback`**) instead of a single URL string. See **`docs/domains/users/avatar.md`**.
|
|
45
72
|
- **Breaking:** **`[avatar]`** config uses **`avatar_host_domain`** + **`default_avatar_image`** (deploy env **`AVATAR_HOST_DOMAIN`**, **`AVATAR_DEFAULT_IMAGE`**) instead of **`base_url`** / **`default_url`**.
|
|
46
|
-
- **Typed PATCH payloads** — user (preferences, account, profile + admin profile), post, and comment PATCH routes map Pydantic requests to domain `*Update` types at the API boundary; no `model_dump(mode="json")` or dict partial-update payloads through application/domain/repository. See `docs/patch-update-typed-payload.md` and `docs/conventions.md` (*PATCH partial updates*).
|
|
73
|
+
- **Typed PATCH payloads** — user (preferences, account, profile + admin profile), post, and comment PATCH routes map Pydantic requests to domain `*Update` types at the API boundary; no `model_dump(mode="json")` or dict partial-update payloads through application/domain/repository. See `docs/platform/patch-update-typed-payload.md` and `docs/platform/conventions.md` (*PATCH partial updates*).
|
|
47
74
|
- Self-service profile PATCH invalidates **`USER_DETAIL`** only when **`display_name`** or **`avatar_id`** change (fields present in cached identity). **`profile_visibility`** is coerced to **`ProfileVisibility`** on repository read.
|
|
48
75
|
|
|
49
76
|
### Added
|
|
@@ -56,11 +83,11 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
56
83
|
|
|
57
84
|
### Documentation
|
|
58
85
|
|
|
59
|
-
- **`docs/
|
|
60
|
-
- **`docs/
|
|
61
|
-
- **`docs/
|
|
62
|
-
- **`docs/
|
|
63
|
-
- **`docs/patch-update-typed-payload.md`**: typed PATCH decisions and patterns for partial-update endpoints.
|
|
86
|
+
- **`docs/domains/users/avatar.md`**: multi-size **`avatar`** response shape and CDN URL convention.
|
|
87
|
+
- **`docs/domains/media/upload_pipeline.md`**: upload pipeline design and v1 implementation reference.
|
|
88
|
+
- **`docs/domains/users/profile.md`**: DOB on get/update flows and validation errors.
|
|
89
|
+
- **`docs/domains/users/change_history.md`**: profile **`date_of_birth`** changes are not written to change history (audit trigger unchanged).
|
|
90
|
+
- **`docs/platform/patch-update-typed-payload.md`**: typed PATCH decisions and patterns for partial-update endpoints.
|
|
64
91
|
|
|
65
92
|
### Fixed
|
|
66
93
|
|
|
@@ -97,7 +124,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
97
124
|
|
|
98
125
|
### Documentation
|
|
99
126
|
|
|
100
|
-
- Follow feature (HTTP, notifications, stats worker, mirrors, **`docs/follow-system-design.md`**, architecture decisions, domain READMEs, **`docs/api.md`**).
|
|
127
|
+
- Follow feature (HTTP, notifications, stats worker, mirrors, **`docs/domains/users/follow-system-design.md`**, architecture decisions, domain READMEs, **`docs/library/api.md`**).
|
|
101
128
|
|
|
102
129
|
## [1.1.1] - 2026-04-24
|
|
103
130
|
|
|
@@ -113,7 +140,7 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
113
140
|
|
|
114
141
|
### Added
|
|
115
142
|
|
|
116
|
-
- **`core-framework[testing]`** extra: pytest plugin (**`pytest11`** → **`core_framework.testing.plugin`**), **`TestConfig`**, session fixtures (Postgres, Redis, **`AsyncClient`**, migrations, Firebase helpers, optional SAQ). Parallel (**`pytest -n`**) coordination — see **`docs/testing-plugin-design.md`**. **`create_firebase_user_token`** helper.
|
|
143
|
+
- **`core-framework[testing]`** extra: pytest plugin (**`pytest11`** → **`core_framework.testing.plugin`**), **`TestConfig`**, session fixtures (Postgres, Redis, **`AsyncClient`**, migrations, Firebase helpers, optional SAQ). Parallel (**`pytest -n`**) coordination — see **`docs/library/testing-plugin-design.md`**. **`create_firebase_user_token`** helper.
|
|
117
144
|
|
|
118
145
|
### Changed
|
|
119
146
|
|
|
@@ -121,11 +148,11 @@ Notable changes to **core-framework** (import **`core_framework`**). Format foll
|
|
|
121
148
|
|
|
122
149
|
### Documentation
|
|
123
150
|
|
|
124
|
-
- **`docs/package-api.md`**, **`docs/core-framework-migration.md`**, **`README.md`**, **`docs/testing-plugin-design.md`** updated for testing and entrypoints.
|
|
151
|
+
- **`docs/library/package-api.md`**, **`docs/library/core-framework-migration.md`**, **`README.md`**, **`docs/library/testing-plugin-design.md`** updated for testing and entrypoints.
|
|
125
152
|
|
|
126
153
|
## [1.0.0] - 2026-04-18
|
|
127
154
|
|
|
128
|
-
First **SemVer-stable** release per **`docs/package-api.md`**.
|
|
155
|
+
First **SemVer-stable** release per **`docs/library/package-api.md`**.
|
|
129
156
|
|
|
130
157
|
### Breaking
|
|
131
158
|
|
|
@@ -152,7 +179,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
|
|
|
152
179
|
|
|
153
180
|
### Documentation
|
|
154
181
|
|
|
155
|
-
- Mentions flow, **`GET /users/usernames/suggest`**, **`docs/api.md`**.
|
|
182
|
+
- Mentions flow, **`GET /users/usernames/suggest`**, **`docs/library/api.md`**.
|
|
156
183
|
|
|
157
184
|
## [0.4.0] - 2026-03-26
|
|
158
185
|
|
|
@@ -174,7 +201,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
|
|
|
174
201
|
|
|
175
202
|
### Documentation
|
|
176
203
|
|
|
177
|
-
- **`README`**, **`docs/core-framework-migration.md`**, **`docs/package-api.md`**, **`docs/
|
|
204
|
+
- **`README`**, **`docs/library/core-framework-migration.md`**, **`docs/library/package-api.md`**, **`docs/library/overview.md`** (runtime / bootstrap).
|
|
178
205
|
|
|
179
206
|
### Removed
|
|
180
207
|
|
|
@@ -184,7 +211,7 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
|
|
|
184
211
|
|
|
185
212
|
### Added
|
|
186
213
|
|
|
187
|
-
- **`init_app(settings)`**, **`create_task_worker(settings)`**, **`CoreRuntime`**, **`build_core_runtime`**, **`configure_application_dependencies`**, **`load_default_settings()`**, **`configure_core_runtime`**. **`docs/package-api.md`**.
|
|
214
|
+
- **`init_app(settings)`**, **`create_task_worker(settings)`**, **`CoreRuntime`**, **`build_core_runtime`**, **`configure_application_dependencies`**, **`load_default_settings()`**, **`configure_core_runtime`**. **`docs/library/package-api.md`**.
|
|
188
215
|
|
|
189
216
|
### Changed
|
|
190
217
|
|
|
@@ -204,4 +231,6 @@ First **SemVer-stable** release per **`docs/package-api.md`**.
|
|
|
204
231
|
[1.3.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.2.0...v1.3.0
|
|
205
232
|
[1.4.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.3.0...v1.4.0
|
|
206
233
|
[1.5.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.4.0...v1.5.0
|
|
207
|
-
[
|
|
234
|
+
[1.6.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.5.0...v1.6.0
|
|
235
|
+
[1.7.0]: https://github.com/NepNepFFXIV/core-framework/compare/v1.6.0...v1.7.0
|
|
236
|
+
[unreleased]: https://github.com/NepNepFFXIV/core-framework/compare/v1.7.0...HEAD
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: core-framework
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.7.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
|
|
@@ -87,7 +87,7 @@ def build_app(settings: HostSettings | None = None) -> FastAPI:
|
|
|
87
87
|
return app
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/core-framework-migration.md).
|
|
90
|
+
From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/library/core-framework-migration.md).
|
|
91
91
|
|
|
92
92
|
## Host pytest
|
|
93
93
|
|
|
@@ -115,4 +115,4 @@ def anyio_backend() -> str:
|
|
|
115
115
|
return "asyncio"
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
-
See [Package API — Testing](docs/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/testing-plugin-design.md).
|
|
118
|
+
See [Package API — Testing](docs/library/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/library/testing-plugin-design.md).
|
|
@@ -50,7 +50,7 @@ def build_app(settings: HostSettings | None = None) -> FastAPI:
|
|
|
50
50
|
return app
|
|
51
51
|
```
|
|
52
52
|
|
|
53
|
-
From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/core-framework-migration.md).
|
|
53
|
+
From the host repository root, run **`uv run cf-alembic`**. See [core-framework-migration](docs/library/core-framework-migration.md).
|
|
54
54
|
|
|
55
55
|
## Host pytest
|
|
56
56
|
|
|
@@ -78,4 +78,4 @@ def anyio_backend() -> str:
|
|
|
78
78
|
return "asyncio"
|
|
79
79
|
```
|
|
80
80
|
|
|
81
|
-
See [Package API — Testing](docs/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/testing-plugin-design.md).
|
|
81
|
+
See [Package API — Testing](docs/library/package-api.md#testing-pytest-plugin) and [testing plugin design](docs/library/testing-plugin-design.md).
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"""add banner staging registry and ingest lease
|
|
2
|
+
|
|
3
|
+
Revision ID: media_banner_staging_lease
|
|
4
|
+
Revises: v1_media_init
|
|
5
|
+
Create Date: 2026-06-01 12:00:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "media_banner_staging_lease"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "v1_media_init"
|
|
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 banner_staging_registry (
|
|
22
|
+
asset_id varchar(26) not null primary key,
|
|
23
|
+
owner_user_id varchar(128) not null,
|
|
24
|
+
staging_filename text not null,
|
|
25
|
+
created_at timestamptz not null default now()
|
|
26
|
+
);
|
|
27
|
+
""")
|
|
28
|
+
|
|
29
|
+
op.execute("""
|
|
30
|
+
create index idx_banner_staging_registry_created_at
|
|
31
|
+
on banner_staging_registry (created_at);
|
|
32
|
+
""")
|
|
33
|
+
|
|
34
|
+
op.execute("""
|
|
35
|
+
create table banner_ingest_lease (
|
|
36
|
+
owner_user_id varchar(128) not null primary key,
|
|
37
|
+
lease_expires_at timestamptz not null
|
|
38
|
+
);
|
|
39
|
+
""")
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
def downgrade() -> None:
|
|
43
|
+
pass
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"""add banner ingest sequences to user_profiles
|
|
2
|
+
|
|
3
|
+
Revision ID: user_add_banner_ingest_sequences
|
|
4
|
+
Revises: user_add_avatar_ingest_sequences
|
|
5
|
+
Create Date: 2026-06-01 12:00:00.000000
|
|
6
|
+
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from collections.abc import Sequence
|
|
10
|
+
|
|
11
|
+
from alembic import op
|
|
12
|
+
|
|
13
|
+
revision: str = "user_add_banner_ingest_sequences"
|
|
14
|
+
down_revision: str | Sequence[str] | None = "user_add_avatar_ingest_sequences"
|
|
15
|
+
branch_labels: str | Sequence[str] | None = None
|
|
16
|
+
depends_on: str | Sequence[str] | None = None
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
def upgrade() -> None:
|
|
20
|
+
op.execute("""
|
|
21
|
+
alter table user_profiles
|
|
22
|
+
add column banner_ingest_sequence bigint not null default 0,
|
|
23
|
+
add column banner_applied_sequence bigint not null default 0;
|
|
24
|
+
""")
|
|
25
|
+
|
|
26
|
+
op.execute("""
|
|
27
|
+
alter table user_profiles
|
|
28
|
+
add constraint user_profiles_banner_sequences_ordered
|
|
29
|
+
check (banner_applied_sequence <= banner_ingest_sequence);
|
|
30
|
+
""")
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
def downgrade() -> None:
|
|
34
|
+
pass
|
|
@@ -6,15 +6,18 @@ openapi_url = "/openapi.json"
|
|
|
6
6
|
allowed_hosts = [
|
|
7
7
|
"localhost",
|
|
8
8
|
"127.0.0.1",
|
|
9
|
-
"
|
|
9
|
+
"api.manga4life.com",
|
|
10
|
+
"test",
|
|
10
11
|
]
|
|
11
12
|
secret_key = "local-dev-secret-key-change-in-production"
|
|
12
13
|
|
|
14
|
+
[media]
|
|
15
|
+
staging_root = "media-staging"
|
|
16
|
+
|
|
13
17
|
[avatar]
|
|
14
18
|
avatar_host_domain = "avatar.core-framework.com"
|
|
15
19
|
default_avatar_image = "default.webp"
|
|
16
20
|
publish_root = "/var/www/sites/avatar"
|
|
17
|
-
staging_root = "avatar-staging"
|
|
18
21
|
|
|
19
22
|
[banner]
|
|
20
23
|
banner_host_domain = "banner.core-framework.com"
|
|
@@ -39,8 +42,10 @@ logfire_token = "zzz"
|
|
|
39
42
|
[cors]
|
|
40
43
|
allow_credentials = true
|
|
41
44
|
allowed_origins = [
|
|
42
|
-
"http://localhost",
|
|
43
|
-
"http://127.0.0.1",
|
|
45
|
+
"http://localhost:3000",
|
|
46
|
+
"http://127.0.0.1:3000",
|
|
47
|
+
"https://manga4life.com",
|
|
48
|
+
"https://www.manga4life.com",
|
|
44
49
|
]
|
|
45
50
|
allowed_methods = [
|
|
46
51
|
"GET",
|