audiobookshelf/server/routers/achievements.js
2025-09-10 06:53:19 +00:00

41 lines
1.4 KiB
JavaScript

// server/routers/achievements.js
const express = require('express')
const AchievementManager = require('../managers/AchievementManager')
const sessionOrJwt = require('../middleware/sessionOrJwt')
module.exports = ({ auth } = {}) => {
if (!auth) throw new Error('[achievements router] Missing auth')
const router = express.Router()
const requireUser = sessionOrJwt(auth)
// PUBLIC — catalog
router.get('/catalog', async (req, res, next) => {
try {
const data = await AchievementManager.getCatalog()
res.json(data)
} catch (e) { next(e) }
})
// Needs user (session OR JWT) — also backfill/sync counts from DB
router.get('/me', requireUser, async (req, res, next) => {
try {
const userId = String(req.user?.id || req.user?.userId || req.session?.userId)
const progress = await AchievementManager.getUserProgress(userId, { syncFromDb: true })
res.json(progress)
} catch (e) { next(e) }
})
// Mark an achievement-related event as completed
router.post('/complete', requireUser, express.json(), async (req, res, next) => {
try {
const userId = String(req.user?.id || req.user?.userId || req.session?.userId)
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 (e) { next(e) }
})
return router
}