Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Ls1vMdg2GYqbnKZmPaX1ot
24 lines
1.9 KiB
JavaScript
24 lines
1.9 KiB
JavaScript
// Bundle deals (v1). The logic is in services/deals.ts, shared with /api/v2 (1.51.9).
|
|
const deals = require('../services/deals');
|
|
const { safeErrorMessage } = require('../utils/errorUtils');
|
|
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: safeErrorMessage(error), ...(error.code && !/^P\d/.test(error.code) ? { code: error.code } : {}) });
|
|
|
|
const actorOf = (req) => (req.user ? { id: req.user.id, role: req.user.role, email: req.user.email } : null);
|
|
|
|
// @route GET /api/bundles/event/:eventId — with how often each has been used
|
|
const listBundles = async (req, res) => { try { res.json(await deals.listBundles(req.params.eventId)); } catch (e) { fail(res, e); } };
|
|
// @route POST /api/bundles/event/:eventId
|
|
const createBundle = async (req, res) => { try { res.status(201).json(await deals.createBundle(req.params.eventId, req.body || {}, req.user, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route PUT /api/bundles/:id
|
|
const updateBundle = async (req, res) => { try { res.json(await deals.updateBundle(req.params.id, req.body || {}, req.user, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route DELETE /api/bundles/:id (a used one is switched off instead)
|
|
const deleteBundle = async (req, res) => { try { res.json(await deals.deleteBundle(req.params.id, req.user, await ctxOf(req))); } catch (e) { fail(res, e); } };
|
|
// @route POST /api/bundles/quote — the deals a basket gets, before any coupon
|
|
const quoteBundles = async (req, res) => { try { res.json(await deals.quoteBundles(req.body || {}, actorOf(req))); } catch (e) { fail(res, e); } };
|
|
|
|
module.exports = { listBundles, createBundle, updateBundle, deleteBundle, quoteBundles, publicBundlesForEvent: deals.publicBundlesForEvent };
|