svc-infra 0.1.589__py3-none-any.whl โ†’ 0.1.706__py3-none-any.whl

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 (260) hide show
  1. svc_infra/__init__.py +58 -2
  2. svc_infra/apf_payments/README.md +732 -0
  3. svc_infra/apf_payments/models.py +133 -42
  4. svc_infra/apf_payments/provider/__init__.py +4 -0
  5. svc_infra/apf_payments/provider/aiydan.py +871 -0
  6. svc_infra/apf_payments/provider/base.py +30 -9
  7. svc_infra/apf_payments/provider/stripe.py +156 -62
  8. svc_infra/apf_payments/schemas.py +19 -10
  9. svc_infra/apf_payments/service.py +211 -68
  10. svc_infra/apf_payments/settings.py +27 -3
  11. svc_infra/api/__init__.py +61 -0
  12. svc_infra/api/fastapi/__init__.py +15 -0
  13. svc_infra/api/fastapi/admin/__init__.py +3 -0
  14. svc_infra/api/fastapi/admin/add.py +245 -0
  15. svc_infra/api/fastapi/apf_payments/router.py +145 -46
  16. svc_infra/api/fastapi/apf_payments/setup.py +26 -8
  17. svc_infra/api/fastapi/auth/__init__.py +65 -0
  18. svc_infra/api/fastapi/auth/_cookies.py +6 -2
  19. svc_infra/api/fastapi/auth/add.py +27 -14
  20. svc_infra/api/fastapi/auth/gaurd.py +104 -13
  21. svc_infra/api/fastapi/auth/mfa/models.py +3 -1
  22. svc_infra/api/fastapi/auth/mfa/pre_auth.py +10 -6
  23. svc_infra/api/fastapi/auth/mfa/router.py +15 -8
  24. svc_infra/api/fastapi/auth/mfa/security.py +1 -2
  25. svc_infra/api/fastapi/auth/mfa/utils.py +2 -1
  26. svc_infra/api/fastapi/auth/mfa/verify.py +9 -2
  27. svc_infra/api/fastapi/auth/policy.py +0 -1
  28. svc_infra/api/fastapi/auth/providers.py +3 -1
  29. svc_infra/api/fastapi/auth/routers/apikey_router.py +6 -6
  30. svc_infra/api/fastapi/auth/routers/oauth_router.py +214 -75
  31. svc_infra/api/fastapi/auth/routers/session_router.py +67 -0
  32. svc_infra/api/fastapi/auth/security.py +31 -10
  33. svc_infra/api/fastapi/auth/sender.py +8 -1
  34. svc_infra/api/fastapi/auth/settings.py +2 -0
  35. svc_infra/api/fastapi/auth/state.py +3 -1
  36. svc_infra/api/fastapi/auth/ws_security.py +275 -0
  37. svc_infra/api/fastapi/billing/router.py +73 -0
  38. svc_infra/api/fastapi/billing/setup.py +19 -0
  39. svc_infra/api/fastapi/cache/add.py +9 -5
  40. svc_infra/api/fastapi/db/__init__.py +5 -1
  41. svc_infra/api/fastapi/db/http.py +3 -1
  42. svc_infra/api/fastapi/db/nosql/__init__.py +39 -1
  43. svc_infra/api/fastapi/db/nosql/mongo/add.py +47 -32
  44. svc_infra/api/fastapi/db/nosql/mongo/crud_router.py +30 -11
  45. svc_infra/api/fastapi/db/sql/__init__.py +5 -1
  46. svc_infra/api/fastapi/db/sql/add.py +71 -26
  47. svc_infra/api/fastapi/db/sql/crud_router.py +210 -22
  48. svc_infra/api/fastapi/db/sql/health.py +3 -1
  49. svc_infra/api/fastapi/db/sql/session.py +18 -0
  50. svc_infra/api/fastapi/db/sql/users.py +29 -5
  51. svc_infra/api/fastapi/dependencies/ratelimit.py +130 -0
  52. svc_infra/api/fastapi/docs/add.py +173 -0
  53. svc_infra/api/fastapi/docs/landing.py +4 -2
  54. svc_infra/api/fastapi/docs/scoped.py +62 -15
  55. svc_infra/api/fastapi/dual/__init__.py +12 -2
  56. svc_infra/api/fastapi/dual/dualize.py +1 -1
  57. svc_infra/api/fastapi/dual/protected.py +126 -4
  58. svc_infra/api/fastapi/dual/public.py +25 -0
  59. svc_infra/api/fastapi/dual/router.py +40 -13
  60. svc_infra/api/fastapi/dx.py +33 -2
  61. svc_infra/api/fastapi/ease.py +10 -2
  62. svc_infra/api/fastapi/http/concurrency.py +2 -1
  63. svc_infra/api/fastapi/http/conditional.py +3 -1
  64. svc_infra/api/fastapi/middleware/debug.py +4 -1
  65. svc_infra/api/fastapi/middleware/errors/catchall.py +6 -2
  66. svc_infra/api/fastapi/middleware/errors/exceptions.py +1 -1
  67. svc_infra/api/fastapi/middleware/errors/handlers.py +54 -8
  68. svc_infra/api/fastapi/middleware/graceful_shutdown.py +104 -0
  69. svc_infra/api/fastapi/middleware/idempotency.py +197 -70
  70. svc_infra/api/fastapi/middleware/idempotency_store.py +187 -0
  71. svc_infra/api/fastapi/middleware/optimistic_lock.py +42 -0
  72. svc_infra/api/fastapi/middleware/ratelimit.py +143 -31
  73. svc_infra/api/fastapi/middleware/ratelimit_store.py +111 -0
  74. svc_infra/api/fastapi/middleware/request_id.py +27 -11
  75. svc_infra/api/fastapi/middleware/request_size_limit.py +36 -0
  76. svc_infra/api/fastapi/middleware/timeout.py +177 -0
  77. svc_infra/api/fastapi/openapi/apply.py +5 -3
  78. svc_infra/api/fastapi/openapi/conventions.py +9 -2
  79. svc_infra/api/fastapi/openapi/mutators.py +165 -20
  80. svc_infra/api/fastapi/openapi/pipeline.py +1 -1
  81. svc_infra/api/fastapi/openapi/security.py +3 -1
  82. svc_infra/api/fastapi/ops/add.py +75 -0
  83. svc_infra/api/fastapi/pagination.py +47 -20
  84. svc_infra/api/fastapi/routers/__init__.py +43 -15
  85. svc_infra/api/fastapi/routers/ping.py +1 -0
  86. svc_infra/api/fastapi/setup.py +188 -56
  87. svc_infra/api/fastapi/tenancy/add.py +19 -0
  88. svc_infra/api/fastapi/tenancy/context.py +112 -0
  89. svc_infra/api/fastapi/versioned.py +101 -0
  90. svc_infra/app/README.md +5 -5
  91. svc_infra/app/__init__.py +3 -1
  92. svc_infra/app/env.py +69 -1
  93. svc_infra/app/logging/add.py +9 -2
  94. svc_infra/app/logging/formats.py +12 -5
  95. svc_infra/billing/__init__.py +23 -0
  96. svc_infra/billing/async_service.py +147 -0
  97. svc_infra/billing/jobs.py +241 -0
  98. svc_infra/billing/models.py +177 -0
  99. svc_infra/billing/quotas.py +103 -0
  100. svc_infra/billing/schemas.py +36 -0
  101. svc_infra/billing/service.py +123 -0
  102. svc_infra/bundled_docs/README.md +5 -0
  103. svc_infra/bundled_docs/__init__.py +1 -0
  104. svc_infra/bundled_docs/getting-started.md +6 -0
  105. svc_infra/cache/__init__.py +9 -0
  106. svc_infra/cache/add.py +170 -0
  107. svc_infra/cache/backend.py +7 -6
  108. svc_infra/cache/decorators.py +81 -15
  109. svc_infra/cache/demo.py +2 -2
  110. svc_infra/cache/keys.py +24 -4
  111. svc_infra/cache/recache.py +26 -14
  112. svc_infra/cache/resources.py +14 -5
  113. svc_infra/cache/tags.py +19 -44
  114. svc_infra/cache/utils.py +3 -1
  115. svc_infra/cli/__init__.py +52 -8
  116. svc_infra/cli/__main__.py +4 -0
  117. svc_infra/cli/cmds/__init__.py +39 -2
  118. svc_infra/cli/cmds/db/nosql/mongo/mongo_cmds.py +7 -4
  119. svc_infra/cli/cmds/db/nosql/mongo/mongo_scaffold_cmds.py +7 -5
  120. svc_infra/cli/cmds/db/ops_cmds.py +270 -0
  121. svc_infra/cli/cmds/db/sql/alembic_cmds.py +103 -18
  122. svc_infra/cli/cmds/db/sql/sql_export_cmds.py +88 -0
  123. svc_infra/cli/cmds/db/sql/sql_scaffold_cmds.py +3 -3
  124. svc_infra/cli/cmds/docs/docs_cmds.py +142 -0
  125. svc_infra/cli/cmds/dx/__init__.py +12 -0
  126. svc_infra/cli/cmds/dx/dx_cmds.py +116 -0
  127. svc_infra/cli/cmds/health/__init__.py +179 -0
  128. svc_infra/cli/cmds/health/health_cmds.py +8 -0
  129. svc_infra/cli/cmds/help.py +4 -0
  130. svc_infra/cli/cmds/jobs/__init__.py +1 -0
  131. svc_infra/cli/cmds/jobs/jobs_cmds.py +47 -0
  132. svc_infra/cli/cmds/obs/obs_cmds.py +36 -15
  133. svc_infra/cli/cmds/sdk/__init__.py +0 -0
  134. svc_infra/cli/cmds/sdk/sdk_cmds.py +112 -0
  135. svc_infra/cli/foundation/runner.py +6 -2
  136. svc_infra/data/add.py +61 -0
  137. svc_infra/data/backup.py +58 -0
  138. svc_infra/data/erasure.py +45 -0
  139. svc_infra/data/fixtures.py +42 -0
  140. svc_infra/data/retention.py +61 -0
  141. svc_infra/db/__init__.py +15 -0
  142. svc_infra/db/crud_schema.py +9 -9
  143. svc_infra/db/inbox.py +67 -0
  144. svc_infra/db/nosql/__init__.py +3 -0
  145. svc_infra/db/nosql/core.py +30 -9
  146. svc_infra/db/nosql/indexes.py +3 -1
  147. svc_infra/db/nosql/management.py +1 -1
  148. svc_infra/db/nosql/mongo/README.md +13 -13
  149. svc_infra/db/nosql/mongo/client.py +19 -2
  150. svc_infra/db/nosql/mongo/settings.py +6 -2
  151. svc_infra/db/nosql/repository.py +35 -15
  152. svc_infra/db/nosql/resource.py +20 -3
  153. svc_infra/db/nosql/scaffold.py +9 -3
  154. svc_infra/db/nosql/service.py +3 -1
  155. svc_infra/db/nosql/types.py +6 -2
  156. svc_infra/db/ops.py +384 -0
  157. svc_infra/db/outbox.py +108 -0
  158. svc_infra/db/sql/apikey.py +37 -9
  159. svc_infra/db/sql/authref.py +9 -3
  160. svc_infra/db/sql/constants.py +12 -8
  161. svc_infra/db/sql/core.py +2 -2
  162. svc_infra/db/sql/management.py +11 -8
  163. svc_infra/db/sql/repository.py +99 -26
  164. svc_infra/db/sql/resource.py +5 -0
  165. svc_infra/db/sql/scaffold.py +6 -2
  166. svc_infra/db/sql/service.py +15 -5
  167. svc_infra/db/sql/templates/models_schemas/auth/models.py.tmpl +7 -56
  168. svc_infra/db/sql/templates/models_schemas/auth/schemas.py.tmpl +1 -1
  169. svc_infra/db/sql/templates/setup/env_async.py.tmpl +34 -12
  170. svc_infra/db/sql/templates/setup/env_sync.py.tmpl +29 -7
  171. svc_infra/db/sql/tenant.py +88 -0
  172. svc_infra/db/sql/uniq_hooks.py +9 -3
  173. svc_infra/db/sql/utils.py +138 -51
  174. svc_infra/db/sql/versioning.py +14 -0
  175. svc_infra/deploy/__init__.py +538 -0
  176. svc_infra/documents/__init__.py +100 -0
  177. svc_infra/documents/add.py +264 -0
  178. svc_infra/documents/ease.py +233 -0
  179. svc_infra/documents/models.py +114 -0
  180. svc_infra/documents/storage.py +264 -0
  181. svc_infra/dx/add.py +65 -0
  182. svc_infra/dx/changelog.py +74 -0
  183. svc_infra/dx/checks.py +68 -0
  184. svc_infra/exceptions.py +141 -0
  185. svc_infra/health/__init__.py +864 -0
  186. svc_infra/http/__init__.py +13 -0
  187. svc_infra/http/client.py +105 -0
  188. svc_infra/jobs/builtins/outbox_processor.py +40 -0
  189. svc_infra/jobs/builtins/webhook_delivery.py +95 -0
  190. svc_infra/jobs/easy.py +33 -0
  191. svc_infra/jobs/loader.py +50 -0
  192. svc_infra/jobs/queue.py +116 -0
  193. svc_infra/jobs/redis_queue.py +256 -0
  194. svc_infra/jobs/runner.py +79 -0
  195. svc_infra/jobs/scheduler.py +53 -0
  196. svc_infra/jobs/worker.py +40 -0
  197. svc_infra/loaders/__init__.py +186 -0
  198. svc_infra/loaders/base.py +142 -0
  199. svc_infra/loaders/github.py +311 -0
  200. svc_infra/loaders/models.py +147 -0
  201. svc_infra/loaders/url.py +235 -0
  202. svc_infra/logging/__init__.py +374 -0
  203. svc_infra/mcp/svc_infra_mcp.py +91 -33
  204. svc_infra/obs/README.md +2 -0
  205. svc_infra/obs/add.py +65 -9
  206. svc_infra/obs/cloud_dash.py +2 -1
  207. svc_infra/obs/grafana/dashboards/http-overview.json +45 -0
  208. svc_infra/obs/metrics/__init__.py +52 -0
  209. svc_infra/obs/metrics/asgi.py +13 -7
  210. svc_infra/obs/metrics/http.py +9 -5
  211. svc_infra/obs/metrics/sqlalchemy.py +13 -9
  212. svc_infra/obs/metrics.py +53 -0
  213. svc_infra/obs/settings.py +6 -2
  214. svc_infra/security/add.py +217 -0
  215. svc_infra/security/audit.py +212 -0
  216. svc_infra/security/audit_service.py +74 -0
  217. svc_infra/security/headers.py +52 -0
  218. svc_infra/security/hibp.py +101 -0
  219. svc_infra/security/jwt_rotation.py +105 -0
  220. svc_infra/security/lockout.py +102 -0
  221. svc_infra/security/models.py +287 -0
  222. svc_infra/security/oauth_models.py +73 -0
  223. svc_infra/security/org_invites.py +130 -0
  224. svc_infra/security/passwords.py +79 -0
  225. svc_infra/security/permissions.py +171 -0
  226. svc_infra/security/session.py +98 -0
  227. svc_infra/security/signed_cookies.py +100 -0
  228. svc_infra/storage/__init__.py +93 -0
  229. svc_infra/storage/add.py +253 -0
  230. svc_infra/storage/backends/__init__.py +11 -0
  231. svc_infra/storage/backends/local.py +339 -0
  232. svc_infra/storage/backends/memory.py +216 -0
  233. svc_infra/storage/backends/s3.py +353 -0
  234. svc_infra/storage/base.py +239 -0
  235. svc_infra/storage/easy.py +185 -0
  236. svc_infra/storage/settings.py +195 -0
  237. svc_infra/testing/__init__.py +685 -0
  238. svc_infra/utils.py +7 -3
  239. svc_infra/webhooks/__init__.py +69 -0
  240. svc_infra/webhooks/add.py +339 -0
  241. svc_infra/webhooks/encryption.py +115 -0
  242. svc_infra/webhooks/fastapi.py +39 -0
  243. svc_infra/webhooks/router.py +55 -0
  244. svc_infra/webhooks/service.py +70 -0
  245. svc_infra/webhooks/signing.py +34 -0
  246. svc_infra/websocket/__init__.py +79 -0
  247. svc_infra/websocket/add.py +140 -0
  248. svc_infra/websocket/client.py +282 -0
  249. svc_infra/websocket/config.py +69 -0
  250. svc_infra/websocket/easy.py +76 -0
  251. svc_infra/websocket/exceptions.py +61 -0
  252. svc_infra/websocket/manager.py +344 -0
  253. svc_infra/websocket/models.py +49 -0
  254. svc_infra-0.1.706.dist-info/LICENSE +21 -0
  255. svc_infra-0.1.706.dist-info/METADATA +356 -0
  256. svc_infra-0.1.706.dist-info/RECORD +357 -0
  257. svc_infra-0.1.589.dist-info/METADATA +0 -79
  258. svc_infra-0.1.589.dist-info/RECORD +0 -234
  259. {svc_infra-0.1.589.dist-info โ†’ svc_infra-0.1.706.dist-info}/WHEEL +0 -0
  260. {svc_infra-0.1.589.dist-info โ†’ svc_infra-0.1.706.dist-info}/entry_points.txt +0 -0
