svc-infra 0.1.579__tar.gz → 0.1.581__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.

Files changed (233) hide show
  1. {svc_infra-0.1.579 → svc_infra-0.1.581}/PKG-INFO +1 -1
  2. {svc_infra-0.1.579 → svc_infra-0.1.581}/pyproject.toml +1 -1
  3. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/provider/base.py +91 -3
  4. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/schemas.py +58 -0
  5. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/service.py +180 -0
  6. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/apf_payments/router.py +318 -0
  7. {svc_infra-0.1.579 → svc_infra-0.1.581}/README.md +0 -0
  8. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/__init__.py +0 -0
  9. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/__init__.py +0 -0
  10. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/alembic.py +0 -0
  11. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/models.py +0 -0
  12. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/provider/__init__.py +0 -0
  13. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/provider/registry.py +0 -0
  14. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/provider/stripe.py +0 -0
  15. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/apf_payments/settings.py +0 -0
  16. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/__init__.py +0 -0
  17. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/__init__.py +0 -0
  18. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/apf_payments/__init__.py +0 -0
  19. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/apf_payments/setup.py +0 -0
  20. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/__init__.py +0 -0
  21. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/_cookies.py +0 -0
  22. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/add.py +0 -0
  23. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/gaurd.py +0 -0
  24. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/__init__.py +0 -0
  25. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/models.py +0 -0
  26. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/pre_auth.py +0 -0
  27. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/router.py +0 -0
  28. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/security.py +0 -0
  29. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/utils.py +0 -0
  30. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/mfa/verify.py +0 -0
  31. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/policy.py +0 -0
  32. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/providers.py +0 -0
  33. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/routers/__init__.py +0 -0
  34. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/routers/account.py +0 -0
  35. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/routers/apikey_router.py +0 -0
  36. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/routers/oauth_router.py +0 -0
  37. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/security.py +0 -0
  38. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/sender.py +0 -0
  39. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/settings.py +0 -0
  40. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/auth/state.py +0 -0
  41. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/cache/__init__.py +0 -0
  42. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/cache/add.py +0 -0
  43. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/__init__.py +0 -0
  44. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/http.py +0 -0
  45. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/nosql/__init__.py +0 -0
  46. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/nosql/mongo/__init__.py +0 -0
  47. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/nosql/mongo/add.py +0 -0
  48. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +0 -0
  49. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/nosql/mongo/health.py +0 -0
  50. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/README.md +0 -0
  51. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/__init__.py +0 -0
  52. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/add.py +0 -0
  53. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/crud_router.py +0 -0
  54. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/health.py +0 -0
  55. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/session.py +0 -0
  56. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/db/sql/users.py +0 -0
  57. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/docs/__init__.py +0 -0
  58. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/docs/landing.py +0 -0
  59. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/docs/scoped.py +0 -0
  60. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/__init__.py +0 -0
  61. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/dualize.py +0 -0
  62. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/protected.py +0 -0
  63. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/public.py +0 -0
  64. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/router.py +0 -0
  65. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dual/utils.py +0 -0
  66. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/dx.py +0 -0
  67. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/ease.py +0 -0
  68. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/http/__init__.py +0 -0
  69. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/http/concurrency.py +0 -0
  70. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/http/conditional.py +0 -0
  71. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/http/deprecation.py +0 -0
  72. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/__init__.py +0 -0
  73. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/debug.py +0 -0
  74. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/errors/__init__.py +0 -0
  75. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/errors/catchall.py +0 -0
  76. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/errors/exceptions.py +0 -0
  77. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/errors/handlers.py +0 -0
  78. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/idempotency.py +0 -0
  79. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/ratelimit.py +0 -0
  80. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/middleware/request_id.py +0 -0
  81. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/__init__.py +0 -0
  82. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/apply.py +0 -0
  83. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/conventions.py +0 -0
  84. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/models.py +0 -0
  85. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/mutators.py +0 -0
  86. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/pipeline.py +0 -0
  87. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/responses.py +0 -0
  88. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/openapi/security.py +0 -0
  89. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/pagination.py +0 -0
  90. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/paths/__init__.py +0 -0
  91. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/paths/auth.py +0 -0
  92. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/paths/generic.py +0 -0
  93. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/paths/prefix.py +0 -0
  94. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/paths/user.py +0 -0
  95. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/routers/__init__.py +0 -0
  96. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/routers/ping.py +0 -0
  97. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/api/fastapi/setup.py +0 -0
  98. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/README.md +0 -0
  99. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/__init__.py +0 -0
  100. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/env.py +0 -0
  101. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/logging/__init__.py +0 -0
  102. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/logging/add.py +0 -0
  103. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/logging/filter.py +0 -0
  104. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/logging/formats.py +0 -0
  105. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/app/root.py +0 -0
  106. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/README.md +0 -0
  107. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/__init__.py +0 -0
  108. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/backend.py +0 -0
  109. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/decorators.py +0 -0
  110. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/demo.py +0 -0
  111. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/keys.py +0 -0
  112. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/recache.py +0 -0
  113. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/resources.py +0 -0
  114. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/tags.py +0 -0
  115. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/ttl.py +0 -0
  116. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cache/utils.py +0 -0
  117. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/__init__.py +0 -0
  118. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/__init__.py +0 -0
  119. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/__init__.py +0 -0
  120. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/nosql/__init__.py +0 -0
  121. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/nosql/mongo/README.md +0 -0
  122. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/nosql/mongo/__init__.py +0 -0
  123. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +0 -0
  124. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +0 -0
  125. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/sql/__init__.py +0 -0
  126. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/sql/alembic_cmds.py +0 -0
  127. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +0 -0
  128. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/help.py +0 -0
  129. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/obs/__init__.py +0 -0
  130. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/cmds/obs/obs_cmds.py +0 -0
  131. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/foundation/__init__.py +0 -0
  132. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/foundation/runner.py +0 -0
  133. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/cli/foundation/typer_bootstrap.py +0 -0
  134. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/__init__.py +0 -0
  135. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/crud_schema.py +0 -0
  136. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/__init__.py +0 -0
  137. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/base.py +0 -0
  138. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/constants.py +0 -0
  139. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/core.py +0 -0
  140. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/indexes.py +0 -0
  141. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/management.py +0 -0
  142. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/README.md +0 -0
  143. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/__init__.py +0 -0
  144. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/client.py +0 -0
  145. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/settings.py +0 -0
  146. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/templates/__init__.py +0 -0
  147. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/templates/documents.py.tmpl +0 -0
  148. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/templates/resources.py.tmpl +0 -0
  149. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/mongo/templates/schemas.py.tmpl +0 -0
  150. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/repository.py +0 -0
  151. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/resource.py +0 -0
  152. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/scaffold.py +0 -0
  153. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/service.py +0 -0
  154. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/service_with_hooks.py +0 -0
  155. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/types.py +0 -0
  156. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/nosql/utils.py +0 -0
  157. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/README.md +0 -0
  158. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/__init__.py +0 -0
  159. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/apikey.py +0 -0
  160. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/authref.py +0 -0
  161. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/base.py +0 -0
  162. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/constants.py +0 -0
  163. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/core.py +0 -0
  164. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/management.py +0 -0
  165. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/repository.py +0 -0
  166. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/resource.py +0 -0
  167. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/scaffold.py +0 -0
  168. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/service.py +0 -0
  169. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/service_with_hooks.py +0 -0
  170. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/__init__.py +0 -0
  171. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/models_schemas/__init__.py +0 -0
  172. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +0 -0
  173. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +0 -0
  174. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/models_schemas/entity/models.py.tmpl +0 -0
  175. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/models_schemas/entity/schemas.py.tmpl +0 -0
  176. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/setup/__init__.py +0 -0
  177. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/setup/alembic.ini.tmpl +0 -0
  178. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/setup/env_async.py.tmpl +0 -0
  179. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/setup/env_sync.py.tmpl +0 -0
  180. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/templates/setup/script.py.mako.tmpl +0 -0
  181. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/types.py +0 -0
  182. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/uniq.py +0 -0
  183. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/uniq_hooks.py +0 -0
  184. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/sql/utils.py +0 -0
  185. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/db/utils.py +0 -0
  186. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/mcp/__init__.py +0 -0
  187. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/mcp/svc_infra_mcp.py +0 -0
  188. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/README.md +0 -0
  189. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/__init__.py +0 -0
  190. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/add.py +0 -0
  191. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/cloud_dash.py +0 -0
  192. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/metrics/__init__.py +0 -0
  193. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/metrics/asgi.py +0 -0
  194. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/metrics/base.py +0 -0
  195. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/metrics/http.py +0 -0
  196. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/metrics/sqlalchemy.py +0 -0
  197. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/__init__.py +0 -0
  198. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/compose_cloud/__init__.py +0 -0
  199. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/compose_cloud/templates/__init__.py +0 -0
  200. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/compose_cloud/templates/agent.yaml.tmpl +0 -0
  201. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/compose_cloud/templates/docker-compose.cloud.yml.tmpl +0 -0
  202. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/__init__.py +0 -0
  203. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/00_overview.json +0 -0
  204. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/10_http.json +0 -0
  205. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/20_db.json +0 -0
  206. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/30_runtime.json +0 -0
  207. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/40_clients.json +0 -0
  208. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/dashboards/__init__.py +0 -0
  209. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/__init__.py +0 -0
  210. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/docker-compose.yml.tmpl +0 -0
  211. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/prometheus.yml.tmpl +0 -0
  212. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/provisioning/__init__.py +0 -0
  213. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/provisioning/dashboards.yml +0 -0
  214. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/providers/grafana/templates/provisioning/datasource.yml +0 -0
  215. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/settings.py +0 -0
  216. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/grafana_dashboard.json +0 -0
  217. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/prometheus_rules.yml +0 -0
  218. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/__init__.py +0 -0
  219. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/compose/__init__.py +0 -0
  220. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/compose/agent.yaml +0 -0
  221. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/compose/docker-compose.yml +0 -0
  222. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/fly/__init__.py +0 -0
  223. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/fly/agent.yaml +0 -0
  224. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/fly/fly.toml.fragment +0 -0
  225. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/k8s/__init__.py +0 -0
  226. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/k8s/configmap.yaml +0 -0
  227. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/k8s/deployment.yaml +0 -0
  228. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/railway/Dockerfile +0 -0
  229. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/railway/README.md +0 -0
  230. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/railway/__init__.py +0 -0
  231. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/obs/templates/sidecars/railway/agent.yaml +0 -0
  232. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/py.typed +0 -0
  233. {svc_infra-0.1.579 → svc_infra-0.1.581}/src/svc_infra/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: svc-infra
3
- Version: 0.1.579
3
+ Version: 0.1.581
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
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "svc-infra"
3
- version = "0.1.579"
3
+ version = "0.1.581"
4
4
  description = "Infrastructure for building and deploying prod-ready services"
5
5
  authors = ["Ali Khatami <aliikhatami94@gmail.com>"]
6
6
  license = "MIT"
@@ -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
+ )