Files
incus-backup-ui/backend/src/routes/snapshots.js
T
2026-05-21 09:17:51 +02:00

38 lines
1.1 KiB
JavaScript

import { Router } from 'express';
import { runRestic } from '../executor.js';
import { assertSnapshotIdShape, listSnapshotsForVm, validateSnapshotForVm } from '../validators.js';
export const snapshotsRouter = Router();
snapshotsRouter.get('/:vmName', async (req, res, next) => {
try {
res.json(await listSnapshotsForVm(req.params.vmName));
} catch (error) {
next(error);
}
});
snapshotsRouter.get('/:vmName/:snapshotId/files', async (req, res, next) => {
try {
const snapshot = await validateSnapshotForVm(req.params.vmName, req.params.snapshotId);
assertSnapshotIdShape(snapshot.id);
const result = await runRestic(['ls', '--json', snapshot.id]);
const entries = result.stdout
.split('\n')
.filter(Boolean)
.map((line) => JSON.parse(line))
.filter((entry) => entry.struct_type === 'node')
.map((entry) => ({
name: entry.name,
path: entry.path,
type: entry.type,
size: entry.size || 0,
mode: entry.mode || '',
mtime: entry.mtime || null,
}));
res.json(entries);
} catch (error) {
next(error);
}
});