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