Relates to #129
backend/src/core/middleware/require-tier.ts
backend/src/core/config/feature-tiers.ts
requireTier(featureKey: string)
request.user.tier
FEATURE_TIERS[featureKey].minTier
{ error: 'TIER_REQUIRED', requiredTier, currentTier, featureName, upgradePrompt }
backend/src/core/middleware/
requireTier('fuelLog.receiptScan')
requireTier('document.scanMaintenanceSchedule')
requiredTier
currentTier
featureName
upgradePrompt
requireAuth
backend/src/core/middleware/require-tier.test.ts
Phase: Execution | Agent: Developer | Status: PASS
Created standalone requireTier(featureKey: string) middleware in backend/src/core/middleware/require-tier.ts:
request.userContext.subscriptionTier
backend/src/core/middleware/require-tier.test.ts:
1a6400a feat: add standalone requireTier middleware (refs #138)
Verdict: PASS | Next: Ready for QR post-implementation review
No dependencies set.
The note is not visible to the blocked user.
Relates to #129
Milestone 0: Tier Guard Middleware
Files
backend/src/core/middleware/require-tier.ts(NEW)backend/src/core/config/feature-tiers.ts(read-only reference)Requirements
requireTier(featureKey: string)Fastify preHandler middlewarerequest.user.tier(set by auth middleware)FEATURE_TIERS[featureKey].minTier{ error: 'TIER_REQUIRED', requiredTier, currentTier, featureName, upgradePrompt }if access deniedbackend/src/core/middleware/Acceptance Criteria
requireTier('fuelLog.receiptScan')blocks free-tier users with 403 TIER_REQUIREDrequireTier('fuelLog.receiptScan')allows pro-tier users throughrequireTier('document.scanMaintenanceSchedule')blocks free-tier users with 403 TIER_REQUIREDrequiredTier,currentTier,featureName,upgradePromptrequireAuthin route preHandler arraysTests
backend/src/core/middleware/require-tier.test.ts(NEW)Milestone: Tier Guard Middleware
Phase: Execution | Agent: Developer | Status: PASS
Implementation
Created standalone
requireTier(featureKey: string)middleware inbackend/src/core/middleware/require-tier.ts:requireTier('fuelLog.receiptScan')- no options object neededrequireAuthin preHandler arraysrequiredTier,currentTier,featureName,upgradePromptrequest.userContext.subscriptionTier: Set by auth middlewareTests (9/9 passing)
backend/src/core/middleware/require-tier.test.ts:Quality
1a6400a feat: add standalone requireTier middleware (refs #138)Verdict: PASS | Next: Ready for QR post-implementation review