burdy
Version:
Open Source Headless Platform
159 lines (158 loc) • 8.93 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const express_1 = __importDefault(require("express"));
const auth_middleware_1 = __importDefault(require("../middleware/auth.middleware"));
const async_middleware_1 = __importDefault(require("../middleware/async.middleware"));
const orm_helpers_1 = require("../common/orm-helpers");
const backup_model_1 = __importDefault(require("../models/backup.model"));
const typeorm_1 = require("typeorm");
const uuid_1 = require("uuid");
const model_1 = require("../../shared/interfaces/model");
const file_driver_1 = __importDefault(require("../drivers/file.driver"));
const async_1 = require("../common/async");
const server_bl_1 = require("../business-logic/server.bl");
const path_util_1 = __importDefault(require("../../scripts/util/path.util"));
const not_found_error_1 = __importDefault(require("../errors/not-found-error"));
const bad_request_error_1 = __importDefault(require("../errors/bad-request-error"));
const fs_extra_1 = __importDefault(require("fs-extra"));
const logger_1 = __importDefault(require("../../shared/features/logger"));
const fs_helpers_1 = require("../common/fs-helpers");
const app = (0, express_1.default)();
const getKeyName = (key = '') => {
return key.split('/').pop();
};
app.get('/backups', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default);
const backups = yield backupRepository.find({});
res.send(backups);
})));
app.post('/backups/import', (0, auth_middleware_1.default)(['all']), file_driver_1.default.getInstance().getUpload().single('file'), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b;
if (!req.file)
throw new bad_request_error_1.default('invalid_file');
try {
let backup = {};
yield (0, typeorm_1.getManager)().transaction((entityManager) => __awaiter(void 0, void 0, void 0, function* () {
var _c, _d;
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default, entityManager);
const pendingBackups = yield backupRepository.count({
where: { state: model_1.IBackupState.PENDING },
});
if (pendingBackups > 0)
throw new bad_request_error_1.default('backup_running');
backup.name = (0, uuid_1.v4)();
backup.state = model_1.IBackupState.READY;
backup.provider = file_driver_1.default.getInstance().getName();
backup.document = ((_c = req === null || req === void 0 ? void 0 : req.file) === null || _c === void 0 ? void 0 : _c.filename) || getKeyName((_d = req === null || req === void 0 ? void 0 : req.file) === null || _d === void 0 ? void 0 : _d.key);
backup = yield backupRepository.save(backup);
}));
res.send(backup);
}
catch (err) {
yield file_driver_1.default.getInstance().delete(((_a = req === null || req === void 0 ? void 0 : req.file) === null || _a === void 0 ? void 0 : _a.filename) || getKeyName((_b = req === null || req === void 0 ? void 0 : req.file) === null || _b === void 0 ? void 0 : _b.key));
throw err;
}
})));
app.post('/backups/restore', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
const { user } = req.data;
const { id, force } = req.body;
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default);
const backup = yield backupRepository.findOne({ where: { id } });
if (!backup)
throw new not_found_error_1.default('not_found');
const file = yield (0, fs_helpers_1.driverToFs)(backup.document, path_util_1.default.burdyRoot('import.zip'));
yield (0, server_bl_1.importContent)({ user, file, options: { force } });
if (yield fs_extra_1.default.pathExists(file)) {
yield fs_extra_1.default.remove(file);
}
res.send({
status: 'ok'
});
})));
app.post('/backups', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
yield (0, typeorm_1.getManager)().transaction((entityManager) => __awaiter(void 0, void 0, void 0, function* () {
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default, entityManager);
const pendingBackups = yield backupRepository.count({
where: { state: model_1.IBackupState.PENDING },
});
if (pendingBackups > 0)
throw new bad_request_error_1.default('backup_running');
const backup = backupRepository.create();
backup.name = (0, uuid_1.v4)();
backup.state = model_1.IBackupState.PENDING;
backup.provider = file_driver_1.default.getInstance().getName();
const backupModel = yield backupRepository.save(backup);
(0, async_1.runAsync)(() => __awaiter(void 0, void 0, void 0, function* () {
const fsOutput = path_util_1.default.burdyRoot('backups', `${backup.name}.zip`);
try {
yield fs_extra_1.default.ensureDir(path_util_1.default.burdyRoot('backups'));
yield (0, server_bl_1.exportContent)({ output: fsOutput });
const key = yield (0, fs_helpers_1.fsToDriver)(fsOutput, `export-${backup.name}`);
backup.state = model_1.IBackupState.READY;
backup.document = key;
yield backup.save();
}
catch (e) {
file_driver_1.default.getInstance().delete(backup.document);
backup.remove();
}
finally {
fs_extra_1.default.remove(fsOutput);
}
}));
res.send(backupModel);
}));
})));
app.get('/backups/download/:id', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _e;
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default);
const backup = yield backupRepository.findOne({
where: { id: (_e = req.params) === null || _e === void 0 ? void 0 : _e.id },
});
if (!backup)
throw new not_found_error_1.default('not_found');
if (backup.state === model_1.IBackupState.PENDING)
throw new bad_request_error_1.default('backup_pending');
const readStream = file_driver_1.default.getInstance().createReadStream(backup.document);
res.attachment(`export-${backup.name}-${backup.createdAt.toISOString()}.zip`);
res.contentType('application/zip');
readStream.on('end', () => {
res.end();
});
readStream.pipe(res);
})));
app.delete('/backups/:id', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _f;
const id = (_f = req.params) === null || _f === void 0 ? void 0 : _f.id;
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default);
const backup = yield backupRepository.findOne({ where: { id } });
if (!backup)
throw new not_found_error_1.default('not_found');
yield backupRepository.remove(backup);
yield file_driver_1.default.getInstance().delete(backup.document);
res.send({
id
});
})));
app.get('/backups/:id', (0, auth_middleware_1.default)(['all']), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () {
var _g;
const id = (_g = req.params) === null || _g === void 0 ? void 0 : _g.id;
const backupRepository = (0, orm_helpers_1.getEnhancedRepository)(backup_model_1.default);
const backup = yield backupRepository.findOne({ where: { id } });
if (!backup)
throw new not_found_error_1.default('not_found');
res.send(backup);
})));
exports.default = app;