187 lines
4.3 KiB
JavaScript
187 lines
4.3 KiB
JavaScript
/**
|
|
* Devices Routes
|
|
* All routes related to device management
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const db = require('../db');
|
|
const config = require('../config');
|
|
|
|
/**
|
|
* GET /api/device-types
|
|
* Get all device types
|
|
*/
|
|
router.get('/types', (req, res, next) => {
|
|
try {
|
|
const types = db.getAllDeviceTypes();
|
|
res.json(types);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/devices
|
|
* Get all devices for a project
|
|
*/
|
|
router.get('/', (req, res, next) => {
|
|
try {
|
|
const projectId = req.query.projectId || 1;
|
|
const devices = db.getAllDevices(projectId);
|
|
res.json(devices);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* GET /api/devices/:id/used-ports
|
|
* Get used ports for a device
|
|
*/
|
|
router.get('/:id/used-ports', (req, res, next) => {
|
|
try {
|
|
const ports = db.getUsedPorts(req.params.id);
|
|
res.json(ports);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* POST /api/devices
|
|
* Create a new device
|
|
*/
|
|
router.post('/', (req, res, next) => {
|
|
try {
|
|
const { deviceTypeId, rackId, position, name } = req.body;
|
|
|
|
// Validation
|
|
if (!deviceTypeId) {
|
|
return res.status(400).json({ error: 'Device type ID is required' });
|
|
}
|
|
if (!rackId) {
|
|
return res.status(400).json({ error: 'Rack ID is required' });
|
|
}
|
|
if (typeof position !== 'number' || position < 1 || position > config.rack.slots) {
|
|
return res.status(400).json({
|
|
error: `Position must be between 1 and ${config.rack.slots}`
|
|
});
|
|
}
|
|
if (!name || name.trim().length === 0) {
|
|
return res.status(400).json({ error: 'Device name is required' });
|
|
}
|
|
|
|
// Get project_id from the rack
|
|
const rack = db.db.prepare('SELECT project_id FROM racks WHERE id = ?').get(rackId);
|
|
if (!rack) {
|
|
return res.status(404).json({ error: 'Rack not found' });
|
|
}
|
|
|
|
const device = db.createDevice(deviceTypeId, rackId, rack.project_id, position, name.trim());
|
|
res.status(201).json(device);
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/devices/:id/rack
|
|
* Update device rack and position
|
|
*/
|
|
router.put('/:id/rack', (req, res, next) => {
|
|
try {
|
|
const { rackId, position } = req.body;
|
|
|
|
if (!rackId) {
|
|
return res.status(400).json({ error: 'Rack ID is required' });
|
|
}
|
|
if (typeof position !== 'number' || position < 1 || position > config.rack.slots) {
|
|
return res.status(400).json({
|
|
error: `Position must be between 1 and ${config.rack.slots}`
|
|
});
|
|
}
|
|
|
|
db.updateDeviceRack(req.params.id, rackId, position);
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/devices/:id/logical-position
|
|
* Update device logical view position
|
|
*/
|
|
router.put('/:id/logical-position', (req, res, next) => {
|
|
try {
|
|
const { x, y } = req.body;
|
|
|
|
if (typeof x !== 'number' || typeof y !== 'number') {
|
|
return res.status(400).json({ error: 'Valid x and y coordinates are required' });
|
|
}
|
|
|
|
db.updateDeviceLogicalPosition(req.params.id, x, y);
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/devices/:id/name
|
|
* Update device name
|
|
*/
|
|
router.put('/:id/name', (req, res, next) => {
|
|
try {
|
|
const { name } = req.body;
|
|
|
|
if (!name || name.trim().length === 0) {
|
|
return res.status(400).json({ error: 'Device name is required' });
|
|
}
|
|
|
|
db.updateDeviceName(req.params.id, name.trim());
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* PUT /api/devices/:id/rack-units
|
|
* Update device rack units (form factor)
|
|
*/
|
|
router.put('/:id/rack-units', (req, res, next) => {
|
|
try {
|
|
const { rackUnits } = req.body;
|
|
const min = config.device.minRackUnits || 1;
|
|
const max = config.device.maxRackUnits || config.rack.slots;
|
|
|
|
if (typeof rackUnits !== 'number' || rackUnits < min || rackUnits > max) {
|
|
return res.status(400).json({
|
|
error: `Rack units must be between ${min} and ${max}`
|
|
});
|
|
}
|
|
|
|
db.updateDeviceRackUnits(req.params.id, rackUnits);
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
/**
|
|
* DELETE /api/devices/:id
|
|
* Delete a device
|
|
*/
|
|
router.delete('/:id', (req, res, next) => {
|
|
try {
|
|
db.deleteDevice(req.params.id);
|
|
res.json({ success: true });
|
|
} catch (err) {
|
|
next(err);
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|