← back to Dw Boardroom Governance

src/api/routes/decisions.ts

90 lines

import { Router, Request, Response } from 'express';
import * as decisionEngine from '../../engine/decisionEngine';

const router = Router();

// GET /api/decisions — list decisions
router.get('/', async (req: Request, res: Response) => {
  try {
    const decisions = await decisionEngine.listDecisions({
      status: req.query.status as string,
      owner: req.query.owner as string,
      limit: req.query.limit ? parseInt(req.query.limit as string) : undefined,
    });
    res.json(decisions);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// GET /api/decisions/stats — counts by status
router.get('/stats', async (_req: Request, res: Response) => {
  try {
    const stats = await decisionEngine.getDecisionStats();
    res.json(stats);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// GET /api/decisions/:id — single decision
router.get('/:id', async (req: Request, res: Response) => {
  try {
    const decision = await decisionEngine.getDecision(req.params.id);
    if (!decision) return res.status(404).json({ error: 'Decision not found' });
    res.json(decision);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// POST /api/decisions — create decision
router.post('/', async (req: Request, res: Response) => {
  try {
    const decision = await decisionEngine.createDecision({
      topic: req.body.topic,
      decisionType: req.body.decisionType || 'B',
      recommendation: req.body.recommendation,
      owner: req.body.owner || 'system',
      autonomyLevel: req.body.autonomyLevel,
      deadline: req.body.deadline,
      source: req.body.source,
    });
    res.json(decision);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// POST /api/decisions/:id/approve
router.post('/:id/approve', async (req: Request, res: Response) => {
  try {
    const decision = await decisionEngine.resolveDecision(req.params.id, 'approve', req.body.notes);
    res.json(decision);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// POST /api/decisions/:id/reject
router.post('/:id/reject', async (req: Request, res: Response) => {
  try {
    const decision = await decisionEngine.resolveDecision(req.params.id, 'reject', req.body.notes);
    res.json(decision);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// POST /api/decisions/:id/defer
router.post('/:id/defer', async (req: Request, res: Response) => {
  try {
    const decision = await decisionEngine.resolveDecision(req.params.id, 'defer', req.body.notes);
    res.json(decision);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

export default router;