tududi/backend/modules/backup/controller.js
Chris 542be2c1e9
Fix bug 366 (#764)
* Optimize DB

* Clean up names

* fixup! Clean up names

* fixup! fixup! Clean up names
2026-01-07 18:18:07 +02:00

207 lines
6.6 KiB
JavaScript

'use strict';
const backupService = require('./service');
const { logError } = require('../../services/logService');
const { getAuthenticatedUserId } = require('../../utils/request-utils');
const backupController = {
async export(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.exportData(userId);
res.json(result);
} catch (error) {
logError('Error exporting user data:', error);
res.status(500).json({
error: 'Failed to export data',
message: error.message,
});
}
},
async import(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.importData(
userId,
req.file,
req.body
);
res.json(result);
} catch (error) {
if (error.statusCode === 400) {
const response = { error: error.message };
if (error.errors) {
response.errors = error.errors;
}
if (error.versionMessage) {
response.message = error.versionMessage;
response.backupVersion = error.backupVersion;
}
return res.status(400).json(response);
}
logError('Error importing user data:', error);
res.status(500).json({
error: 'Failed to import data',
message: error.message,
});
}
},
async validate(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.validateBackup(userId, req.file);
res.json(result);
} catch (error) {
if (error.statusCode === 400) {
const response = { valid: false };
if (error.parseMessage) {
response.error = 'Invalid backup file';
response.message = error.parseMessage;
} else if (error.errors) {
response.errors = error.errors;
} else if (error.versionIncompatible) {
response.versionIncompatible = true;
response.message = error.versionMessage;
response.backupVersion = error.backupVersion;
}
return res.status(400).json(response);
}
logError('Error validating backup file:', error);
res.status(500).json({
valid: false,
error: 'Failed to validate backup file',
message: error.message,
});
}
},
async list(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.listBackups(userId);
res.json(result);
} catch (error) {
logError('Error listing backups:', error);
res.status(500).json({
error: 'Failed to list backups',
message: error.message,
});
}
},
async download(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.downloadBackup(
userId,
req.params.uid
);
res.setHeader('Content-Type', result.contentType);
res.setHeader(
'Content-Disposition',
`attachment; filename="${result.filename}"`
);
res.setHeader('Content-Length', result.fileBuffer.length);
res.send(result.fileBuffer);
} catch (error) {
if (error.statusCode === 404) {
return res.status(404).json({ error: error.message });
}
logError('Error downloading backup:', error);
res.status(500).json({
error: 'Failed to download backup',
message: error.message,
});
}
},
async restore(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.restoreBackup(
userId,
req.params.uid,
req.body
);
res.json(result);
} catch (error) {
if (error.statusCode === 400) {
return res.status(400).json({
error: 'Version incompatible',
message: error.versionMessage,
backupVersion: error.backupVersion,
});
}
logError('Error restoring backup:', error);
res.status(500).json({
error: 'Failed to restore backup',
message: error.message,
});
}
},
async delete(req, res, next) {
try {
const userId = getAuthenticatedUserId(req);
if (!userId) {
return res
.status(401)
.json({ error: 'Authentication required' });
}
const result = await backupService.deleteBackup(
userId,
req.params.uid
);
res.json(result);
} catch (error) {
logError('Error deleting backup:', error);
res.status(500).json({
error: 'Failed to delete backup',
message: error.message,
});
}
},
};
module.exports = backupController;