burdy
Version:
Open Source Headless Platform
189 lines (188 loc) • 8.59 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 });
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;