Initial commit
This commit is contained in:
@@ -0,0 +1,95 @@
|
||||
const express = require('express');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const db = require('../db');
|
||||
const router = express.Router();
|
||||
|
||||
// GET /api/racks?roomId=
|
||||
router.get('/', (req, res) => {
|
||||
const { roomId } = req.query;
|
||||
if (!roomId) return res.status(400).json({ error: 'roomId query param required' });
|
||||
|
||||
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(roomId);
|
||||
res.json(racks);
|
||||
});
|
||||
|
||||
// GET /api/racks/:id
|
||||
router.get('/:id', (req, res) => {
|
||||
const rack = db.prepare('SELECT * FROM racks WHERE id = ?').get(req.params.id);
|
||||
if (!rack) return res.status(404).json({ error: 'Rack not found' });
|
||||
|
||||
const components = db.prepare(`
|
||||
SELECT * FROM components WHERE rack_id = ? ORDER BY position ASC NULLS LAST, name ASC
|
||||
`).all(req.params.id);
|
||||
|
||||
// Attach ports to each component so the graphic view can show active ports
|
||||
const componentsWithPorts = components.map(c => {
|
||||
const ports = db.prepare('SELECT * FROM ports WHERE component_id = ? ORDER BY port_number').all(c.id);
|
||||
return { ...c, ports };
|
||||
});
|
||||
|
||||
let room = null, site = null;
|
||||
if (rack.room_id) {
|
||||
room = db.prepare('SELECT id, name, site_id FROM rooms WHERE id = ?').get(rack.room_id);
|
||||
if (room) site = db.prepare('SELECT id, name FROM sites WHERE id = ?').get(room.site_id);
|
||||
}
|
||||
|
||||
res.json({ ...rack, components: componentsWithPorts, room, site });
|
||||
});
|
||||
|
||||
// POST /api/racks
|
||||
router.post('/', (req, res) => {
|
||||
const { room_id, name, total_units, manufacturer, model, notes } = req.body;
|
||||
if (!name) return res.status(400).json({ error: 'name is required' });
|
||||
|
||||
if (room_id) {
|
||||
const room = db.prepare('SELECT id FROM rooms WHERE id = ?').get(room_id);
|
||||
if (!room) return res.status(404).json({ error: 'Room not found' });
|
||||
}
|
||||
|
||||
const id = uuidv4();
|
||||
db.prepare(`
|
||||
INSERT INTO racks (id, room_id, name, total_units, manufacturer, model, notes)
|
||||
VALUES (?, ?, ?, ?, ?, ?, ?)
|
||||
`).run(id, room_id || null, name, total_units || 42, manufacturer || null, model || null, notes || '');
|
||||
|
||||
res.status(201).json(db.prepare('SELECT * FROM racks WHERE id = ?').get(id));
|
||||
});
|
||||
|
||||
// PUT /api/racks/:id
|
||||
router.put('/:id', (req, res) => {
|
||||
const rack = db.prepare('SELECT * FROM racks WHERE id = ?').get(req.params.id);
|
||||
if (!rack) return res.status(404).json({ error: 'Rack not found' });
|
||||
|
||||
const { name, total_units, manufacturer, model, notes } = req.body;
|
||||
db.prepare(`
|
||||
UPDATE racks SET name = ?, total_units = ?, manufacturer = ?, model = ?, notes = ?,
|
||||
updated_at = CURRENT_TIMESTAMP WHERE id = ?
|
||||
`).run(
|
||||
name ?? rack.name,
|
||||
total_units ?? rack.total_units,
|
||||
manufacturer ?? rack.manufacturer,
|
||||
model ?? rack.model,
|
||||
notes ?? rack.notes,
|
||||
req.params.id
|
||||
);
|
||||
|
||||
res.json(db.prepare('SELECT * FROM racks WHERE id = ?').get(req.params.id));
|
||||
});
|
||||
|
||||
// DELETE /api/racks/:id
|
||||
router.delete('/:id', (req, res) => {
|
||||
const rack = db.prepare('SELECT id FROM racks WHERE id = ?').get(req.params.id);
|
||||
if (!rack) return res.status(404).json({ error: 'Rack not found' });
|
||||
|
||||
db.prepare('DELETE FROM racks WHERE id = ?').run(req.params.id);
|
||||
res.json({ ok: true });
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
Reference in New Issue
Block a user