UNPKG

burdy

Version:

Open Source Headless Platform

189 lines (188 loc) 8.59 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 }); exports.exportAssets = exports.importAssets = exports.importAsset = exports.getParent = void 0; const asset_model_1 = __importDefault(require("../models/asset.model")); const bad_request_error_1 = __importDefault(require("../errors/bad-request-error")); const file_driver_1 = __importDefault(require("../drivers/file.driver")); const fs_extra_1 = __importDefault(require("fs-extra")); const path_util_1 = __importDefault(require("../../scripts/util/path.util")); const uuid_1 = require("uuid"); const async_1 = __importDefault(require("async")); const orm_helpers_1 = require("../common/orm-helpers"); const logger_1 = __importDefault(require("../../shared/features/logger")); const fs_helpers_1 = require("../common/fs-helpers"); const FOLDER_MIME_TYPE = 'application/vnd.burdy.folder'; const getParent = (manager, components, parent) => __awaiter(void 0, void 0, void 0, function* () { if (components.length > 0) { let newParent; const name = components.shift(); const npath = parent ? `${parent.npath}/${name}` : name; try { newParent = yield manager.findOne(asset_model_1.default, { npath, }); if (!newParent) { newParent = yield manager.save(asset_model_1.default, { parent, name, mimeType: FOLDER_MIME_TYPE, npath, }); } } catch (err) { newParent = yield manager.findOne(asset_model_1.default, { npath, }); } parent = yield (0, exports.getParent)(manager, components, newParent); } return parent; }); exports.getParent = getParent; const importAsset = ({ manager, asset, user, options, }) => __awaiter(void 0, void 0, void 0, function* () { let saved; let document; logger_1.default.info(`Importing asset: ${asset === null || asset === void 0 ? void 0 : asset.npath}, mimeType: ${asset.mimeType}.`); try { const searchObj = { npath: asset.npath, }; saved = yield manager.findOne(asset_model_1.default, searchObj); if (saved && !(options === null || options === void 0 ? void 0 : options.force)) { logger_1.default.info(`Skipping ${asset.npath}, exists.`); return saved; } if ((saved === null || saved === void 0 ? void 0 : saved.mimeType) === FOLDER_MIME_TYPE) { logger_1.default.info(`Skipping ${asset.npath}, folder exists.`); return saved; } if (saved) { logger_1.default.info(`Updating ${asset.npath}, existing.`); const documentComponents = asset.document .split('/') .filter((cmp) => (cmp === null || cmp === void 0 ? void 0 : cmp.length) > 0); const file = documentComponents.pop(); document = yield (0, fs_helpers_1.fsToDriver)(path_util_1.default.burdyRoot('export', 'content', file), (0, uuid_1.v4)()); const stat = yield file_driver_1.default.getInstance().stat(document); if (!stat) throw new bad_request_error_1.default('invalid_file'); saved.provider = file_driver_1.default.getInstance().getName(); saved.author = user; saved.contentLength = stat.contentLength; saved.document = document; saved = yield manager.save(asset_model_1.default, saved); yield (0, orm_helpers_1.updateMeta)(manager, asset_model_1.default, saved, asset.meta); logger_1.default.info(`Updating ${asset.npath}, successful.`); return saved; } let parent; const nameComponents = asset.npath .split('/') .filter((cmp) => (cmp === null || cmp === void 0 ? void 0 : cmp.length) > 0); const name = nameComponents.pop(); if (nameComponents.length > 0) { parent = yield (0, exports.getParent)(manager, nameComponents); } const assetObj = { name, mimeType: asset.mimeType, author: user, meta: (asset.meta || []).map((item) => ({ key: item.key, value: item.value, })), }; if (parent) { assetObj.parent = parent; assetObj.npath = `${parent.npath}/${name}`; } else { assetObj.npath = name; } logger_1.default.info(`Creating ${asset.npath}, mimeType: ${asset.mimeType}.`); if ((asset === null || asset === void 0 ? void 0 : asset.mimeType) !== FOLDER_MIME_TYPE) { const documentComponents = asset.document .split('/') .filter((cmp) => (cmp === null || cmp === void 0 ? void 0 : cmp.length) > 0); const file = documentComponents.pop(); document = yield (0, fs_helpers_1.fsToDriver)(path_util_1.default.burdyRoot('export', 'content', file), (0, uuid_1.v4)()); const stat = yield file_driver_1.default.getInstance().stat(document); if (!stat) throw new bad_request_error_1.default('invalid_file'); assetObj.provider = file_driver_1.default.getInstance().getName(); assetObj.contentLength = stat.contentLength; assetObj.document = document; } saved = yield manager.save(asset_model_1.default, assetObj); logger_1.default.info(`Creating ${asset.npath}, mimeType: ${asset.mimeType} successful.`); return saved; } catch (err) { logger_1.default.info(`Creating asset ${asset.npath}, mimeType: ${asset.mimeType} failed.`); logger_1.default.error(err); yield file_driver_1.default.getInstance().delete(document); throw err; } }); exports.importAsset = importAsset; const importAssets = ({ entityManager, data, user, options, }) => __awaiter(void 0, void 0, void 0, function* () { const sorted = (data || []).sort((a, b) => { if (a.npath < b.npath) { return -1; } if (a.npath > b.npath) { return 1; } return 0; }); yield async_1.default.eachLimit(sorted, 10, (item, next) => __awaiter(void 0, void 0, void 0, function* () { try { yield (0, exports.importAsset)({ manager: entityManager, user, asset: item, options, }); next(); } catch (e) { next(e); } })); }); exports.importAssets = importAssets; const exportAssets = ({ entityManager }) => __awaiter(void 0, void 0, void 0, function* () { const assetRepository = entityManager.getRepository(asset_model_1.default); const assets = yield assetRepository.find(); yield fs_extra_1.default.ensureDir(path_util_1.default.burdyRoot('export', 'content')); yield async_1.default.eachLimit(assets, 10, (item, next) => __awaiter(void 0, void 0, void 0, function* () { try { if (item === null || item === void 0 ? void 0 : item.document) { const documentComponents = item.document .split('/') .filter((cmp) => (cmp === null || cmp === void 0 ? void 0 : cmp.length) > 0); const document = documentComponents.pop(); yield (0, fs_helpers_1.driverToFs)(item.document, path_util_1.default.burdyRoot('export', 'content', document)); } next(); } catch (e) { next(e); } })); return assets; }); exports.exportAssets = exportAssets;