← back to Dw Boardroom V2
src/api/routes/meetings.ts
122 lines
// ═══════════════════════════════════════════════
// DW Boardroom V2 — Meeting Routes
// ═══════════════════════════════════════════════
import { Router } from 'express';
import * as engine from '../../engine/meetingEngine';
import type { MeetingType } from '../../types';
const router = Router();
// GET /api/meetings — list all meetings
router.get('/', (req, res) => {
try {
const limit = parseInt(req.query.limit as string) || 50;
const meetings = engine.listMeetings(limit);
res.json(meetings);
} catch (err: any) {
res.status(500).json({ error: err.message });
}
});
// GET /api/meetings/active — current meeting
router.get('/active', (req, res) => {
try {
const meeting = engine.getActiveMeeting();
if (!meeting) {
res.json({ active: false, meeting: null });
return;
}
const messages = engine.getMeetingMessages(meeting.id, 100);
const agenda = engine.getAgendaItems(meeting.id);
res.json({ active: true, meeting, messages, agenda });
} catch (err: any) {
res.status(500).json({ error: err.message });
}
});
// GET /api/meetings/:id — meeting detail
router.get('/:id', (req, res) => {
try {
const meeting = engine.getMeeting(req.params.id);
if (!meeting) {
res.status(404).json({ error: 'Meeting not found' });
return;
}
const messages = engine.getMeetingMessages(meeting.id);
const agenda = engine.getAgendaItems(meeting.id);
res.json({ meeting, messages, agenda });
} catch (err: any) {
res.status(500).json({ error: err.message });
}
});
// POST /api/meetings/start/:type — start meeting
router.post('/start/:type', async (req, res) => {
try {
const type = req.params.type as MeetingType;
if (!['strategic', 'initiative', 'ops', 'emergency'].includes(type)) {
res.status(400).json({ error: 'Invalid meeting type. Use: strategic, initiative, ops, emergency' });
return;
}
const meeting = await engine.startMeeting(type);
res.json(meeting);
} catch (err: any) {
res.status(409).json({ error: err.message });
}
});
// POST /api/meetings/:id/halt — halt meeting
router.post('/:id/halt', (req, res) => {
try {
const meeting = engine.haltMeeting(req.params.id);
res.json(meeting);
} catch (err: any) {
res.status(400).json({ error: err.message });
}
});
// POST /api/meetings/:id/advance — advance phase
router.post('/:id/advance', async (req, res) => {
try {
const meeting = await engine.advancePhase(req.params.id);
res.json(meeting);
} catch (err: any) {
res.status(400).json({ error: err.message });
}
});
// POST /api/meetings/:id/message — add message
router.post('/:id/message', (req, res) => {
try {
const { agentId, agentName, message, messageType } = req.body;
if (!message) {
res.status(400).json({ error: 'Message required' });
return;
}
const msg = engine.addMessage(
req.params.id,
agentId || 'user',
agentName || 'User',
message,
messageType || 'dialogue'
);
res.json(msg);
} catch (err: any) {
res.status(500).json({ error: err.message });
}
});
// GET /api/meetings/:id/messages — get messages
router.get('/:id/messages', (req, res) => {
try {
const limit = parseInt(req.query.limit as string) || 500;
const messages = engine.getMeetingMessages(req.params.id, limit);
res.json(messages);
} catch (err: any) {
res.status(500).json({ error: err.message });
}
});
export default router;