← 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;