← all branches

feat/subscription-gating

safeviewing older commit
99bf169 · incrementalPR #234reviewed 2026-07-04 04:01 UTC0H · 0M · 1L
The branch
Purpose
Block cost-incurring CFE downloads for orgs with inactive Stripe subscriptions (canceled/unpaid), while keeping reads, the billing page, and payment-status checks open so customers can self-cure.
Goal
Gate collect/download job creation behind subscription_status, enforce 402 on inactive orgs, show amber/red subscription banner in dashboard.
Sub-goals
  • SG-1: decideFeatureAccess pure function + SubscriptionInactiveError (402)
  • SG-2: requireActiveSubscription middleware guard
  • SG-3: Enforcement on cfe-jobs handlers + public POST /v1/jobs + CFE subscriber Lambda
  • SG-4: SubscriptionBanner in dashboard layout (es/en)
The changes (whole branch)
What
Refactored partitionGroupsByAccess to capture blockedPublicIds inline in the same branch that sets blocked, removing the separate publicIdById Map and the now-dead ?? '[unknown-org]' fallback.
Why
The old two-phase approach (build Map → post-loop lookup) had a fallback that was already documented as unreachable. Inline capture makes the invariant structural.
Areas
apps/platform+1312domains/core/src/billing+2371packages/api/src/middleware+1030packages/api/src/responses+70services/utility/bills/cfe+1469docs/development+2090
Blast
26 files, +841/−12 across billing domain, API middleware, CFE Lambda subscriber, platform handlers, and dashboard UI. No migration.
billing-gating no-migration fail-open pure-function-refactor
CI· no CI status available for this SHAcoderabbit· no .coderabbit.yaml in repotests· 6/6 unit tests pass

Findings · 1

conventions1

low

Inline comment explains WHAT, not WHY

services/utility/bills/cfe/src/domain/subscription-access.ts:37

Comment `// internal id → group matching` describes the value type, not the reason for inline capture. Remove or fold into the adjacent WHY comment.

History · 7 commits

  1. c807731needs attentionincremental0H · 6M · 8L2026-07-30 17:24
  2. 372882bneeds attentionincremental0H · 1M · 2L2026-07-21 17:31
  3. 1fac5adneeds attentionincremental0H · 5M · 4L2026-07-07 02:50
  4. 99bf169safeincremental0H · 0M · 1L2026-07-04 04:01current
  5. 6305b3cneeds attentionincremental0H · 1M · 4L2026-07-04 03:53
  6. f00e3caneeds attentionincremental0H · 7M · 16L2026-07-04 03:15
  7. 1ae74bdneeds attentionfull6H · 9M · 8L2026-07-04 02:36