← back to Dw Boardroom Governance

src/api/routes/delegations.ts

78 lines

import { Router, Request, Response } from 'express';
import * as delegationEngine from '../../engine/delegationEngine';
import { suggestDelegate } from '../../agents/vp';

const router = Router();

// GET /api/delegations — list delegations
router.get('/', async (req: Request, res: Response) => {
  try {
    const status = req.query.status as string;
    const delegations = await delegationEngine.listDelegations(status);
    res.json(delegations);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// POST /api/delegations — create delegation
router.post('/', async (req: Request, res: Response) => {
  try {
    const contract = await delegationEngine.createDelegation({
      decisionId: req.body.decisionId,
      owner: req.body.owner,
      delegate: req.body.delegate,
      autonomyLevel: req.body.autonomyLevel,
      metric: req.body.metric,
      checkpointDate: req.body.checkpointDate,
      routingKeywords: req.body.routingKeywords,
    });
    res.json(contract);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// POST /api/delegations/suggest — get routing suggestion
router.post('/suggest', async (req: Request, res: Response) => {
  try {
    const suggestion = suggestDelegate(req.body.description || '');
    res.json(suggestion);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// GET /api/delegations/:id — detail
router.get('/:id', async (req: Request, res: Response) => {
  try {
    const contract = await delegationEngine.getDelegation(req.params.id);
    if (!contract) return res.status(404).json({ error: 'Delegation not found' });
    res.json(contract);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// POST /api/delegations/:id/complete
router.post('/:id/complete', async (req: Request, res: Response) => {
  try {
    const contract = await delegationEngine.completeDelegation(req.params.id);
    res.json(contract);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

// POST /api/delegations/:id/revoke
router.post('/:id/revoke', async (req: Request, res: Response) => {
  try {
    const contract = await delegationEngine.revokeDelegation(req.params.id);
    res.json(contract);
  } catch (err: any) {
    res.status(400).json({ error: err.message });
  }
});

export default router;