feat(metering): service + endpoint usage courant (THI-126 — 2/2) - #12
Conversation
ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Free Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThis PR introduces a complete usage metering system for tracking and enforcing per-period quotas. It adds event recording with transactional counter updates, quota enforcement checks, session authentication utilities, a public API endpoint, and comprehensive test coverage with an injectable fake client for testability. ChangesUsage Metering System
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
Note 🎁 Summarized by CodeRabbit FreeYour organization is on the Free plan. CodeRabbit will generate a high-level summary and a walkthrough for each pull request. For a comprehensive line-by-line review, please upgrade your subscription to CodeRabbit Pro by visiting https://app.coderabbit.ai/login. Comment |
…I-126 — 2/2) Branche le metering sur la base posée en 1/2. - server/utils/metering.ts: recordUsageEvent (event + upsert compteur atomique), readUsageSummary, isUsageAllowed (garde de quota). Client injectable minimal (MeteringClient) à la manière de DbPinger -> testable sans base. - server/utils/session.ts: requireUserId(event) découplé du lot Auth (lit event.context.userId renseigné par le middleware auth THI-131) -> 401 sinon. - GET /api/usage/current: usage de la période en cours + état des quotas. - Tests: 8 specs (builders purs, création event, agrégation compteur, gate quota). Co-Authored-By: Paperclip <noreply@paperclip.ing>
0a24692 to
0fd8dfa
Compare
THI-126 — Metering 2/2 · Service d'enregistrement + endpoint usage
Branche le metering sur la base posée en 1/2 (#11). À merger après #11.
Contenu
server/utils/metering.ts:recordUsageEvent— crée unusage_eventet incrémente leusage_counterde la période, de façon atomique ($transaction). Appelé par les chemins génération (THI-124) et export PDF (THI-125).readUsageSummary— usage courant agrégé + état des quotas.isUsageAllowed— garde de quota à appeler avant une action.MeteringClient(à la manière deDbPinger) → testable sans base.server/utils/session.ts:requireUserId(event)découplé du lot Auth — litevent.context.userId(renseigné par le middleware auth [THI-131]),401sinon. Pas d'import de l'instance auth → PR indépendante de l'ordre de merge.GET /api/usage/current: usage de la période en cours + quotas, pour l'utilisateur authentifié. Aucune donnée de contenu.Tests
8 specs (
apps/app/test/metering.spec.ts) : builders purs, création d'event, agrégation du compteur sur plusieurs actions, refus quand quota atteint.Vérif locale
pnpm --filter @cvo/app test✅ (23/23) ·nuxt typecheck✅ (le client Prisma satisfaitMeteringClient) ·eslint .✅Intégration restante (hors PR)
Le branchement
recordUsageEvent/isUsageAlloweddans les routes génération (THI-124) et export PDF (THI-125) se fera côté de ces routes — appel d'une ligne. La 401 du endpoint suppose que le middleware auth (THI-131) renseigneevent.context.userId.🤖 Generated with Claude Code
Summary by CodeRabbit