import { Router } from 'express'; import { createGroup, joinGroup, listGroups, renewCode, closeGroup, verifyOrigin, session, member, invitationStatus, extendInvitation, groupById, groupSummary } from '../services/collaboration.js'; import { acquirePoint, releasePoint, touchPoint, pointLocked } from '../services/point-locks.js'; import { HttpError } from '../middleware/errors.js'; export function createGroupsRouter(db) { const router = Router(); router.use((req, res, next) => { res.setHeader('Cache-Control', 'no-store'); if (!['GET', 'HEAD'].includes(req.method)) verifyOrigin(req); next(); }); router.post('/routes/:routeId/pois/:poiId/lock', (req, res) => { const group = db.prepare('SELECT * FROM collaboration_groups WHERE route_id = ?').get(Number(req.params.routeId)); if (!group) throw new HttpError(404, 'Gruppe nicht gefunden.'); member(db, req, group); const account = session(db, req); if (req.body?.heartbeat) { touchPoint(group, account, req.params.poiId, req.body.token); extendInvitation(db, group); return res.status(204).end(); } if (req.body?.release) { releasePoint(group, account, req.params.poiId, req.body.token); return res.json({ released: true }); } const lock = acquirePoint(db, group, account, req.params.poiId, req.body); extendInvitation(db, group); return res.json(lock); }); router.get('/routes/:routeId/pois/:poiId/lock', (req, res) => { const group = db.prepare('SELECT * FROM collaboration_groups WHERE route_id = ?').get(Number(req.params.routeId)); if (!group) throw new HttpError(404, 'Gruppe nicht gefunden.'); member(db, req, group); res.status(pointLocked(db, group, req.params.poiId) ? 423 : 204).end(); }); router.post('/:id/edit', (req, res) => { const group = groupById(db, req.params.id); const access = member(db, req, group); extendInvitation(db, group); res.json({ group: groupSummary(db, groupById(db, group.id), access.role) }); }); router.get('/:id/invitation', (req, res) => res.json(invitationStatus(db, req, req.params.id))); router.get('/', (req, res) => res.json({ groups: listGroups(db, req) })); router.post('/', (req, res) => res.status(201).json(createGroup(db, req, res))); router.post('/join', (req, res) => res.json({ group: joinGroup(db, req, res) })); router.post('/:id/code', (req, res) => res.json(renewCode(db, req, req.params.id))); router.delete('/:id', (req, res) => res.json(closeGroup(db, req, req.params.id))); return router; }