mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-07-08 10:21:38 +00:00
41 lines
1.4 KiB
JavaScript
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
|
|
}
|