← back to Dw Boardroom V2

src/api/routes/voice.ts

52 lines

// ═══════════════════════════════════════════════
// DW Boardroom V2 — Voice / TTS Routes
// ═══════════════════════════════════════════════

import { Router } from 'express';
import { run, query } from '../../db/sqlite';
import { getVoice } from '../../agents/voices';

const router = Router();

// GET /api/voice/config — TTS settings
router.get('/config', (req, res) => {
  try {
    const rows = query<{ key: string; value: string }>('SELECT key, value FROM br2_voice_config');
    const config: Record<string, any> = {};
    for (const row of rows) {
      if (row.value === 'true') config[row.key] = true;
      else if (row.value === 'false') config[row.key] = false;
      else if (!isNaN(Number(row.value))) config[row.key] = Number(row.value);
      else config[row.key] = row.value;
    }
    res.json(config);
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// POST /api/voice/config — update TTS settings
router.post('/config', (req, res) => {
  try {
    const updates = req.body;
    for (const [key, value] of Object.entries(updates)) {
      run(
        `INSERT INTO br2_voice_config (key, value, updated_at) VALUES (?, ?, datetime('now'))
         ON CONFLICT(key) DO UPDATE SET value = ?, updated_at = datetime('now')`,
        [key, String(value), String(value)]
      );
    }
    res.json({ updated: true });
  } catch (err: any) {
    res.status(500).json({ error: err.message });
  }
});

// GET /api/voice/agent/:id — get voice for agent
router.get('/agent/:id', (req, res) => {
  const voice = getVoice(req.params.id);
  res.json({ agentId: req.params.id, voice });
});

export default router;