audiobookshelf/server/controllers/AchievementController.js
2025-09-10 06:53:19 +00:00

111 lines
3.1 KiB
JavaScript

// server/controllers/AchievementController.js
const AchievementManager = require('../managers/AchievementManager')
/**
* Controller for Achievement endpoints.
* You can wire these handlers from any Express router:
*
* const ctrl = require('../controllers/AchievementController')
* router.get('/catalog', ctrl.catalog)
* router.get('/me', auth.jwtAuthCheck, ctrl.me)
* router.post('/complete', auth.jwtAuthCheck, express.json(), ctrl.complete)
*/
module.exports = {
/**
* GET /api/achievements/catalog
* Public — returns the full catalog (collections + badges).
*/
async catalog(req, res, next) {
try {
const data = await AchievementManager.getCatalog()
res.json(data)
} catch (err) {
next(err)
}
},
/**
* GET /api/achievements/me
* Authenticated — returns the caller's progress.
*/
async me(req, res, next) {
try {
const userId = String(req.user?.id || req.user?.userId || '')
if (!userId) return res.status(401).json({ error: 'Unauthorized' })
const progress = await AchievementManager.getUserProgress(userId)
res.json(progress)
} catch (err) {
next(err)
}
},
/**
* POST /api/achievements/complete
* Authenticated — applies a user event and returns any newly unlocked badges.
* Expects: { event: string, meta?: object }
*/
async complete(req, res, next) {
try {
const userId = String(req.user?.id || req.user?.userId || '')
if (!userId) return res.status(401).json({ error: 'Unauthorized' })
const { event, meta } = req.body || {}
if (!event) return res.status(400).json({ error: 'Missing event' })
const result = await AchievementManager.applyEvent(userId, event, meta || {})
res.json(result)
} catch (err) {
next(err)
}
},
async getCatalog(req, res, next) {
try {
const data = await AchievementManager.getCatalog()
res.json(data)
} catch (err) {
next(err)
}
},
async getUserAchievements(req, res, next) {
try {
const userId = String(req.user?.id || req.user?.userId || '')
if (!userId) return res.status(401).json({ error: 'Unauthorized' })
const achievements = await AchievementManager.getUserAchievements(userId)
res.json(achievements)
} catch (err) {
next(err)
}
},
async getMyAchievements(req, res, next) {
try {
const userId = String(req.user?.id || req.user?.userId || '')
if (!userId) return res.status(401).json({ error: 'Unauthorized' })
const myAchievements = await AchievementManager.getMyAchievements(userId)
res.json(myAchievements)
} catch (err) {
next(err)
}
},
async completeItem(req, res, next) {
try {
const userId = String(req.user?.id || req.user?.userId || '')
if (!userId) return res.status(401).json({ error: 'Unauthorized' })
const { itemId } = req.body || {}
if (!itemId) return res.status(400).json({ error: 'Missing item ID' })
const result = await AchievementManager.completeItem(userId, itemId)
res.json(result)
} catch (err) {
next(err)
}
}
}