svc-infra 0.1.709__tar.gz → 1.0.5__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.
Potentially problematic release.
This version of svc-infra might be problematic. Click here for more details.
- {svc_infra-0.1.709 → svc_infra-1.0.5}/PKG-INFO +11 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/README.md +9 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/pyproject.toml +79 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/models.py +47 -108
- svc_infra-1.0.5/src/svc_infra/apf_payments/provider/__init__.py +4 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/aiydan.py +42 -100
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/base.py +10 -26
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/registry.py +3 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/provider/stripe.py +63 -135
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/schemas.py +82 -90
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/service.py +40 -86
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/settings.py +10 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/__init__.py +19 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/add.py +13 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/router.py +47 -84
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/setup.py +7 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/__init__.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/_cookies.py +3 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/add.py +4 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/gaurd.py +9 -26
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/models.py +4 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/router.py +9 -15
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/security.py +3 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/utils.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/verify.py +2 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/providers.py +4 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +16 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +37 -85
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/session_router.py +3 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/security.py +17 -28
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/sender.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/settings.py +18 -19
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/state.py +6 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/ws_security.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/router.py +6 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/http.py +10 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +5 -15
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +14 -15
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/add.py +6 -14
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/crud_router.py +27 -40
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/health.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/session.py +4 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/users.py +8 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dependencies/ratelimit.py +4 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/add.py +13 -23
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/landing.py +6 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/scoped.py +34 -42
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/dualize.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/protected.py +12 -21
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/router.py +14 -31
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ease.py +57 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/conditional.py +3 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +2 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +1 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +12 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/graceful_shutdown.py +4 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency.py +11 -16
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/idempotency_store.py +14 -14
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/optimistic_lock.py +5 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit.py +8 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/ratelimit_store.py +7 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_id.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/timeout.py +9 -10
- svc_infra-1.0.5/src/svc_infra/api/fastapi/object_router.py +1060 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/apply.py +5 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/conventions.py +4 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/mutators.py +13 -31
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/pipeline.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/responses.py +4 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/security.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/ops/add.py +7 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/pagination.py +25 -37
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/__init__.py +16 -38
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/setup.py +13 -31
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/add.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/tenancy/context.py +8 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/versioned.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/env.py +5 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/add.py +2 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/filter.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/formats.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/root.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/__init__.py +2 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/async_service.py +5 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/jobs.py +23 -33
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/models.py +21 -52
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/quotas.py +5 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/billing/schemas.py +4 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/__init__.py +12 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/add.py +6 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/backend.py +6 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/decorators.py +17 -28
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/keys.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/recache.py +22 -35
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/resources.py +8 -16
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/ttl.py +2 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/utils.py +5 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/__init__.py +4 -12
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +11 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +6 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/ops_cmds.py +3 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +24 -41
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_export_cmds.py +9 -17
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +10 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/docs/docs_cmds.py +7 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/dx_cmds.py +5 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/jobs_cmds.py +2 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/obs/obs_cmds.py +4 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/sdk/sdk_cmds.py +5 -15
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/runner.py +6 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/typer_bootstrap.py +1 -2
- svc_infra-1.0.5/src/svc_infra/data/__init__.py +83 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/add.py +5 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/backup.py +8 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/erasure.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/fixtures.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/data/retention.py +8 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/crud_schema.py +9 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/__init__.py +0 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/constants.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/core.py +7 -14
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/indexes.py +11 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/management.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/client.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/settings.py +2 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/repository.py +27 -28
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/resource.py +15 -20
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/scaffold.py +13 -17
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service.py +3 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/service_with_hooks.py +4 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/types.py +2 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/utils.py +4 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/ops.py +14 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/outbox.py +15 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/apikey.py +12 -21
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/authref.py +3 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/constants.py +9 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/core.py +11 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/management.py +2 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/repository.py +17 -24
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/resource.py +14 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/scaffold.py +13 -17
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/service.py +7 -16
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/service_with_hooks.py +4 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/tenant.py +6 -14
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq.py +8 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/uniq_hooks.py +14 -19
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/utils.py +24 -53
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/utils.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/deploy/__init__.py +8 -15
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/add.py +7 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/ease.py +8 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/models.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/storage.py +11 -13
- svc_infra-1.0.5/src/svc_infra/dx/__init__.py +58 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/add.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/changelog.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/dx/checks.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/health/__init__.py +15 -16
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/http/client.py +10 -14
- svc_infra-1.0.5/src/svc_infra/jobs/__init__.py +79 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/outbox_processor.py +3 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/builtins/webhook_delivery.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/loader.py +4 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/queue.py +14 -24
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/redis_queue.py +20 -34
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/runner.py +7 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/scheduler.py +5 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/worker.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/base.py +5 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/github.py +1 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/url.py +3 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/logging/__init__.py +7 -6
- svc_infra-1.0.5/src/svc_infra/mcp/__init__.py +82 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/mcp/svc_infra_mcp.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/add.py +4 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/cloud_dash.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/__init__.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/asgi.py +9 -14
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/base.py +13 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/http.py +5 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics/sqlalchemy.py +9 -12
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/metrics.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/settings.py +2 -6
- svc_infra-1.0.5/src/svc_infra/resilience/__init__.py +44 -0
- svc_infra-1.0.5/src/svc_infra/resilience/circuit_breaker.py +328 -0
- svc_infra-1.0.5/src/svc_infra/resilience/retry.py +289 -0
- svc_infra-1.0.5/src/svc_infra/security/__init__.py +167 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/add.py +5 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/audit.py +14 -17
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/audit_service.py +9 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/hibp.py +3 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/jwt_rotation.py +7 -10
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/lockout.py +12 -11
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/models.py +37 -46
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/oauth_models.py +8 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/org_invites.py +11 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/passwords.py +4 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/permissions.py +8 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/session.py +6 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/signed_cookies.py +9 -9
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/add.py +5 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/local.py +13 -21
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/memory.py +4 -7
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/s3.py +17 -36
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/base.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/easy.py +4 -8
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/settings.py +16 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/testing/__init__.py +36 -39
- svc_infra-1.0.5/src/svc_infra/utils.py +188 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/__init__.py +1 -1
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/add.py +17 -29
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/encryption.py +2 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/fastapi.py +2 -4
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/router.py +3 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/service.py +5 -6
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/webhooks/signing.py +5 -5
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/add.py +2 -3
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/client.py +3 -2
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/config.py +6 -18
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/manager.py +9 -10
- svc_infra-0.1.709/src/svc_infra/apf_payments/provider/__init__.py +0 -4
- svc_infra-0.1.709/src/svc_infra/billing/service.py +0 -157
- svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- svc_infra-0.1.709/src/svc_infra/utils.py +0 -27
- {svc_infra-0.1.709 → svc_infra-1.0.5}/LICENSE +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/apf_payments/alembic.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/__init__.py +13 -13
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/admin/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/billing/setup.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/cache/add.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/dx.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/middleware/request_size_limit.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/bundled_docs/getting-started.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/demo.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cache/tags.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/__main__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/dx/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/health/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/health/health_cmds.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/help.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/jobs/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/cmds/sdk/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/cli/foundation/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/inbox.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/db/sql/versioning.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/documents/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/exceptions.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/http/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/jobs/easy.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/loaders/models.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/README.md +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/grafana/dashboards/http-overview.json +0 -0
- {svc_infra-0.1.709/src/svc_infra/mcp → svc_infra-1.0.5/src/svc_infra/obs/providers}/__init__.py +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud}/__init__.py +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/compose_cloud → svc_infra-1.0.5/src/svc_infra/obs/providers/compose_cloud/templates}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/compose_cloud/templates → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/dashboards}/__init__.py +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/dashboards → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/templates → svc_infra-1.0.5/src/svc_infra/obs/providers/grafana/templates/provisioning}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/providers/grafana/templates/provisioning → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars}/__init__.py +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/compose}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/compose → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/fly}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/fly → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/k8s}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.709/src/svc_infra/obs/templates/sidecars/k8s → svc_infra-1.0.5/src/svc_infra/obs/templates/sidecars/railway}/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/py.typed +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/security/headers.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/storage/backends/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/__init__.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/easy.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/exceptions.py +0 -0
- {svc_infra-0.1.709 → svc_infra-1.0.5}/src/svc_infra/websocket/models.py +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
Metadata-Version: 2.3
|
|
2
2
|
Name: svc-infra
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 1.0.5
|
|
4
4
|
Summary: Infrastructure for building and deploying prod-ready services
|
|
5
5
|
License: MIT
|
|
6
6
|
Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
|
|
7
7
|
Author: Ali Khatami
|
|
8
8
|
Author-email: aliikhatami94@gmail.com
|
|
9
9
|
Requires-Python: >=3.11,<4.0
|
|
10
|
-
Classifier: Development Status ::
|
|
10
|
+
Classifier: Development Status :: 5 - Production/Stable
|
|
11
11
|
Classifier: Framework :: FastAPI
|
|
12
12
|
Classifier: Intended Audience :: Developers
|
|
13
13
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -86,13 +86,19 @@ Description-Content-Type: text/markdown
|
|
|
86
86
|
|
|
87
87
|
# svc-infra
|
|
88
88
|
|
|
89
|
-
|
|
89
|
+
[](CHANGELOG.md)
|
|
90
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
91
|
+
[](https://pypi.org/project/svc-infra/)
|
|
92
|
+
[](https://pypi.org/project/svc-infra/)
|
|
93
|
+
[](LICENSE)
|
|
94
|
+
[](https://pypi.org/project/svc-infra/)
|
|
95
|
+
[](https://codecov.io/gh/nfraxlab/svc-infra)
|
|
90
96
|
|
|
91
|
-
|
|
97
|
+
### Production-ready FastAPI infrastructure in one import
|
|
92
98
|
|
|
93
99
|
**Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
|
|
94
100
|
|
|
95
|
-
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
|
|
101
|
+
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/) · [Changelog](CHANGELOG.md)
|
|
96
102
|
|
|
97
103
|
</div>
|
|
98
104
|
|
|
@@ -2,13 +2,19 @@
|
|
|
2
2
|
|
|
3
3
|
# svc-infra
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
[](CHANGELOG.md)
|
|
6
|
+
[](https://github.com/nfraxlab/svc-infra/actions/workflows/ci.yml)
|
|
7
|
+
[](https://pypi.org/project/svc-infra/)
|
|
8
|
+
[](https://pypi.org/project/svc-infra/)
|
|
9
|
+
[](LICENSE)
|
|
10
|
+
[](https://pypi.org/project/svc-infra/)
|
|
11
|
+
[](https://codecov.io/gh/nfraxlab/svc-infra)
|
|
6
12
|
|
|
7
|
-
|
|
13
|
+
### Production-ready FastAPI infrastructure in one import
|
|
8
14
|
|
|
9
15
|
**Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
|
|
10
16
|
|
|
11
|
-
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/)
|
|
17
|
+
[Documentation](docs/) · [Examples](examples/) · [PyPI](https://pypi.org/project/svc-infra/) · [Changelog](CHANGELOG.md)
|
|
12
18
|
|
|
13
19
|
</div>
|
|
14
20
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[tool.poetry]
|
|
2
2
|
name = "svc-infra"
|
|
3
|
-
version = "0.
|
|
3
|
+
version = "1.0.5"
|
|
4
4
|
description = "Infrastructure for building and deploying prod-ready services"
|
|
5
5
|
authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
|
|
6
6
|
license = "MIT"
|
|
@@ -17,7 +17,7 @@ include = [
|
|
|
17
17
|
]
|
|
18
18
|
|
|
19
19
|
classifiers = [
|
|
20
|
-
"Development Status ::
|
|
20
|
+
"Development Status :: 5 - Production/Stable",
|
|
21
21
|
"Intended Audience :: Developers",
|
|
22
22
|
"License :: OSI Approved :: MIT License",
|
|
23
23
|
"Programming Language :: Python :: 3",
|
|
@@ -118,6 +118,7 @@ s3 = ["aioboto3"]
|
|
|
118
118
|
[tool.poetry.group.dev.dependencies]
|
|
119
119
|
pytest = ">=8.0.0"
|
|
120
120
|
pytest-asyncio = ">=0.23.0"
|
|
121
|
+
pytest-cov = ">=4.0.0"
|
|
121
122
|
ruff = ">=0.6.0"
|
|
122
123
|
mypy = ">=1.10.0"
|
|
123
124
|
types-requests = ">=2.31.0"
|
|
@@ -127,6 +128,7 @@ fakeredis = ">=2.20.0"
|
|
|
127
128
|
moto = {extras = ["s3"], version = ">=5.0.0"}
|
|
128
129
|
aiosqlite = ">=0.19.0" # Required for acceptance tests using SQLite
|
|
129
130
|
pre-commit = ">=3.0.0"
|
|
131
|
+
bandit = ">=1.7.0"
|
|
130
132
|
# Documentation
|
|
131
133
|
mkdocs = ">=1.6.0"
|
|
132
134
|
mkdocs-material = ">=9.5.0"
|
|
@@ -160,6 +162,81 @@ filterwarnings = [
|
|
|
160
162
|
"ignore:The `route` decorator is deprecated:DeprecationWarning:starlette.*",
|
|
161
163
|
]
|
|
162
164
|
|
|
165
|
+
[tool.ruff]
|
|
166
|
+
line-length = 100
|
|
167
|
+
target-version = "py311"
|
|
168
|
+
|
|
169
|
+
[tool.ruff.lint]
|
|
170
|
+
select = [
|
|
171
|
+
"E", # pycodestyle errors
|
|
172
|
+
"W", # pycodestyle warnings
|
|
173
|
+
"F", # Pyflakes
|
|
174
|
+
"I", # isort
|
|
175
|
+
"B", # flake8-bugbear
|
|
176
|
+
"C4", # flake8-comprehensions
|
|
177
|
+
"UP", # pyupgrade
|
|
178
|
+
"SIM", # flake8-simplify
|
|
179
|
+
"RUF", # Ruff-specific rules
|
|
180
|
+
]
|
|
181
|
+
|
|
182
|
+
ignore = [
|
|
183
|
+
"E501", # line too long (handled by formatter)
|
|
184
|
+
"RUF022", # __all__ not sorted (we use logical grouping)
|
|
185
|
+
"RUF012", # mutable class attrs (handled by dataclass/pydantic)
|
|
186
|
+
"B007", # unused loop variable (often intentional)
|
|
187
|
+
"B008", # function call in default arg (typer.Option pattern)
|
|
188
|
+
"B027", # empty method in ABC (intentional for optional callbacks)
|
|
189
|
+
"B904", # raise from err (not always clearer)
|
|
190
|
+
"B905", # zip strict (Python 3.10+ only, adds verbosity)
|
|
191
|
+
"SIM102", # nested if statements (sometimes clearer)
|
|
192
|
+
"SIM103", # return condition directly (sometimes clearer with if)
|
|
193
|
+
"SIM105", # contextlib.suppress (explicit try/except often clearer)
|
|
194
|
+
"SIM108", # ternary operator (readability preference)
|
|
195
|
+
"SIM110", # use all() (sometimes clearer with explicit loop)
|
|
196
|
+
"SIM113", # use enumerate (sometimes clearer without)
|
|
197
|
+
"SIM115", # context manager for files (not always applicable)
|
|
198
|
+
"SIM117", # single with statement (sometimes clearer separate)
|
|
199
|
+
"SIM118", # key in dict vs dict.keys() (minor)
|
|
200
|
+
"UP028", # yield from (sometimes clearer with explicit yield)
|
|
201
|
+
"UP038", # isinstance(x, (A, B)) - deprecated rule, requires unsafe fixes
|
|
202
|
+
"RUF001", # ambiguous unicode char in string (intentional in docs)
|
|
203
|
+
"RUF002", # ambiguous unicode char in docstring (intentional curly quotes)
|
|
204
|
+
"RUF003", # ambiguous unicode char in comment (intentional curly quotes)
|
|
205
|
+
"B023", # function uses loop variable (often intentional in closures)
|
|
206
|
+
"B039", # contextvar default mutable (handled by contextvar)
|
|
207
|
+
]
|
|
208
|
+
|
|
209
|
+
[tool.ruff.lint.per-file-ignores]
|
|
210
|
+
"tests/**/*.py" = [
|
|
211
|
+
"B018", # useless expression in tests is fine
|
|
212
|
+
]
|
|
213
|
+
|
|
214
|
+
[tool.ruff.lint.isort]
|
|
215
|
+
known-first-party = ["svc_infra"]
|
|
216
|
+
|
|
217
|
+
[tool.ruff.lint.pydocstyle]
|
|
218
|
+
convention = "google"
|
|
219
|
+
|
|
220
|
+
[tool.bandit]
|
|
221
|
+
exclude_dirs = ["tests", ".venv", "venv"]
|
|
222
|
+
skips = [
|
|
223
|
+
"B101", # assert used (intentional in tests and contracts)
|
|
224
|
+
"B104", # hardcoded_bind_all_interfaces (intentional for container deployments)
|
|
225
|
+
"B310", # urllib urlopen (URL is validated/trusted in our code)
|
|
226
|
+
"B311", # random for non-crypto (intentional)
|
|
227
|
+
"B324", # SHA1/MD5 hash - used for cache keys and HIBP API, not security
|
|
228
|
+
]
|
|
229
|
+
|
|
230
|
+
[tool.coverage.run]
|
|
231
|
+
source = ["src/svc_infra"]
|
|
232
|
+
branch = true
|
|
233
|
+
omit = ["*/tests/*", "*/__pycache__/*"]
|
|
234
|
+
|
|
235
|
+
[tool.coverage.report]
|
|
236
|
+
exclude_lines = ["pragma: no cover", "if TYPE_CHECKING:", "raise NotImplementedError"]
|
|
237
|
+
fail_under = 70
|
|
238
|
+
show_missing = true
|
|
239
|
+
|
|
163
240
|
[build-system]
|
|
164
241
|
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
165
242
|
build-backend = "poetry.core.masonry.api"
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
from datetime import datetime
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from sqlalchemy import (
|
|
7
6
|
JSON,
|
|
@@ -27,14 +26,10 @@ class PayCustomer(ModelBase):
|
|
|
27
26
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
28
27
|
|
|
29
28
|
# Tenant scoping
|
|
30
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
31
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
32
|
-
)
|
|
29
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
33
30
|
|
|
34
31
|
# Always typed to match the actual auth PK; FK is enforced at table level
|
|
35
|
-
user_id: Mapped[
|
|
36
|
-
user_id_type(), index=True, nullable=True
|
|
37
|
-
)
|
|
32
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
38
33
|
|
|
39
34
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
40
35
|
provider_customer_id: Mapped[str] = mapped_column(
|
|
@@ -59,13 +54,9 @@ class PayIntent(ModelBase):
|
|
|
59
54
|
|
|
60
55
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
61
56
|
|
|
62
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
63
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
64
|
-
)
|
|
57
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
65
58
|
|
|
66
|
-
user_id: Mapped[
|
|
67
|
-
user_id_type(), index=True, nullable=True
|
|
68
|
-
)
|
|
59
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
69
60
|
|
|
70
61
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
71
62
|
provider_intent_id: Mapped[str] = mapped_column(
|
|
@@ -74,13 +65,13 @@ class PayIntent(ModelBase):
|
|
|
74
65
|
amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False) # minor units
|
|
75
66
|
currency: Mapped[str] = mapped_column(String(8), nullable=False)
|
|
76
67
|
status: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
77
|
-
client_secret: Mapped[
|
|
68
|
+
client_secret: Mapped[str | None] = mapped_column(String(255))
|
|
78
69
|
created_at: Mapped[datetime] = mapped_column(
|
|
79
70
|
DateTime(timezone=True),
|
|
80
71
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
81
72
|
nullable=False,
|
|
82
73
|
)
|
|
83
|
-
confirmed_at: Mapped[
|
|
74
|
+
confirmed_at: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
|
84
75
|
captured: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
|
85
76
|
|
|
86
77
|
__table_args__ = (
|
|
@@ -95,9 +86,7 @@ class PayEvent(ModelBase):
|
|
|
95
86
|
|
|
96
87
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
97
88
|
|
|
98
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
99
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
100
|
-
)
|
|
89
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
101
90
|
|
|
102
91
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
103
92
|
provider_event_id: Mapped[str] = mapped_column(
|
|
@@ -109,9 +98,7 @@ class PayEvent(ModelBase):
|
|
|
109
98
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
110
99
|
nullable=False,
|
|
111
100
|
)
|
|
112
|
-
payload_json: Mapped[dict] = mapped_column(
|
|
113
|
-
JSON, nullable=False
|
|
114
|
-
) # compact JSON string
|
|
101
|
+
payload_json: Mapped[dict] = mapped_column(JSON, nullable=False) # compact JSON string
|
|
115
102
|
|
|
116
103
|
|
|
117
104
|
class LedgerEntry(ModelBase):
|
|
@@ -119,9 +106,7 @@ class LedgerEntry(ModelBase):
|
|
|
119
106
|
|
|
120
107
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
121
108
|
|
|
122
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
123
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
124
|
-
)
|
|
109
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
125
110
|
|
|
126
111
|
ts: Mapped[datetime] = mapped_column(
|
|
127
112
|
DateTime(timezone=True),
|
|
@@ -131,18 +116,12 @@ class LedgerEntry(ModelBase):
|
|
|
131
116
|
)
|
|
132
117
|
|
|
133
118
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
134
|
-
provider_ref: Mapped[
|
|
135
|
-
user_id: Mapped[
|
|
136
|
-
user_id_type(), index=True, nullable=True
|
|
137
|
-
)
|
|
119
|
+
provider_ref: Mapped[str | None] = mapped_column(String(128), index=True)
|
|
120
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
138
121
|
amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
|
|
139
122
|
currency: Mapped[str] = mapped_column(String(8), nullable=False)
|
|
140
|
-
kind: Mapped[str] = mapped_column(
|
|
141
|
-
|
|
142
|
-
) # payment|refund|fee|payout...
|
|
143
|
-
status: Mapped[str] = mapped_column(
|
|
144
|
-
String(24), nullable=False
|
|
145
|
-
) # pending|posted|void
|
|
123
|
+
kind: Mapped[str] = mapped_column(String(24), nullable=False) # payment|refund|fee|payout...
|
|
124
|
+
status: Mapped[str] = mapped_column(String(24), nullable=False) # pending|posted|void
|
|
146
125
|
|
|
147
126
|
__table_args__ = (
|
|
148
127
|
user_fk_constraint("user_id", ondelete="SET NULL"),
|
|
@@ -163,24 +142,18 @@ class PayPaymentMethod(ModelBase):
|
|
|
163
142
|
|
|
164
143
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
165
144
|
|
|
166
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
167
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
168
|
-
)
|
|
145
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
169
146
|
|
|
170
|
-
user_id: Mapped[
|
|
171
|
-
user_id_type(), index=True, nullable=True
|
|
172
|
-
)
|
|
147
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
173
148
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
174
|
-
provider_customer_id: Mapped[str] = mapped_column(
|
|
175
|
-
String(128), index=True, nullable=False
|
|
176
|
-
)
|
|
149
|
+
provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
|
|
177
150
|
provider_method_id: Mapped[str] = mapped_column(
|
|
178
151
|
String(128), unique=True, index=True, nullable=False
|
|
179
152
|
)
|
|
180
|
-
brand: Mapped[
|
|
181
|
-
last4: Mapped[
|
|
182
|
-
exp_month: Mapped[
|
|
183
|
-
exp_year: Mapped[
|
|
153
|
+
brand: Mapped[str | None] = mapped_column(String(32))
|
|
154
|
+
last4: Mapped[str | None] = mapped_column(String(8))
|
|
155
|
+
exp_month: Mapped[int | None] = mapped_column(Numeric(2, 0))
|
|
156
|
+
exp_year: Mapped[int | None] = mapped_column(Numeric(4, 0))
|
|
184
157
|
is_default: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
|
185
158
|
created_at: Mapped[datetime] = mapped_column(
|
|
186
159
|
DateTime(timezone=True),
|
|
@@ -204,9 +177,7 @@ class PayProduct(ModelBase):
|
|
|
204
177
|
|
|
205
178
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
206
179
|
|
|
207
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
208
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
209
|
-
)
|
|
180
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
210
181
|
|
|
211
182
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
212
183
|
provider_product_id: Mapped[str] = mapped_column(
|
|
@@ -226,23 +197,17 @@ class PayPrice(ModelBase):
|
|
|
226
197
|
|
|
227
198
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
228
199
|
|
|
229
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
230
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
231
|
-
)
|
|
200
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
232
201
|
|
|
233
202
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
234
203
|
provider_price_id: Mapped[str] = mapped_column(
|
|
235
204
|
String(128), unique=True, index=True, nullable=False
|
|
236
205
|
)
|
|
237
|
-
provider_product_id: Mapped[str] = mapped_column(
|
|
238
|
-
String(128), index=True, nullable=False
|
|
239
|
-
)
|
|
206
|
+
provider_product_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
|
|
240
207
|
currency: Mapped[str] = mapped_column(String(8), nullable=False)
|
|
241
|
-
unit_amount: Mapped[int] = mapped_column(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
interval: Mapped[Optional[str]] = mapped_column(String(16)) # month|year|week|day
|
|
245
|
-
trial_days: Mapped[Optional[int]] = mapped_column(Numeric(5, 0))
|
|
208
|
+
unit_amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False) # minor units
|
|
209
|
+
interval: Mapped[str | None] = mapped_column(String(16)) # month|year|week|day
|
|
210
|
+
trial_days: Mapped[int | None] = mapped_column(Numeric(5, 0))
|
|
246
211
|
active: Mapped[bool] = mapped_column(Boolean, default=True, nullable=False)
|
|
247
212
|
created_at: Mapped[datetime] = mapped_column(
|
|
248
213
|
DateTime(timezone=True),
|
|
@@ -256,33 +221,21 @@ class PaySubscription(ModelBase):
|
|
|
256
221
|
|
|
257
222
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
258
223
|
|
|
259
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
260
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
261
|
-
)
|
|
224
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
262
225
|
|
|
263
|
-
user_id: Mapped[
|
|
264
|
-
user_id_type(), index=True, nullable=True
|
|
265
|
-
)
|
|
226
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
266
227
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
267
|
-
provider_customer_id: Mapped[str] = mapped_column(
|
|
268
|
-
String(128), index=True, nullable=False
|
|
269
|
-
)
|
|
228
|
+
provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
|
|
270
229
|
provider_subscription_id: Mapped[str] = mapped_column(
|
|
271
230
|
String(128), unique=True, index=True, nullable=False
|
|
272
231
|
)
|
|
273
|
-
provider_price_id: Mapped[str] = mapped_column(
|
|
274
|
-
String(128), index=True, nullable=False
|
|
275
|
-
)
|
|
232
|
+
provider_price_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
|
|
276
233
|
status: Mapped[str] = mapped_column(
|
|
277
234
|
String(32), index=True, nullable=False
|
|
278
235
|
) # active|trialing|canceled|past_due|incomplete
|
|
279
236
|
quantity: Mapped[int] = mapped_column(Numeric(10, 0), default=1, nullable=False)
|
|
280
|
-
cancel_at_period_end: Mapped[bool] = mapped_column(
|
|
281
|
-
|
|
282
|
-
)
|
|
283
|
-
current_period_end: Mapped[Optional[datetime]] = mapped_column(
|
|
284
|
-
DateTime(timezone=True)
|
|
285
|
-
)
|
|
237
|
+
cancel_at_period_end: Mapped[bool] = mapped_column(Boolean, default=False, nullable=False)
|
|
238
|
+
current_period_end: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
|
286
239
|
created_at: Mapped[datetime] = mapped_column(
|
|
287
240
|
DateTime(timezone=True),
|
|
288
241
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
@@ -305,27 +258,21 @@ class PayInvoice(ModelBase):
|
|
|
305
258
|
|
|
306
259
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
307
260
|
|
|
308
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
309
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
310
|
-
)
|
|
261
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
311
262
|
|
|
312
|
-
user_id: Mapped[
|
|
313
|
-
user_id_type(), index=True, nullable=True
|
|
314
|
-
)
|
|
263
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
315
264
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
316
265
|
provider_invoice_id: Mapped[str] = mapped_column(
|
|
317
266
|
String(128), unique=True, index=True, nullable=False
|
|
318
267
|
)
|
|
319
|
-
provider_customer_id: Mapped[str] = mapped_column(
|
|
320
|
-
String(128), index=True, nullable=False
|
|
321
|
-
)
|
|
268
|
+
provider_customer_id: Mapped[str] = mapped_column(String(128), index=True, nullable=False)
|
|
322
269
|
status: Mapped[str] = mapped_column(
|
|
323
270
|
String(24), index=True, nullable=False
|
|
324
271
|
) # draft|open|paid|void|uncollectible
|
|
325
272
|
amount_due: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
|
|
326
273
|
currency: Mapped[str] = mapped_column(String(8), nullable=False)
|
|
327
|
-
hosted_invoice_url: Mapped[
|
|
328
|
-
pdf_url: Mapped[
|
|
274
|
+
hosted_invoice_url: Mapped[str | None] = mapped_column(String(255))
|
|
275
|
+
pdf_url: Mapped[str | None] = mapped_column(String(255))
|
|
329
276
|
created_at: Mapped[datetime] = mapped_column(
|
|
330
277
|
DateTime(timezone=True),
|
|
331
278
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
@@ -348,13 +295,9 @@ class PaySetupIntent(ModelBase):
|
|
|
348
295
|
|
|
349
296
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
350
297
|
|
|
351
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
352
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
353
|
-
)
|
|
298
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
354
299
|
|
|
355
|
-
user_id: Mapped[
|
|
356
|
-
user_id_type(), index=True, nullable=True
|
|
357
|
-
)
|
|
300
|
+
user_id: Mapped[str | None] = mapped_column(user_id_type(), index=True, nullable=True)
|
|
358
301
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
359
302
|
provider_setup_intent_id: Mapped[str] = mapped_column(
|
|
360
303
|
String(128), unique=True, index=True, nullable=False
|
|
@@ -362,7 +305,7 @@ class PaySetupIntent(ModelBase):
|
|
|
362
305
|
status: Mapped[str] = mapped_column(
|
|
363
306
|
String(32), index=True, nullable=False
|
|
364
307
|
) # requires_action|succeeded|canceled|processing
|
|
365
|
-
client_secret: Mapped[
|
|
308
|
+
client_secret: Mapped[str | None] = mapped_column(String(255))
|
|
366
309
|
created_at: Mapped[datetime] = mapped_column(
|
|
367
310
|
DateTime(timezone=True),
|
|
368
311
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
@@ -380,22 +323,20 @@ class PayDispute(ModelBase):
|
|
|
380
323
|
|
|
381
324
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
382
325
|
|
|
383
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
384
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
385
|
-
)
|
|
326
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
386
327
|
|
|
387
328
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
388
329
|
provider_dispute_id: Mapped[str] = mapped_column(
|
|
389
330
|
String(128), unique=True, index=True, nullable=False
|
|
390
331
|
)
|
|
391
|
-
provider_charge_id: Mapped[
|
|
332
|
+
provider_charge_id: Mapped[str | None] = mapped_column(String(128), index=True)
|
|
392
333
|
amount: Mapped[int] = mapped_column(Numeric(18, 0), nullable=False)
|
|
393
334
|
currency: Mapped[str] = mapped_column(String(8), nullable=False)
|
|
394
|
-
reason: Mapped[
|
|
335
|
+
reason: Mapped[str | None] = mapped_column(String(64))
|
|
395
336
|
status: Mapped[str] = mapped_column(
|
|
396
337
|
String(32), index=True, nullable=False
|
|
397
338
|
) # needs_response|under_review|won|lost|warning_closed
|
|
398
|
-
evidence_due_by: Mapped[
|
|
339
|
+
evidence_due_by: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
|
399
340
|
created_at: Mapped[datetime] = mapped_column(
|
|
400
341
|
DateTime(timezone=True),
|
|
401
342
|
server_default=text("CURRENT_TIMESTAMP"),
|
|
@@ -408,9 +349,7 @@ class PayPayout(ModelBase):
|
|
|
408
349
|
|
|
409
350
|
id: Mapped[str] = mapped_column(String(64), primary_key=True)
|
|
410
351
|
|
|
411
|
-
tenant_id: Mapped[str] = mapped_column(
|
|
412
|
-
String(TENANT_ID_LEN), index=True, nullable=False
|
|
413
|
-
)
|
|
352
|
+
tenant_id: Mapped[str] = mapped_column(String(TENANT_ID_LEN), index=True, nullable=False)
|
|
414
353
|
|
|
415
354
|
provider: Mapped[str] = mapped_column(String(32), index=True, nullable=False)
|
|
416
355
|
provider_payout_id: Mapped[str] = mapped_column(
|
|
@@ -421,8 +360,8 @@ class PayPayout(ModelBase):
|
|
|
421
360
|
status: Mapped[str] = mapped_column(
|
|
422
361
|
String(32), index=True, nullable=False
|
|
423
362
|
) # pending|in_transit|paid|canceled|failed
|
|
424
|
-
arrival_date: Mapped[
|
|
425
|
-
type: Mapped[
|
|
363
|
+
arrival_date: Mapped[datetime | None] = mapped_column(DateTime(timezone=True))
|
|
364
|
+
type: Mapped[str | None] = mapped_column(String(32)) # bank_account|card|...
|
|
426
365
|
created_at: Mapped[datetime] = mapped_column(
|
|
427
366
|
DateTime(timezone=True),
|
|
428
367
|
server_default=text("CURRENT_TIMESTAMP"),
|