Aller au contenu

Plugins

shaapi livre un cœur minimal et vous laisse ajouter des fonctionnalités seulement quand vous en avez besoin — l'inverse des frameworks qui chargent tous les modules au démarrage.

Un plugin est un blueprint autonome. shaapi add <nom> le copie dans votre projet sous backend/plugins/<nom>/ ; ensuite c'est votre code (lisez-le, modifiez-le). Son router est auto-découvert — rien ne se charge tant que vous ne l'ajoutez pas, donc votre build ne contient que ce que vous avez choisi.

Commandes

shaapi list-plugins          # voir le catalogue
shaapi add advanced_auth     # copier un plugin dans backend/plugins/
shaapi remove advanced_auth  # le retirer

add injecte aussi les dépendances Python du plugin dans votre pyproject.toml et régénère uv.lock, pour que ça build directement. Après ajout, rechargez l'API (shaapi restart api) ou rebuildez.

En développement, les tables du plugin se créent automatiquement au démarrage. En production, générez une migration : shaapi db generate --message "add <plugin>".

Plugins disponibles (v0.3.2)

Plugin Rôle Endpoints (sous /admin/api/v1)
webhooks Abonnements + émission d'événements signés HMAC vers des URLs /webhooks
advanced_audit Piste d'audit applicative (qui a fait quoi, sur quoi) /audit/logs
advanced_auth Auth multi-facteur TOTP par-dessus les utilisateurs intégrés /auth/mfa
user_analytics Suivi d'événements, stats agrégées /analytics
payment Paiements via un provider pluggable (Stripe inclus) /payments

Tous les endpoints sont protégés par JWT. Chaque plugin expose aussi un service appelable depuis votre code (ex. audit_service.record(...), webhook_service.emit(...)).

D'autres à venir

C'est un lot de départ. Dites-nous quels plugins il vous faut ensuite — le catalogue grandit selon les besoins réels de la communauté.

Écrire votre propre plugin

Un plugin n'est qu'un dossier sous backend/plugins/<nom>/ qui expose un router dans son module router — exactement comme la fonctionnalité du tutoriel :

backend/plugins/monplugin/
├── __init__.py        # from backend.plugins.monplugin.router import router
├── models.py          # modèles SQLAlchemy
├── schemas.py         # schémas Pydantic
├── service.py         # logique métier
└── router.py          # APIRouter nommé `router`

C'est tout ce dont l'auto-découverte a besoin. Une fois le dossier présent, l'API le charge au redémarrage suivant.