Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ls1vMdg2GYqbnKZmPaX1ot
26 lines
2.3 KiB
JavaScript
26 lines
2.3 KiB
JavaScript
// Event series (v1). The logic is in services/series.ts, shared with /api/v2 (1.51.9).
|
|
const series = require('../services/series');
|
|
const { getClientIp } = require('../utils/requestUtils');
|
|
const { scopeFor } = require('../utils/campusScope');
|
|
|
|
const ctxOf = async (req) => ({ scope: await scopeFor(req), ip: getClientIp(req) });
|
|
const fail = (res, error) => res.status(error.statusCode || 400).json({ message: error.message, ...(error.code && !/^P\d/.test(error.code) ? { code: error.code } : {}) });
|
|
|
|
// @route GET /api/series — every series, its events (the ones this person may see) and followers
|
|
const listSeries = async (req, res) => { try { res.json(await series.listSeries(await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route POST /api/series
|
|
const createSeries = async (req, res) => { try { res.status(201).json(await series.createSeries(req.body || {}, req.user, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route PUT /api/series/:id
|
|
const updateSeries = async (req, res) => { try { res.json(await series.updateSeries(req.params.id, req.body || {}, req.user, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route DELETE /api/series/:id (events stay, without a series; followers are dropped)
|
|
const deleteSeries = async (req, res) => { try { await series.deleteSeries(req.params.id, req.user, await ctxOf(req)); res.json({ ok: true }); } catch (e) { fail(res, e); } };
|
|
// @route GET /api/series/by-slug/:slug — the public page
|
|
const getSeriesBySlug = async (req, res) => { try { res.json(await series.seriesPage(req.params.slug, req.user?.id || null)); } catch (e) { fail(res, e); } };
|
|
// @route GET /api/series/:id/compare — year on year
|
|
const compare = async (req, res) => { try { res.json(await series.compareSeries(req.params.id, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route POST|DELETE /api/series/:id/follow
|
|
const followSeries = async (req, res) => { try { res.json(await series.setFollowing(req.params.id, req.user.id, true)); } catch (e) { fail(res, e); } };
|
|
const unfollowSeries = async (req, res) => { try { res.json(await series.setFollowing(req.params.id, req.user.id, false)); } catch (e) { fail(res, e); } };
|
|
|
|
module.exports = { listSeries, createSeries, updateSeries, deleteSeries, getSeriesBySlug, followSeries, unfollowSeries, compare };
|