что то амт

This commit is contained in:
2026-03-20 16:48:45 +07:00
parent d935b7374d
commit 430c7f456e
5 changed files with 505 additions and 155 deletions

View File

@@ -36,6 +36,7 @@ const {
getBackupPath,
listBackups,
pruneBackups,
restoreBackup,
} = require('./src/services/backups');
const {
notifyError,
@@ -136,10 +137,10 @@ async function runScheduledBackupIfNeeded() {
lastAutoBackupSlot = slot;
appendAudit('backup.auto_created', 'system', {
files: backup.files,
filename: backup.filename,
source: 'WEB',
});
notifyInfo('Scheduled backup completed', backup.files.map((file) => `${file.kind}: ${file.filename}`)).catch(() => {});
notifyInfo('Scheduled backup completed', [backup.filename]).catch(() => {});
}
function startBackupScheduler() {
@@ -405,7 +406,7 @@ app.post('/api/backups', requireAuth, requirePermission(
includeAppSnapshot: settings.backups.includeAppSnapshot,
keepLast: settings.backups.keepLast,
});
appendAudit('backup.created', req.currentUser.username, { files: backup.files, source: getAuditSource(req) });
appendAudit('backup.created', req.currentUser.username, { filename: backup.filename, source: getAuditSource(req) });
res.json({ success: true, backup });
} catch (err) {
notifyError('Backup creation failed', err, { actor: req.currentUser.username }).catch(() => {});
@@ -413,6 +414,29 @@ app.post('/api/backups', requireAuth, requirePermission(
}
});
app.post('/api/backups/:filename/restore', requireAuth, requirePermission(
(permissions) => permissions.canManageUsers,
'Backup access denied'
), async (req, res) => {
try {
const result = await restoreBackup(req.params.filename, {
restoreAppSnapshot: req.body?.restoreAppSnapshot !== false,
});
appendAudit('backup.restored', req.currentUser.username, {
filename: req.params.filename,
source: getAuditSource(req),
});
notifyInfo('Backup restored', [req.params.filename, `actor: ${req.currentUser.username}`]).catch(() => {});
res.json({ success: true, result });
} catch (err) {
notifyError('Backup restore failed', err, {
actor: req.currentUser.username,
filename: req.params.filename,
}).catch(() => {});
res.status(500).json({ success: false, error: err.message });
}
});
app.get('/api/settings', requireAuth, requirePermission(
(permissions) => permissions.canManageUsers,
'Settings access denied'