const express = require('express'); const { v4: uuidv4 } = require('uuid'); const db = require('../db'); const { logAudit } = require('../audit'); const router = express.Router(); // GET /api/rooms?siteId= router.get('/', (req, res) => { const { siteId } = req.query; if (!siteId) return res.status(400).json({ error: 'siteId query param required' }); const rooms = db.prepare(` SELECT r.*, COUNT(ra.id) as rack_count FROM rooms r LEFT JOIN racks ra ON ra.room_id = r.id WHERE r.site_id = ? GROUP BY r.id ORDER BY r.name `).all(siteId); res.json(rooms); }); // GET /api/rooms/:id router.get('/:id', (req, res) => { const room = db.prepare('SELECT * FROM rooms WHERE id = ?').get(req.params.id); if (!room) return res.status(404).json({ error: 'Room not found' }); const racks = db.prepare(` SELECT ra.*, COUNT(c.id) as component_count FROM racks ra LEFT JOIN components c ON c.rack_id = ra.id WHERE ra.room_id = ? GROUP BY ra.id ORDER BY ra.name `).all(req.params.id); const site = db.prepare('SELECT id, name FROM sites WHERE id = ?').get(room.site_id); res.json({ ...room, racks, site }); }); // POST /api/rooms router.post('/', (req, res) => { const { site_id, name, notes } = req.body; if (!site_id || !name) return res.status(400).json({ error: 'site_id and name are required' }); const site = db.prepare('SELECT id FROM sites WHERE id = ?').get(site_id); if (!site) return res.status(404).json({ error: 'Site not found' }); const id = uuidv4(); db.prepare('INSERT INTO rooms (id, site_id, name, notes) VALUES (?, ?, ?, ?)').run( id, site_id, name, notes || '' ); const created = db.prepare('SELECT * FROM rooms WHERE id = ?').get(id); logAudit(req, { action: 'create', entityType: 'room', entityId: id, entityName: name }); res.status(201).json(created); }); // PUT /api/rooms/:id router.put('/:id', (req, res) => { const room = db.prepare('SELECT * FROM rooms WHERE id = ?').get(req.params.id); if (!room) return res.status(404).json({ error: 'Room not found' }); const { name, notes } = req.body; const changes = {}; if (name != null && name !== room.name) changes.name = { from: room.name, to: name }; db.prepare(` UPDATE rooms SET name = ?, notes = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ? `).run(name ?? room.name, notes ?? room.notes, req.params.id); logAudit(req, { action: 'update', entityType: 'room', entityId: room.id, entityName: name ?? room.name, changes }); res.json(db.prepare('SELECT * FROM rooms WHERE id = ?').get(req.params.id)); }); // DELETE /api/rooms/:id router.delete('/:id', (req, res) => { const room = db.prepare('SELECT * FROM rooms WHERE id = ?').get(req.params.id); if (!room) return res.status(404).json({ error: 'Room not found' }); db.prepare('DELETE FROM rooms WHERE id = ?').run(req.params.id); logAudit(req, { action: 'delete', entityType: 'room', entityId: room.id, entityName: room.name }); res.json({ ok: true }); }); module.exports = router;