mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-07 18:01:42 +00:00
111 lines
3.1 KiB
JavaScript
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)
|
|
}
|
|
}
|
|
}
|