b1e645157a
По образцу classroom-split:
backend/src/controllers/gamificationController.js 859L → 31L (фасад)
backend/src/controllers/gamification/
_shared.js 194L — db, helpers (xpToLevel/levelMinXp/levelMaxXp/
rankName/RANKS), GOAL_TIERS, ACHIEVEMENT_DEFS,
AVATAR_FRAMES, stmts (все prepared statements)
service.js 393L — бизнес-логика: awardXP/awardCoins/getXPInfo/
updateStreak, seedAchievements/
unlockAchievement/pushAchievementNotif/
checkAchievements/checkRedBookAchievements,
hooks (onLessonComplete/onTestFinished/
onClassJoined/onLabExperiment),
daily (getDailyGoal/updateDailyGoal),
challenges (_currentWeek/ensureChallenges/
updateChallenges)
api.js 152L — HTTP handlers /api/gamification/*: getMe,
getFrames, setFrame, setGoalTier,
getAchievements, getLeaderboard, getXPHistory,
getChallenges, claimChallenge
admin.js 70L — /api/gamification/admin/*: adminAward,
adminReset, adminGamStats, adminGetUser
Фасад gamificationController.js перереэкспортирует ВСЕ 24 функции,
которые были в оригинале. Никаких изменений в:
- routes/* (импорты не менялись)
- biochemController, classController, gamesController,
lessonController, petController, redBookController,
sessionController, db/seed-permissions, db/legacy-migrate
(все 10+ внешних импортов 'gamificationController' работают)
Проверено: node --check OK, server restart, /api/gamification/*
возвращает 401 (auth req'd) — маршруты живые. Объект module.exports
содержит все 24 функции (тест: Object.keys чтения фасада).
Самый большой контроллер в проекте теперь хорошо структурирован:
любой разработчик мгновенно находит нужный кусок.