import { Router } from 'express'; import { z } from 'zod'; import type { DemoStore } from './store.js'; const collectItemSchema = z.object({ userId: z.string().min(1), itemType: z.enum(['team', 'match', 'stadium', 'sticker']), contentId: z.string().min(1), source: z.enum(['manual', 'demo-script', 'system']).optional() }); const createUserSchema = z.object({ displayName: z.string().trim().min(2).max(40), country: z.string().trim().max(40).optional() }); const answerTriviaSchema = z.object({ userId: z.string().min(1), selectedOptionId: z.string().min(1) }); const submitPredictionSchema = z.object({ userId: z.string().min(1), matchId: z.string().min(1), predictedWinnerTeamId: z.string().min(1), confidence: z.number().int().min(1).max(5) }); const addMemorySchema = z.object({ userId: z.string().min(1), title: z.string().trim().min(2).max(80), note: z.string().trim().min(5).max(600), matchId: z.string().min(1).optional(), mood: z.enum(['joy', 'nerves', 'shock', 'pride']).default('joy') }); export function createRoutes(store: DemoStore): Router { const router = Router(); router.get('/content', (_req, res) => { res.json(store.getContent()); }); router.post('/users', (req, res) => { const body = createUserSchema.parse(req.body); res.status(201).json(store.createUser(body.displayName, body.country)); }); router.get('/passport/:userId', (req, res) => { res.json(store.getPassport(req.params.userId)); }); router.get('/leaderboard', (_req, res) => { res.json({ leaderboard: store.getLeaderboard() }); }); router.post('/collect', (req, res) => { const body = collectItemSchema.parse(req.body); res.json(store.collectItem(body)); }); router.post('/trivia/:questionId/answer', (req, res) => { const body = answerTriviaSchema.parse(req.body); res.json(store.answerTrivia(req.params.questionId, body)); }); router.post('/predictions', (req, res) => { const body = submitPredictionSchema.parse(req.body); res.json(store.submitPrediction(body)); }); router.post('/memories', (req, res) => { const body = addMemorySchema.parse(req.body); res.json(store.addMemory(body)); }); router.post('/demo/reset', (_req, res) => { store.reset(); res.json({ ok: true }); }); return router; }