- Redis account created (Upstash)
- Environment variables configured
- Created Redis client (
client.ts) - Created RateLimiter (
rateLimiter.ts) - Created IdempotencyGuard (
idempotency.ts) - Created NonceStore (
nonces.ts) - Created middleware (
rateLimit.ts,validation.ts) - Created validation schemas (event, task, user)
- Updated shared types (removed event_type, added reward_types)
npm install @upstash/redis zod
npm run devTest Redis connection in browser console or add to hooks.server.ts:
import { testRedisConnection } from '$lib/infrastructure/redis/client';
await testRedisConnection(); // Should log "✅ Redis connected"File: src/routes/api/predictions/+server.ts
Apply the pattern:
- Add rate limiting
- Add validation
- Clean up logic
Status: Ready to implement ⬇️
-
src/routes/api/tasks/verify-twitter/+server.ts- Add rate limiting
- Add idempotency guard
- Add validation
-
src/routes/api/tasks/verify-discord/+server.ts- Same pattern
-
src/routes/api/tasks/verify-telegram/+server.ts- Same pattern
-
src/routes/api/tasks/submit/+server.ts(if exists)- Add idempotency
- Add validation
-
Create
src/routes/api/auth/wallet/nonce/+server.ts- Use NonceStore
-
Create
src/routes/api/auth/wallet/verify/+server.ts- Use NonceStore
- Verify signature
- Rate limit
-
src/routes/api/events/+server.ts- Add rate limiting (5/hour)
- Add validation with new schema
- Update to use
reward_typesinstead ofrewards
- Fix duplicate task registry
- Consolidate
src/lib/tasks/index.tsandsrc/lib/tasks/taskRegistry.ts - Update all imports
- Consolidate
After completion:
- All endpoints have rate limiting
- All inputs validated with Zod
- Can't submit invalid data (get 422 error)
- Can't spam requests (get 429 error)
- Can't submit duplicates (get 409 error)
- Wallet auth uses Redis nonces
- No TypeScript errors
- Application works as before (no regressions)
Week 1 Goals:
- Setup (Day 1)
- First endpoint (Day 1-2)
- Verification endpoints (Day 3-4)
- Test everything (Day 5)
Week 2 Goals:
- Task submissions
- Wallet auth
- Event creation
- Final testing
For each updated endpoint, test:
- Valid request → Should work ✓
- Invalid data → Should get validation error (422)
- Rapid requests → Should get rate limited (429)
- Duplicate submission → Should get conflict (409)
- No auth → Should get unauthorized (401)
Remember:
- Redis is for DEFENSE, not caching (yet)
- Supabase is your source of truth
- Add caching only in Phase 4+ if needed
- Test after each endpoint update
If stuck:
- Check
EXAMPLES_BEFORE_AFTER.md - Check
SIMPLIFIED_ARCHITECTURE.md - Existing lints in Svelte files are pre-existing (not urgent)
Current Status: Foundation complete, ready for endpoint migration 🚀