@@ -0,0 +1,356 @@
1
+ Metadata-Version: 2.3
2
+ Name: svc-infra
3
+ Version: 0.1.706
4
+ Summary: Infrastructure for building and deploying prod-ready services
5
+ License: MIT
6
+ Keywords: fastapi,sqlalchemy,alembic,auth,infra,async,pydantic
7
+ Author: Ali Khatami
8
+ Author-email: aliikhatami94@gmail.com
9
+ Requires-Python: >=3.11,<4.0
10
+ Classifier: Development Status :: 4 - Beta
11
+ Classifier: Framework :: FastAPI
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Programming Language :: Python :: 3 :: Only
19
+ Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
20
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
21
+ Classifier: Typing :: Typed
22
+ Provides-Extra: adyen
23
+ Provides-Extra: duckdb
24
+ Provides-Extra: metrics
25
+ Provides-Extra: mongodb
26
+ Provides-Extra: mssql
27
+ Provides-Extra: mysql
28
+ Provides-Extra: payments
29
+ Provides-Extra: pg
30
+ Provides-Extra: pg2
31
+ Provides-Extra: redshift
32
+ Provides-Extra: s3
33
+ Provides-Extra: snowflake
34
+ Provides-Extra: sqlite
35
+ Provides-Extra: stripe
36
+ Requires-Dist: adyen (>=10.0.0) ; extra == "payments" or extra == "adyen"
37
+ Requires-Dist: aioboto3 (>=12.0.0) ; extra == "s3"
38
+ Requires-Dist: aiofiles (>=24.0.0)
39
+ Requires-Dist: aiosqlite (>=0.19.0) ; extra == "sqlite"
40
+ Requires-Dist: alembic (>=1.13.0)
41
+ Requires-Dist: asyncpg (>=0.29.0) ; extra == "pg"
42
+ Requires-Dist: authlib (>=1.0.0)
43
+ Requires-Dist: cashews[redis] (>=7.0)
44
+ Requires-Dist: duckdb (>=0.10.0) ; extra == "duckdb"
45
+ Requires-Dist: email-validator (>=2.0.0)
46
+ Requires-Dist: fastapi (>=0.110.0)
47
+ Requires-Dist: fastapi-users-db-sqlalchemy (>=7.0.0)
48
+ Requires-Dist: fastapi-users[oauth] (>=14.0.0)
49
+ Requires-Dist: greenlet (>=3.0)
50
+ Requires-Dist: httpx (>=0.25.0)
51
+ Requires-Dist: httpx-oauth (>=0.15.0)
52
+ Requires-Dist: itsdangerous (>=2.0.0)
53
+ Requires-Dist: mcp (>=1.0.0)
54
+ Requires-Dist: motor (>=3.0.0) ; extra == "mongodb"
55
+ Requires-Dist: mysqlclient (>=2.2.0) ; extra == "mysql"
56
+ Requires-Dist: opentelemetry-exporter-otlp (>=1.20.0)
57
+ Requires-Dist: opentelemetry-instrumentation-fastapi (>=0.41b0)
58
+ Requires-Dist: opentelemetry-instrumentation-httpx (>=0.41b0)
59
+ Requires-Dist: opentelemetry-instrumentation-requests (>=0.41b0)
60
+ Requires-Dist: opentelemetry-instrumentation-sqlalchemy (>=0.41b0)
61
+ Requires-Dist: opentelemetry-propagator-b3 (>=1.20.0)
62
+ Requires-Dist: opentelemetry-sdk (>=1.20.0)
63
+ Requires-Dist: passlib[bcrypt] (>=1.7.4)
64
+ Requires-Dist: prometheus-client (>=0.18.0) ; extra == "metrics"
65
+ Requires-Dist: psycopg2-binary (>=2.9.0) ; extra == "pg2"
66
+ Requires-Dist: psycopg[binary] (>=3.0) ; extra == "pg"
67
+ Requires-Dist: pydantic-settings (>=2.0)
68
+ Requires-Dist: pymysql (>=1.1.0) ; extra == "mysql"
69
+ Requires-Dist: pyodbc (>=5.0.0) ; extra == "mssql"
70
+ Requires-Dist: pyotp (>=2.9.0)
71
+ Requires-Dist: python-dotenv (>=1.0.0)
72
+ Requires-Dist: redis (>=5.0.0)
73
+ Requires-Dist: redshift-connector (>=2.0.0) ; extra == "redshift"
74
+ Requires-Dist: snowflake-connector-python (>=3.0.0) ; extra == "snowflake"
75
+ Requires-Dist: sqlalchemy[asyncio] (>=2.0)
76
+ Requires-Dist: stripe (>=7.0.0) ; extra == "payments" or extra == "stripe"
77
+ Requires-Dist: typer (>=0.12.0)
78
+ Requires-Dist: websockets (>=12.0)
79
+ Project-URL: Documentation, https://nfrax.com/svc-infra
80
+ Project-URL: Homepage, https://github.com/nfraxlab/svc-infra
81
+ Project-URL: Issues, https://github.com/nfraxlab/svc-infra/issues
82
+ Project-URL: Repository, https://github.com/nfraxlab/svc-infra
83
+ Description-Content-Type: text/markdown
84
+
85
+ <div align="center">
86
+
87
+ # svc-infra
88
+
89
+ ### Production-ready FastAPI infrastructure in one import
90
+
91
+ [![PyPI](https://img.shields.io/pypi/v/svc-infra.svg)](https://pypi.org/project/svc-infra/) [![Python 3.11+](https://img.shields.io/badge/python-3.11+-blue.svg)](https://www.python.org/downloads/) [![License: MIT](https://img.shields.io/badge/License-MIT-green.svg)](https://opensource.org/licenses/MIT) [![Downloads](https://static.pepy.tech/badge/svc-infra/month)](https://pepy.tech/project/svc-infra)
92
+
93
+ **Stop rebuilding auth, billing, webhooks, and background jobs for every project.**
94
+
95
+ [Documentation](docs/) ยท [Examples](examples/) ยท [PyPI](https://pypi.org/project/svc-infra/)
96
+
97
+ </div>
98
+
99
+ ---
100
+
101
+ ## Why svc-infra?
102
+
103
+ Every FastAPI project needs the same things: authentication, database setup, background jobs, caching, webhooks, billing... You've written this code before. Multiple times.
104
+
105
+ **svc-infra** packages battle-tested infrastructure used in production, so you can focus on your actual product:
106
+
107
+ ```python
108
+ from svc_infra.api.fastapi.ease import easy_service_app
109
+
110
+ app = easy_service_app(name="MyAPI", release="1.0.0")
111
+ # โœ… Health checks, CORS, security headers, structured logging
112
+ # โœ… Prometheus metrics, OpenTelemetry tracing
113
+ # โœ… Request IDs, idempotency middleware
114
+ # That's it. Ship it.
115
+ ```
116
+
117
+ ## โšก Quick Install
118
+
119
+ ```bash
120
+ pip install svc-infra
121
+ ```
122
+
123
+ ## ๐ŸŽฏ What's Included
124
+
125
+ | Feature | What You Get | One-liner |
126
+ |---------|-------------|-----------|
127
+ | **๐Ÿ” Auth** | JWT, sessions, OAuth/OIDC, MFA, API keys | `add_auth_users(app)` |
128
+ | **๐Ÿ’ณ Billing** | Usage tracking, subscriptions, invoices, Stripe sync | `add_billing(app)` |
129
+ | **๐Ÿ“ฆ Database** | PostgreSQL + MongoDB, migrations, inbox/outbox | `add_sql_db(app)` |
130
+ | **โšก Jobs** | Background tasks, scheduling, retries, DLQ | `easy_jobs()` |
131
+ | **๐Ÿ”— Webhooks** | Subscriptions, HMAC signing, delivery retries | `add_webhooks(app)` |
132
+ | **๐Ÿ’พ Cache** | Redis/memory, decorators, namespacing | `init_cache()` |
133
+ | **๐Ÿ“Š Observability** | Prometheus, Grafana dashboards, OTEL | Built-in |
134
+ | **๐Ÿ“ Storage** | S3, local, memory backends | `add_storage(app)` |
135
+ | **๐Ÿข Multi-tenancy** | Tenant isolation, scoped queries | Built-in |
136
+ | **๐Ÿšฆ Rate Limiting** | Per-user, per-endpoint, headers | Built-in |
137
+
138
+ ## ๐Ÿš€ 30-Second Example
139
+
140
+ Build a complete SaaS backend:
141
+
142
+ ```python
143
+ from fastapi import Depends
144
+ from svc_infra.api.fastapi.ease import easy_service_app
145
+ from svc_infra.api.fastapi.db.sql.add import add_sql_db
146
+ from svc_infra.api.fastapi.auth import add_auth_users, current_active_user
147
+ from svc_infra.jobs.easy import easy_jobs
148
+ from svc_infra.webhooks.fastapi import require_signature
149
+
150
+ # Create app with batteries included
151
+ app = easy_service_app(name="MySaaS", release="1.0.0")
152
+
153
+ # Add infrastructure
154
+ add_sql_db(app) # PostgreSQL with migrations
155
+ add_auth_users(app) # Full auth system
156
+ queue, scheduler = easy_jobs() # Background jobs
157
+
158
+ # Your actual business logic
159
+ @app.post("/api/process")
160
+ async def process_data(user=Depends(current_active_user)):
161
+ job = queue.enqueue("heavy_task", {"user_id": user.id})
162
+ return {"job_id": job.id, "status": "queued"}
163
+
164
+ # Webhook endpoint with signature verification
165
+ @app.post("/webhooks/stripe")
166
+ async def stripe_webhook(payload=Depends(require_signature(lambda: ["whsec_..."]))):
167
+ queue.enqueue("process_payment", payload)
168
+ return {"received": True}
169
+ ```
170
+
171
+ **That's a production-ready API** with auth, database, background jobs, and webhook handling.
172
+
173
+ ## ๐Ÿ“š Feature Highlights
174
+
175
+ ### ๐Ÿ” Authentication & Security
176
+
177
+ Full auth system with zero boilerplate:
178
+
179
+ ```python
180
+ from svc_infra.api.fastapi.auth import add_auth_users, current_active_user
181
+
182
+ add_auth_users(app) # Registers /auth/* routes automatically
183
+
184
+ @app.get("/me")
185
+ async def get_profile(user=Depends(current_active_user)):
186
+ return {"email": user.email, "mfa_enabled": user.mfa_enabled}
187
+ ```
188
+
189
+ **Includes:** JWT tokens, session cookies, OAuth/OIDC (Google, GitHub, etc.), MFA/TOTP, password policies, account lockout, key rotation.
190
+
191
+ ### ๐Ÿ’ณ Usage-Based Billing
192
+
193
+ Track usage and generate invoices:
194
+
195
+ ```python
196
+ from svc_infra.billing import BillingService
197
+
198
+ billing = BillingService(session=db, tenant_id="tenant_123")
199
+
200
+ # Record API usage (idempotent)
201
+ billing.record_usage(metric="api_calls", amount=1, idempotency_key="req_abc")
202
+
203
+ # Generate monthly invoice
204
+ invoice = billing.generate_monthly_invoice(
205
+ period_start=datetime(2025, 1, 1),
206
+ period_end=datetime(2025, 2, 1),
207
+ )
208
+ ```
209
+
210
+ **Includes:** Usage events, aggregation, plans & entitlements, subscriptions, invoices, Stripe sync hooks.
211
+
212
+ ### โšก Background Jobs
213
+
214
+ Redis-backed job queue with retries:
215
+
216
+ ```python
217
+ from svc_infra.jobs.easy import easy_jobs
218
+
219
+ queue, scheduler = easy_jobs() # Auto-detects Redis or uses memory
220
+
221
+ # Enqueue work
222
+ queue.enqueue("send_email", {"to": "user@example.com", "template": "welcome"})
223
+
224
+ # Schedule recurring tasks
225
+ scheduler.add("cleanup", interval_seconds=3600, target="myapp.tasks:cleanup")
226
+ ```
227
+
228
+ ```bash
229
+ # Run the worker
230
+ svc-infra jobs run
231
+ ```
232
+
233
+ **Includes:** Visibility timeout, exponential backoff, dead letter queue, interval scheduler, CLI worker.
234
+
235
+ ### ๐Ÿ”— Webhooks
236
+
237
+ Send and receive webhooks with proper security:
238
+
239
+ ```python
240
+ from svc_infra.webhooks import add_webhooks, WebhookService
241
+
242
+ add_webhooks(app) # Adds subscription management routes
243
+
244
+ # Publish events
245
+ webhook_service.publish("invoice.paid", {"invoice_id": "inv_123"})
246
+
247
+ # Verify incoming webhooks
248
+ @app.post("/webhooks/external")
249
+ async def receive(payload=Depends(require_signature(lambda: ["secret1", "secret2"]))):
250
+ return {"ok": True}
251
+ ```
252
+
253
+ **Includes:** Subscription store, HMAC-SHA256 signing, delivery retries, idempotent processing.
254
+
255
+ ### ๐Ÿ“Š Observability
256
+
257
+ Production monitoring out of the box:
258
+
259
+ ```python
260
+ app = easy_service_app(name="MyAPI", release="1.0.0")
261
+ # Prometheus metrics at /metrics
262
+ # Health checks at /healthz, /readyz, /startupz
263
+ # Request tracing with OpenTelemetry
264
+ ```
265
+
266
+ ```bash
267
+ # Generate Grafana dashboards
268
+ svc-infra obs dashboard --service myapi --output ./dashboards/
269
+ ```
270
+
271
+ **Includes:** Prometheus metrics, Grafana dashboard generator, OTEL integration, SLO helpers.
272
+
273
+ ## โš™๏ธ Configuration
274
+
275
+ Everything is configurable via environment variables:
276
+
277
+ ```bash
278
+ # Database
279
+ SQL_URL=postgresql://user:pass@localhost/mydb
280
+ MONGO_URL=mongodb://localhost:27017
281
+
282
+ # Auth
283
+ AUTH_JWT__SECRET=your-secret-key
284
+ AUTH_SMTP_HOST=smtp.sendgrid.net
285
+
286
+ # Jobs
287
+ JOBS_DRIVER=redis
288
+ REDIS_URL=redis://localhost:6379
289
+
290
+ # Storage
291
+ STORAGE_BACKEND=s3
292
+ STORAGE_S3_BUCKET=my-uploads
293
+
294
+ # Observability
295
+ ENABLE_OBS=true
296
+ METRICS_PATH=/metrics
297
+ ```
298
+
299
+ See the [Environment Reference](docs/environment.md) for all options.
300
+
301
+ ## ๐Ÿ“– Documentation
302
+
303
+ | Module | Description | Guide |
304
+ |--------|-------------|-------|
305
+ | **API** | FastAPI bootstrap, middleware, versioning | [docs/api.md](docs/api.md) |
306
+ | **Auth** | Sessions, OAuth/OIDC, MFA, API keys | [docs/auth.md](docs/auth.md) |
307
+ | **Billing** | Usage tracking, subscriptions, invoices | [docs/billing.md](docs/billing.md) |
308
+ | **Database** | SQL + MongoDB, migrations, patterns | [docs/database.md](docs/database.md) |
309
+ | **Jobs** | Background tasks, scheduling | [docs/jobs.md](docs/jobs.md) |
310
+ | **Webhooks** | Publishing, signing, verification | [docs/webhooks.md](docs/webhooks.md) |
311
+ | **Cache** | Redis/memory caching, TTL helpers | [docs/cache.md](docs/cache.md) |
312
+ | **Storage** | S3, local, memory file storage | [docs/storage.md](docs/storage.md) |
313
+ | **Observability** | Metrics, tracing, dashboards | [docs/observability.md](docs/observability.md) |
314
+ | **Security** | Password policy, headers, MFA | [docs/security.md](docs/security.md) |
315
+ | **Tenancy** | Multi-tenant isolation | [docs/tenancy.md](docs/tenancy.md) |
316
+ | **CLI** | Command-line tools | [docs/cli.md](docs/cli.md) |
317
+
318
+ ## ๐Ÿƒ Running the Example
319
+
320
+ See all features working together:
321
+
322
+ ```bash
323
+ git clone https://github.com/nfraxlab/svc-infra.git
324
+ cd svc-infra
325
+
326
+ # Setup and run
327
+ make setup-template # Creates DB, runs migrations
328
+ make run-template # Starts at http://localhost:8001
329
+ ```
330
+
331
+ Visit http://localhost:8001/docs to explore the API.
332
+
333
+ ## ๐Ÿค Related Packages
334
+
335
+ svc-infra is part of the **nfrax** infrastructure suite:
336
+
337
+ | Package | Purpose |
338
+ |---------|---------|
339
+ | **[svc-infra](https://github.com/nfraxlab/svc-infra)** | Backend infrastructure (auth, billing, jobs, webhooks) |
340
+ | **[ai-infra](https://github.com/nfraxlab/ai-infra)** | AI/LLM infrastructure (agents, tools, RAG, MCP) |
341
+ | **[fin-infra](https://github.com/nfraxlab/fin-infra)** | Financial infrastructure (banking, portfolio, insights) |
342
+
343
+ ## ๐Ÿ“„ License
344
+
345
+ MIT License - use it for anything.
346
+
347
+ ---
348
+
349
+ <div align="center">
350
+
351
+ **Built with โค๏ธ by [nfraxlab](https://github.com/nfraxlab)**
352
+
353
+ [โญ Star us on GitHub](https://github.com/nfraxlab/svc-infra) ยท [๐Ÿ“ฆ View on PyPI](https://pypi.org/project/svc-infra/)
354
+
355
+ </div>
356
+