- Add controller endpoints in
src/controllers/campaign.controller.ts - Add zod request validation + routes in
src/routes/campaign.routes.ts - Enforce authz: campaign owner OR Role.ADMIN for write operations
- Ensure public list allowed (if required by product rules)
- Harden
src/services/donation.service.tsmultiplier math using Decimal - Apply caps: perDonationCap first, then remaining matchCap
- Make matchCap consumption concurrency-safe
- Ensure MatchedFund totals returned match stored values
- Update
src/services/campaign.service.ts#getCampaignStats()to include totalMatched/combinedRaised/matchBreakdown - Update controller response shape if needed
- Add
FEATURE_MULTIPLIERgating for matching and endpoints
- Unit tests: precedence/tie-break + validation
- Integration tests: donation confirm -> MatchedFund, partial caps
- Concurrency test: never exceed matchCap under parallel donations
- Update
docs/API.mdwith multiplier endpoints + stats fields - Add migration notes + rounding method + rollback/rollout guidance
- Update
TODO_MULTIPLIER.mdprogress