const router = require('express').Router(); const { authMiddleware, requireRole, requirePermission } = require('../middleware/auth'); const rateLimit = require('../middleware/rateLimit'); const validate = require('../middleware/validate'); const { getItems, purchaseItem, getPurchases, getCoins, getMyActive, activateItem, adminGetItems, adminCreateItem, adminUpdateItem, adminDeleteItem, adminAwardCoins, adminShopStats } = require('../controllers/shopController'); const { isGamificationEnabled } = require('../controllers/gamification/_shared'); /* Same kill-switch as gamification routes — shop is part of the gam loop. */ function shopGate(req, res, next) { if (req.path.startsWith('/admin/')) return next(); if (!isGamificationEnabled()) { return res.status(404).json({ error: 'Gamification disabled' }); } next(); } const purchaseLimiter = rateLimit({ windowMs: 60_000, max: 10, message: 'Слишком много покупок, подождите минуту' }); const activateSchema = { body: { type: { type: 'string', oneOf: ['frame', 'title', 'effect', 'background'] } } }; const adminItemSchema = { body: { name: { type: 'string', required: true, minLen: 1, maxLen: 200 }, type: { type: 'string', required: true, oneOf: ['frame', 'title', 'effect', 'background'] }, price: { type: 'number', required: true, min: 0 }, }}; const awardCoinsSchema = { body: { userId: { type: 'number', required: true, min: 1, integer: true }, amount: { type: 'number', required: true, min: 1, integer: true }, }}; router.use(authMiddleware); router.use(shopGate); router.get('/items', getItems); router.post('/items/:id/purchase', requirePermission('shop.purchase'), purchaseLimiter, purchaseItem); router.get('/purchases', getPurchases); router.get('/coins', getCoins); router.get('/my-active', getMyActive); router.post('/activate', validate(activateSchema), activateItem); /* Admin routes — read/award/stats require shop.manage permission (admin always passes; teachers need explicit grant from permissions UI) Create/update/delete items remain admin-only (shop catalogue changes) */ router.get('/admin/items', requirePermission('shop.manage'), adminGetItems); router.post('/admin/items', requireRole('admin'), validate(adminItemSchema), adminCreateItem); router.put('/admin/items/:id', requireRole('admin'), adminUpdateItem); router.delete('/admin/items/:id', requireRole('admin'), adminDeleteItem); router.post('/admin/award-coins', requirePermission('shop.manage'), validate(awardCoinsSchema), adminAwardCoins); router.get('/admin/stats', requirePermission('shop.manage'), adminShopStats); module.exports = router;