svc-infra 0.1.579__tar.gz → 0.1.580__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.579 → svc_infra-0.1.580}/PKG-INFO +1 -1
- {svc_infra-0.1.579 → svc_infra-0.1.580}/pyproject.toml +1 -1
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/provider/base.py +91 -3
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/schemas.py +58 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/service.py +180 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/apf_payments/router.py +289 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/alembic.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/models.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/provider/registry.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/apf_payments/settings.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/security.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/auth/state.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/cache/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/http.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/public.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/router.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/dx.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/ease.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/ratelimit.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/pagination.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/paths/user.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/api/fastapi/setup.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/env.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/logging/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/logging/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/logging/filter.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/logging/formats.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/app/root.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/backend.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/decorators.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/demo.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/keys.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/recache.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/resources.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/tags.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/ttl.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cache/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/help.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/cmds/obs/obs_cmds.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/foundation/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/foundation/runner.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/crud_schema.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/base.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/constants.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/core.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/indexes.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/management.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/client.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/repository.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/resource.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/scaffold.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/service.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/types.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/nosql/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/apikey.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/authref.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/base.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/constants.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/core.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/management.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/repository.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/resource.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/scaffold.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/service.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/types.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/uniq.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/sql/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/db/utils.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/mcp/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/mcp/svc_infra_mcp.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/add.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/cloud_dash.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/metrics/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/metrics/asgi.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/metrics/base.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/metrics/http.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/settings.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/py.typed +0 -0
- {svc_infra-0.1.579 → svc_infra-0.1.580}/src/svc_infra/utils.py +0 -0
|
@@ -11,21 +11,27 @@ from ..schemas import (
|
|
|
11
11
|
IntentOut,
|
|
12
12
|
InvoiceCreateIn,
|
|
13
13
|
InvoiceLineItemIn,
|
|
14
|
+
InvoiceLineItemOut,
|
|
14
15
|
InvoiceOut,
|
|
15
16
|
PaymentMethodAttachIn,
|
|
16
17
|
PaymentMethodOut,
|
|
18
|
+
PaymentMethodUpdateIn,
|
|
17
19
|
PayoutOut,
|
|
18
20
|
PriceCreateIn,
|
|
19
21
|
PriceOut,
|
|
22
|
+
PriceUpdateIn,
|
|
20
23
|
ProductCreateIn,
|
|
21
24
|
ProductOut,
|
|
25
|
+
ProductUpdateIn,
|
|
22
26
|
RefundIn,
|
|
27
|
+
RefundOut,
|
|
23
28
|
SetupIntentCreateIn,
|
|
24
29
|
SetupIntentOut,
|
|
25
30
|
SubscriptionCreateIn,
|
|
26
31
|
SubscriptionOut,
|
|
27
32
|
SubscriptionUpdateIn,
|
|
28
33
|
UsageRecordIn,
|
|
34
|
+
UsageRecordListFilter,
|
|
29
35
|
UsageRecordOut,
|
|
30
36
|
)
|
|
31
37
|
|
|
@@ -36,9 +42,6 @@ class ProviderAdapter(Protocol):
|
|
|
36
42
|
async def ensure_customer(self, data: CustomerUpsertIn) -> CustomerOut:
|
|
37
43
|
pass
|
|
38
44
|
|
|
39
|
-
async def get_customer(self, provider_customer_id: str) -> Optional[CustomerOut]:
|
|
40
|
-
pass
|
|
41
|
-
|
|
42
45
|
async def attach_payment_method(self, data: PaymentMethodAttachIn) -> PaymentMethodOut:
|
|
43
46
|
pass
|
|
44
47
|
|
|
@@ -180,3 +183,88 @@ class ProviderAdapter(Protocol):
|
|
|
180
183
|
|
|
181
184
|
async def get_payout(self, provider_payout_id: str) -> PayoutOut:
|
|
182
185
|
pass
|
|
186
|
+
|
|
187
|
+
# --- Customers ---
|
|
188
|
+
async def list_customers(
|
|
189
|
+
self, *, provider: str | None, user_id: str | None, limit: int, cursor: str | None
|
|
190
|
+
) -> tuple[list[CustomerOut], str | None]:
|
|
191
|
+
"""Optional: if not implemented, the service will list from local DB."""
|
|
192
|
+
pass
|
|
193
|
+
|
|
194
|
+
async def get_customer(self, provider_customer_id: str) -> Optional[CustomerOut]:
|
|
195
|
+
pass
|
|
196
|
+
|
|
197
|
+
# --- Products / Prices ---
|
|
198
|
+
async def get_product(self, provider_product_id: str) -> ProductOut:
|
|
199
|
+
pass
|
|
200
|
+
|
|
201
|
+
async def list_products(
|
|
202
|
+
self, *, active: bool | None, limit: int, cursor: str | None
|
|
203
|
+
) -> tuple[list[ProductOut], str | None]:
|
|
204
|
+
pass
|
|
205
|
+
|
|
206
|
+
async def update_product(self, provider_product_id: str, data: ProductUpdateIn) -> ProductOut:
|
|
207
|
+
pass
|
|
208
|
+
|
|
209
|
+
async def get_price(self, provider_price_id: str) -> PriceOut:
|
|
210
|
+
pass
|
|
211
|
+
|
|
212
|
+
async def list_prices(
|
|
213
|
+
self,
|
|
214
|
+
*,
|
|
215
|
+
provider_product_id: str | None,
|
|
216
|
+
active: bool | None,
|
|
217
|
+
limit: int,
|
|
218
|
+
cursor: str | None,
|
|
219
|
+
) -> tuple[list[PriceOut], str | None]:
|
|
220
|
+
pass
|
|
221
|
+
|
|
222
|
+
async def update_price(self, provider_price_id: str, data: PriceUpdateIn) -> PriceOut:
|
|
223
|
+
pass
|
|
224
|
+
|
|
225
|
+
# --- Subscriptions ---
|
|
226
|
+
async def get_subscription(self, provider_subscription_id: str) -> SubscriptionOut:
|
|
227
|
+
pass
|
|
228
|
+
|
|
229
|
+
async def list_subscriptions(
|
|
230
|
+
self,
|
|
231
|
+
*,
|
|
232
|
+
customer_provider_id: str | None,
|
|
233
|
+
status: str | None,
|
|
234
|
+
limit: int,
|
|
235
|
+
cursor: str | None,
|
|
236
|
+
) -> tuple[list[SubscriptionOut], str | None]:
|
|
237
|
+
pass
|
|
238
|
+
|
|
239
|
+
# --- Payment Method (single + update) ---
|
|
240
|
+
async def get_payment_method(self, provider_method_id: str) -> PaymentMethodOut:
|
|
241
|
+
pass
|
|
242
|
+
|
|
243
|
+
async def update_payment_method(
|
|
244
|
+
self, provider_method_id: str, data: PaymentMethodUpdateIn
|
|
245
|
+
) -> PaymentMethodOut:
|
|
246
|
+
pass
|
|
247
|
+
|
|
248
|
+
# --- Refunds list/get ---
|
|
249
|
+
async def list_refunds(
|
|
250
|
+
self, *, provider_payment_intent_id: str | None, limit: int, cursor: str | None
|
|
251
|
+
) -> tuple[list[RefundOut], str | None]:
|
|
252
|
+
pass
|
|
253
|
+
|
|
254
|
+
async def get_refund(self, provider_refund_id: str) -> RefundOut:
|
|
255
|
+
pass
|
|
256
|
+
|
|
257
|
+
# --- Invoice line items list ---
|
|
258
|
+
async def list_invoice_line_items(
|
|
259
|
+
self, provider_invoice_id: str, *, limit: int, cursor: str | None
|
|
260
|
+
) -> tuple[list[InvoiceLineItemOut], str | None]:
|
|
261
|
+
pass
|
|
262
|
+
|
|
263
|
+
# --- Usage records list/get ---
|
|
264
|
+
async def list_usage_records(
|
|
265
|
+
self, f: UsageRecordListFilter
|
|
266
|
+
) -> tuple[list[UsageRecordOut], str | None]:
|
|
267
|
+
pass
|
|
268
|
+
|
|
269
|
+
async def get_usage_record(self, usage_record_id: str) -> UsageRecordOut:
|
|
270
|
+
pass
|
|
@@ -268,3 +268,61 @@ class UsageRecordOut(BaseModel):
|
|
|
268
268
|
timestamp: Optional[int] = None
|
|
269
269
|
subscription_item: Optional[str] = None
|
|
270
270
|
provider_price_id: Optional[str] = None
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
# -------- Customers list filter ----------
|
|
274
|
+
class CustomersListFilter(BaseModel):
|
|
275
|
+
provider: Optional[str] = None
|
|
276
|
+
user_id: Optional[str] = None
|
|
277
|
+
limit: Optional[int] = Field(default=50, ge=1, le=200)
|
|
278
|
+
cursor: Optional[str] = None # we’ll paginate on provider_customer_id asc
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
# -------- Products / Prices updates ----------
|
|
282
|
+
class ProductUpdateIn(BaseModel):
|
|
283
|
+
name: Optional[str] = None
|
|
284
|
+
active: Optional[bool] = None
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
class PriceUpdateIn(BaseModel):
|
|
288
|
+
active: Optional[bool] = None
|
|
289
|
+
|
|
290
|
+
|
|
291
|
+
# -------- Payment Method update ----------
|
|
292
|
+
class PaymentMethodUpdateIn(BaseModel):
|
|
293
|
+
# keep minimal + commonly supported card fields
|
|
294
|
+
name: Optional[str] = None
|
|
295
|
+
exp_month: Optional[int] = None
|
|
296
|
+
exp_year: Optional[int] = None
|
|
297
|
+
# extend here later with address fields (line1, city, etc.)
|
|
298
|
+
|
|
299
|
+
|
|
300
|
+
# -------- Refunds (list/get) ----------
|
|
301
|
+
class RefundOut(BaseModel):
|
|
302
|
+
id: str
|
|
303
|
+
provider: str
|
|
304
|
+
provider_refund_id: str
|
|
305
|
+
provider_payment_intent_id: Optional[str] = None
|
|
306
|
+
amount: AmountMinor
|
|
307
|
+
currency: Currency
|
|
308
|
+
status: str
|
|
309
|
+
reason: Optional[str] = None
|
|
310
|
+
created_at: Optional[str] = None
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
# -------- Invoice line items (list) ----------
|
|
314
|
+
class InvoiceLineItemOut(BaseModel):
|
|
315
|
+
id: str
|
|
316
|
+
description: Optional[str] = None
|
|
317
|
+
amount: AmountMinor
|
|
318
|
+
currency: Currency
|
|
319
|
+
quantity: Optional[int] = 1
|
|
320
|
+
provider_price_id: Optional[str] = None
|
|
321
|
+
|
|
322
|
+
|
|
323
|
+
# -------- Usage records list/get ----------
|
|
324
|
+
class UsageRecordListFilter(BaseModel):
|
|
325
|
+
subscription_item: Optional[str] = None
|
|
326
|
+
provider_price_id: Optional[str] = None
|
|
327
|
+
limit: Optional[int] = Field(default=50, ge=1, le=200)
|
|
328
|
+
cursor: Optional[str] = None
|
|
@@ -24,6 +24,7 @@ from .schemas import (
|
|
|
24
24
|
BalanceSnapshotOut,
|
|
25
25
|
CaptureIn,
|
|
26
26
|
CustomerOut,
|
|
27
|
+
CustomersListFilter,
|
|
27
28
|
CustomerUpsertIn,
|
|
28
29
|
DisputeOut,
|
|
29
30
|
IntentCreateIn,
|
|
@@ -31,16 +32,21 @@ from .schemas import (
|
|
|
31
32
|
IntentOut,
|
|
32
33
|
InvoiceCreateIn,
|
|
33
34
|
InvoiceLineItemIn,
|
|
35
|
+
InvoiceLineItemOut,
|
|
34
36
|
InvoiceOut,
|
|
35
37
|
InvoicesListFilter,
|
|
36
38
|
PaymentMethodAttachIn,
|
|
37
39
|
PaymentMethodOut,
|
|
40
|
+
PaymentMethodUpdateIn,
|
|
38
41
|
PayoutOut,
|
|
39
42
|
PriceCreateIn,
|
|
40
43
|
PriceOut,
|
|
44
|
+
PriceUpdateIn,
|
|
41
45
|
ProductCreateIn,
|
|
42
46
|
ProductOut,
|
|
47
|
+
ProductUpdateIn,
|
|
43
48
|
RefundIn,
|
|
49
|
+
RefundOut,
|
|
44
50
|
SetupIntentCreateIn,
|
|
45
51
|
SetupIntentOut,
|
|
46
52
|
StatementRow,
|
|
@@ -48,6 +54,7 @@ from .schemas import (
|
|
|
48
54
|
SubscriptionOut,
|
|
49
55
|
SubscriptionUpdateIn,
|
|
50
56
|
UsageRecordIn,
|
|
57
|
+
UsageRecordListFilter,
|
|
51
58
|
UsageRecordOut,
|
|
52
59
|
)
|
|
53
60
|
from .settings import get_payments_settings
|
|
@@ -624,3 +631,176 @@ class PaymentsService:
|
|
|
624
631
|
await self._dispatch_event(ev.provider, ev.payload_json)
|
|
625
632
|
|
|
626
633
|
return len(rows)
|
|
634
|
+
|
|
635
|
+
# ---- Customers ----
|
|
636
|
+
async def list_customers(self, f: CustomersListFilter) -> tuple[list[CustomerOut], str | None]:
|
|
637
|
+
adapter = self._get_adapter()
|
|
638
|
+
try:
|
|
639
|
+
return await adapter.list_customers(
|
|
640
|
+
provider=f.provider, user_id=f.user_id, limit=f.limit or 50, cursor=f.cursor
|
|
641
|
+
)
|
|
642
|
+
except NotImplementedError:
|
|
643
|
+
# Fallback to local DB listing
|
|
644
|
+
q = select(PayCustomer).order_by(PayCustomer.provider_customer_id.asc())
|
|
645
|
+
if f.provider:
|
|
646
|
+
q = q.where(PayCustomer.provider == f.provider)
|
|
647
|
+
if f.user_id:
|
|
648
|
+
q = q.where(PayCustomer.user_id == f.user_id)
|
|
649
|
+
rows = (await self.session.execute(q)).scalars().all()
|
|
650
|
+
# simple cursor by provider_customer_id; production can optimize
|
|
651
|
+
next_cursor = None
|
|
652
|
+
if f.limit and len(rows) > f.limit:
|
|
653
|
+
rows = rows[: f.limit]
|
|
654
|
+
next_cursor = rows[-1].provider_customer_id
|
|
655
|
+
return (
|
|
656
|
+
[
|
|
657
|
+
CustomerOut(
|
|
658
|
+
id=r.id,
|
|
659
|
+
provider=r.provider,
|
|
660
|
+
provider_customer_id=r.provider_customer_id,
|
|
661
|
+
email=None,
|
|
662
|
+
name=None,
|
|
663
|
+
)
|
|
664
|
+
for r in rows
|
|
665
|
+
],
|
|
666
|
+
next_cursor,
|
|
667
|
+
)
|
|
668
|
+
|
|
669
|
+
async def get_customer(self, provider_customer_id: str) -> CustomerOut:
|
|
670
|
+
adapter = self._get_adapter()
|
|
671
|
+
out = await adapter.get_customer(provider_customer_id)
|
|
672
|
+
if out is None:
|
|
673
|
+
raise RuntimeError("Customer not found")
|
|
674
|
+
# upsert locally
|
|
675
|
+
row = await self.session.scalar(
|
|
676
|
+
select(PayCustomer).where(PayCustomer.provider_customer_id == provider_customer_id)
|
|
677
|
+
)
|
|
678
|
+
if not row:
|
|
679
|
+
self.session.add(
|
|
680
|
+
PayCustomer(
|
|
681
|
+
provider=out.provider,
|
|
682
|
+
provider_customer_id=out.provider_customer_id,
|
|
683
|
+
user_id=None,
|
|
684
|
+
tenant_id="",
|
|
685
|
+
)
|
|
686
|
+
)
|
|
687
|
+
return out
|
|
688
|
+
|
|
689
|
+
# ---- Products / Prices ----
|
|
690
|
+
async def get_product(self, provider_product_id: str) -> ProductOut:
|
|
691
|
+
return await self._get_adapter().get_product(provider_product_id)
|
|
692
|
+
|
|
693
|
+
async def list_products(
|
|
694
|
+
self, *, active: bool | None, limit: int, cursor: str | None
|
|
695
|
+
) -> tuple[list[ProductOut], str | None]:
|
|
696
|
+
return await self._get_adapter().list_products(active=active, limit=limit, cursor=cursor)
|
|
697
|
+
|
|
698
|
+
async def update_product(self, provider_product_id: str, data: ProductUpdateIn) -> ProductOut:
|
|
699
|
+
out = await self._get_adapter().update_product(provider_product_id, data)
|
|
700
|
+
# reflect DB
|
|
701
|
+
row = await self.session.scalar(
|
|
702
|
+
select(PayProduct).where(PayProduct.provider_product_id == provider_product_id)
|
|
703
|
+
)
|
|
704
|
+
if row:
|
|
705
|
+
if data.name is not None:
|
|
706
|
+
row.name = data.name
|
|
707
|
+
if data.active is not None:
|
|
708
|
+
row.active = data.active
|
|
709
|
+
return out
|
|
710
|
+
|
|
711
|
+
async def get_price(self, provider_price_id: str) -> PriceOut:
|
|
712
|
+
return await self._get_adapter().get_price(provider_price_id)
|
|
713
|
+
|
|
714
|
+
async def list_prices(
|
|
715
|
+
self,
|
|
716
|
+
*,
|
|
717
|
+
provider_product_id: str | None,
|
|
718
|
+
active: bool | None,
|
|
719
|
+
limit: int,
|
|
720
|
+
cursor: str | None,
|
|
721
|
+
) -> tuple[list[PriceOut], str | None]:
|
|
722
|
+
return await self._get_adapter().list_prices(
|
|
723
|
+
provider_product_id=provider_product_id, active=active, limit=limit, cursor=cursor
|
|
724
|
+
)
|
|
725
|
+
|
|
726
|
+
async def update_price(self, provider_price_id: str, data: PriceUpdateIn) -> PriceOut:
|
|
727
|
+
out = await self._get_adapter().update_price(provider_price_id, data)
|
|
728
|
+
row = await self.session.scalar(
|
|
729
|
+
select(PayPrice).where(PayPrice.provider_price_id == provider_price_id)
|
|
730
|
+
)
|
|
731
|
+
if row and data.active is not None:
|
|
732
|
+
row.active = data.active
|
|
733
|
+
return out
|
|
734
|
+
|
|
735
|
+
# ---- Subscriptions ----
|
|
736
|
+
async def get_subscription(self, provider_subscription_id: str) -> SubscriptionOut:
|
|
737
|
+
return await self._get_adapter().get_subscription(provider_subscription_id)
|
|
738
|
+
|
|
739
|
+
async def list_subscriptions(
|
|
740
|
+
self,
|
|
741
|
+
*,
|
|
742
|
+
customer_provider_id: str | None,
|
|
743
|
+
status: str | None,
|
|
744
|
+
limit: int,
|
|
745
|
+
cursor: str | None,
|
|
746
|
+
) -> tuple[list[SubscriptionOut], str | None]:
|
|
747
|
+
return await self._get_adapter().list_subscriptions(
|
|
748
|
+
customer_provider_id=customer_provider_id, status=status, limit=limit, cursor=cursor
|
|
749
|
+
)
|
|
750
|
+
|
|
751
|
+
# ---- Payment Methods (get/update) ----
|
|
752
|
+
async def get_payment_method(self, provider_method_id: str) -> PaymentMethodOut:
|
|
753
|
+
return await self._get_adapter().get_payment_method(provider_method_id)
|
|
754
|
+
|
|
755
|
+
async def update_payment_method(
|
|
756
|
+
self, provider_method_id: str, data: PaymentMethodUpdateIn
|
|
757
|
+
) -> PaymentMethodOut:
|
|
758
|
+
out = await self._get_adapter().update_payment_method(provider_method_id, data)
|
|
759
|
+
row = await self.session.scalar(
|
|
760
|
+
select(PayPaymentMethod).where(
|
|
761
|
+
PayPaymentMethod.provider_method_id == provider_method_id
|
|
762
|
+
)
|
|
763
|
+
)
|
|
764
|
+
if row:
|
|
765
|
+
if data.name is not None:
|
|
766
|
+
pass # keep local-only if/when you add column
|
|
767
|
+
if data.exp_month is not None:
|
|
768
|
+
row.exp_month = data.exp_month
|
|
769
|
+
if data.exp_year is not None:
|
|
770
|
+
row.exp_year = data.exp_year
|
|
771
|
+
return out
|
|
772
|
+
|
|
773
|
+
# ---- Refunds list/get ----
|
|
774
|
+
async def list_refunds(
|
|
775
|
+
self, *, provider_payment_intent_id: str | None, limit: int, cursor: str | None
|
|
776
|
+
) -> tuple[list[RefundOut], str | None]:
|
|
777
|
+
return await self._get_adapter().list_refunds(
|
|
778
|
+
provider_payment_intent_id=provider_payment_intent_id, limit=limit, cursor=cursor
|
|
779
|
+
)
|
|
780
|
+
|
|
781
|
+
async def get_refund(self, provider_refund_id: str) -> RefundOut:
|
|
782
|
+
return await self._get_adapter().get_refund(provider_refund_id)
|
|
783
|
+
|
|
784
|
+
# ---- Invoice line items list ----
|
|
785
|
+
async def list_invoice_line_items(
|
|
786
|
+
self, provider_invoice_id: str, *, limit: int, cursor: str | None
|
|
787
|
+
) -> tuple[list[InvoiceLineItemOut], str | None]:
|
|
788
|
+
return await self._get_adapter().list_invoice_line_items(
|
|
789
|
+
provider_invoice_id, limit=limit, cursor=cursor
|
|
790
|
+
)
|
|
791
|
+
|
|
792
|
+
# ---- Usage records list/get ----
|
|
793
|
+
async def list_usage_records(
|
|
794
|
+
self, f: UsageRecordListFilter
|
|
795
|
+
) -> tuple[list[UsageRecordOut], str | None]:
|
|
796
|
+
return await self._get_adapter().list_usage_records(f)
|
|
797
|
+
|
|
798
|
+
async def get_usage_record(self, usage_record_id: str) -> UsageRecordOut:
|
|
799
|
+
return await self._get_adapter().get_usage_record(usage_record_id)
|
|
800
|
+
|
|
801
|
+
async def delete_invoice_line_item(
|
|
802
|
+
self, provider_invoice_id: str, provider_line_item_id: str
|
|
803
|
+
) -> InvoiceOut:
|
|
804
|
+
return await self._get_adapter().delete_invoice_line_item(
|
|
805
|
+
provider_invoice_id, provider_line_item_id
|
|
806
|
+
)
|