207 lines
6.6 KiB
JavaScript
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;
|