feat: audit log / history timeline on instance detail page
Adds an instance_history table that records every field change: - createInstance logs a 'created' event - updateInstance diffs old vs new and logs one row per changed field (name, state, stack, vmid, tailscale_ip, all service flags) - History is stored under the new vmid when vmid changes New endpoint: GET /api/instances/:vmid/history The 'timestamps' section on the detail page is replaced with a grid timeline showing timestamp | field | old → new for each event. State changes are colour-coded (deployed=green, testing=amber, degraded=red). Boolean service flags display as on/off. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import { Router } from 'express';
|
||||
import {
|
||||
getInstances, getInstance, getDistinctStacks,
|
||||
createInstance, updateInstance, deleteInstance, importInstances,
|
||||
createInstance, updateInstance, deleteInstance, importInstances, getInstanceHistory,
|
||||
} from './db.js';
|
||||
|
||||
export const router = Router();
|
||||
@@ -54,6 +54,14 @@ router.get('/instances', (req, res) => {
|
||||
res.json(getInstances({ search, state, stack }));
|
||||
});
|
||||
|
||||
// GET /api/instances/:vmid/history
|
||||
router.get('/instances/:vmid/history', (req, res) => {
|
||||
const vmid = parseInt(req.params.vmid, 10);
|
||||
if (!vmid) return res.status(400).json({ error: 'invalid vmid' });
|
||||
if (!getInstance(vmid)) return res.status(404).json({ error: 'instance not found' });
|
||||
res.json(getInstanceHistory(vmid));
|
||||
});
|
||||
|
||||
// GET /api/instances/:vmid
|
||||
router.get('/instances/:vmid', (req, res) => {
|
||||
const vmid = parseInt(req.params.vmid, 10);
|
||||
|
||||
Reference in New Issue
Block a user