UNPKG

burdy

Version:

Open Source Headless Platform

159 lines (158 loc) 8.93 kB
"use strict"; 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;