feat(api): add all REST route handlers and display-api test (Task 12)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-06 12:56:35 +02:00
co-authored by Claude Sonnet 4.6
parent c922762dfb
commit 44f4b6d010
8 changed files with 725 additions and 0 deletions
@@ -0,0 +1,57 @@
import { Router } from 'express';
import {
getTopicsForBroker,
updateTopic,
startDiscovery,
addManualTopic,
} from '../../modules/mqtt/topic-discovery';
const router = Router({ mergeParams: true });
// GET /api/mqtt/brokers/:brokerId/topics
router.get('/', (req, res): void => {
try {
const brokerId = parseInt(req.params.brokerId);
res.json(getTopicsForBroker(brokerId));
} catch (err) {
res.status(500).json({ error: (err as Error).message });
}
});
// PUT /api/mqtt/brokers/:brokerId/topics/:id
router.put('/:id', (req, res): void => {
try {
const topic = updateTopic(parseInt(req.params.id), req.body);
if (!topic) { res.status(404).json({ error: 'Topic not found' }); return; }
res.json(topic);
} catch (err) {
res.status(500).json({ error: (err as Error).message });
}
});
// POST /api/mqtt/brokers/:brokerId/topics/discover
router.post('/discover', (req, res): void => {
const brokerId = parseInt(req.params.brokerId);
const { prefix } = req.body;
res.json({ message: 'Discovery started', brokerId, prefix: prefix ?? null });
// Run in background
startDiscovery(brokerId, prefix).catch((err) => {
console.error('Discovery error:', (err as Error).message);
});
});
// POST /api/mqtt/brokers/:brokerId/topics/manual
router.post('/manual', (req, res): void => {
try {
const brokerId = parseInt(req.params.brokerId);
const { topic } = req.body;
if (!topic) { res.status(400).json({ error: 'topic is required' }); return; }
res.status(201).json(addManualTopic(brokerId, topic));
} catch (err) {
res.status(500).json({ error: (err as Error).message });
}
});
export default router;