UNPKG

burdy

Version:

Open Source Headless Platform

762 lines (761 loc) 36.3 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; 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.createPostVersion = exports.isPostPublished = void 0; const express_1 = __importDefault(require("express")); const date_fns_1 = require("date-fns"); const auth_middleware_1 = __importDefault(require("../middleware/auth.middleware")); const async_middleware_1 = __importDefault(require("../middleware/async.middleware")); const typeorm_1 = require("typeorm"); const yup = __importStar(require("yup")); const bad_request_error_1 = __importDefault(require("../errors/bad-request-error")); const post_model_1 = __importDefault(require("../models/post.model")); const content_type_model_1 = __importDefault(require("../models/content-type.model")); const object_1 = require("../common/object"); const logger_1 = __importDefault(require("../../shared/features/logger")); const tag_model_1 = __importDefault(require("../models/tag.model")); const orm_helpers_1 = require("../common/orm-helpers"); const uuid_1 = require("uuid"); const mappers_1 = require("../common/mappers"); const post_utility_1 = require("../common/post.utility"); const site_settings_model_1 = __importDefault(require("../models/site-settings.model")); const content_middleware_1 = require("../middleware/content.middleware"); const utility_1 = require("../../admin/helpers/utility"); const app = (0, express_1.default)(); const isPostPublished = (post) => { if ((post === null || post === void 0 ? void 0 : post.status) === 'published') { if ((post === null || post === void 0 ? void 0 : post.publishedFrom) && (0, date_fns_1.isBefore)(new Date(), new Date(post === null || post === void 0 ? void 0 : post.publishedFrom))) { return false; } if ((post === null || post === void 0 ? void 0 : post.publishedUntil) && (0, date_fns_1.isAfter)(new Date(), new Date(post === null || post === void 0 ? void 0 : post.publishedUntil))) { return false; } return true; } return false; }; exports.isPostPublished = isPostPublished; const createPostVersion = (postRepository, post, author) => __awaiter(void 0, void 0, void 0, function* () { const postVersion = yield postRepository.save({ type: 'post_version', name: post.name, slug: (0, uuid_1.v4)(), slugPath: (0, uuid_1.v4)(), contentType: post.contentType, meta: (post.meta || []).map((meta) => ({ key: meta === null || meta === void 0 ? void 0 : meta.key, value: meta === null || meta === void 0 ? void 0 : meta.value, })), tags: post.tags, author, parent: post, }); return postVersion; }); exports.createPostVersion = createPostVersion; app.get('/posts', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _a, _b, _c, _d, _e, _f, _g, _h; const contentTypeId = (_a = req === null || req === void 0 ? void 0 : req.query) === null || _a === void 0 ? void 0 : _a.contentTypeId; const contentTypeName = (_b = req === null || req === void 0 ? void 0 : req.query) === null || _b === void 0 ? void 0 : _b.contentTypeName; const type = (_c = req === null || req === void 0 ? void 0 : req.query) === null || _c === void 0 ? void 0 : _c.type; const id = (_d = req === null || req === void 0 ? void 0 : req.query) === null || _d === void 0 ? void 0 : _d.id; const search = (_e = req === null || req === void 0 ? void 0 : req.query) === null || _e === void 0 ? void 0 : _e.search; const parentId = (_f = req === null || req === void 0 ? void 0 : req.query) === null || _f === void 0 ? void 0 : _f.parentId; const onlyOrphans = (_g = req === null || req === void 0 ? void 0 : req.query) === null || _g === void 0 ? void 0 : _g.onlyOrphans; const slug = (_h = req === null || req === void 0 ? void 0 : req.query) === null || _h === void 0 ? void 0 : _h.slug; const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const qb = postRepository .createQueryBuilder('post') .leftJoinAndSelect('post.contentType', 'contentType') .leftJoinAndSelect('post.author', 'author') .leftJoinAndSelect('post.tags', 'tags') .leftJoinAndSelect('author.meta', 'author.meta') .where('post.type != :postVersion', { postVersion: 'post_version', }); if (id) { qb.andWhere('post.id IN (:...ids)', { ids: id.split(','), }); } if (slug) { qb.andWhere('post.slugPath IN (:...slugPaths)', { slugPaths: slug.split(','), }); } if (type) { qb.andWhere('post.type IN (:...types)', { types: type.split(','), }); } if (contentTypeId) { qb.andWhere('post.contentTypeId IN (:...ids)', { ids: contentTypeId.split(','), }); } if (contentTypeName) { qb.andWhere('contentType.name IN (:...name)', { name: contentTypeName.split(','), }); } if (parentId && !onlyOrphans) { qb.andWhere('post.parentId IN (:...parentIds)', { parentIds: parentId.split(','), }); } if (onlyOrphans) { qb.andWhere('post.parentId IS NULL'); } if ((search === null || search === void 0 ? void 0 : search.length) > 0) { qb.andWhere(new typeorm_1.Brackets((subQb) => { subQb .where('LOWER(post.name) LIKE :search', { search: `%${search.toLowerCase()}%`, }) .orWhere('LOWER(post.slugPath) LIKE :search', { search: `%${search.toLowerCase()}%`, }); })); } const posts = yield qb.addOrderBy('post.updatedAt', 'DESC').getMany(); res.send(posts.map(mappers_1.mapPost)); }))); app.post('/posts', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { yield req.validate({ slug: yup.string().max(256).required(), name: yup.string().max(256).required(), }, 'body'); const entityManager = (0, typeorm_1.getManager)(); const params = req.body; let post; try { yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { var _j; let parent; if (params.parentId) { parent = yield transactionManager.findOne(post_model_1.default, { id: params.parentId, }); if (!parent) throw new bad_request_error_1.default('invalid_parent'); } let contentType; if (params.contentTypeId) { contentType = yield transactionManager.findOne(content_type_model_1.default, { where: { id: params.contentTypeId, type: (0, typeorm_1.In)(['post', 'page', 'fragment']), }, }); if (!contentType) throw new bad_request_error_1.default('invalid_content_type'); } let meta = []; if (params.meta) { meta = Object.entries(params.meta).map(([key, value]) => ({ key, value, })); } const postObj = { name: params.name, slug: params.slug, type: (params === null || params === void 0 ? void 0 : params.type) || 'post', contentType, author: (_j = req === null || req === void 0 ? void 0 : req.data) === null || _j === void 0 ? void 0 : _j.user, meta, }; if (postObj.type === 'folder') { postObj.status = 'published'; } if (parent) { postObj.parent = parent; postObj.slugPath = `${parent.slugPath}/${params.slug}`; } else { postObj.slugPath = params.slug; } post = yield transactionManager.save(post_model_1.default, postObj); })); } catch (err) { logger_1.default.error({ type: 'post', message: 'error saving post', data: err.toString(), }); if ((err === null || err === void 0 ? void 0 : err.code) === '23505') { throw new bad_request_error_1.default('duplicate_slug'); } throw err; } return res.send((0, mappers_1.mapPost)(post)); }))); app.post('/posts/:postId/copy', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { yield req.validate({ slug: yup.string().max(256).required(), name: yup.string().max(256).required(), }, 'body'); const entityManager = (0, typeorm_1.getManager)(); const { parentId, recursive, name, slug } = req.body; const { postId } = req.params; const posts = []; try { yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { let parent; if (parentId) { parent = yield transactionManager.findOne(post_model_1.default, { id: parentId, }); if (!parent) throw new bad_request_error_1.default('invalid_parent'); } const sourcePost = yield transactionManager.findOne(post_model_1.default, { relations: ['meta', 'contentType', 'parent'], where: { id: postId, }, }); if (!sourcePost) throw new bad_request_error_1.default('invalid_source'); let children = [sourcePost]; if (recursive) { children = yield transactionManager .getRepository(post_model_1.default) .createQueryBuilder('post') .leftJoinAndSelect('post.contentType', 'contentType') .leftJoinAndSelect('post.meta', 'meta') .leftJoinAndSelect('post.tags', 'tags') .where('post.type IN (:...types)', { types: [ 'folder', 'page', 'fragment', 'post', 'hierarchical_post', ], }) .andWhere(new typeorm_1.Brackets((subQb) => { subQb .where('post.slugPath = :slugPath1', { slugPath1: sourcePost.slugPath, }) .orWhere('post.slugPath LIKE :slugPath2', { slugPath2: `${sourcePost.slugPath}/%`, }); })) .addOrderBy('post.slugPath', 'ASC') .getMany(); } const getSlugPath = (child) => { var _a; const newKey = `${parent ? `${parent === null || parent === void 0 ? void 0 : parent.slugPath}/` : ''}${slug}${child.slugPath.slice(((_a = sourcePost === null || sourcePost === void 0 ? void 0 : sourcePost.slugPath) === null || _a === void 0 ? void 0 : _a.length) || 0)}`; return newKey; }; const getParent = (child, slugPath) => { const components = slugPath.split('/'); components.pop(); return posts.find((post) => post.slugPath === components.join('/')); }; yield children.reduce((promise, child) => __awaiter(void 0, void 0, void 0, function* () { var _k; yield promise; const slugPath = getSlugPath(child); const postObj = { type: child === null || child === void 0 ? void 0 : child.type, name: sourcePost.id === child.id ? name : child === null || child === void 0 ? void 0 : child.name, slug: sourcePost.id === child.id ? slug : child === null || child === void 0 ? void 0 : child.slug, slugPath, contentType: child === null || child === void 0 ? void 0 : child.contentType, meta: (child.meta || []).map((meta) => ({ key: meta === null || meta === void 0 ? void 0 : meta.key, value: meta === null || meta === void 0 ? void 0 : meta.value, })), parent: sourcePost.id === child.id ? parent : getParent(child, slugPath), tags: child.tags, author: (_k = req === null || req === void 0 ? void 0 : req.data) === null || _k === void 0 ? void 0 : _k.user, }; const post = yield transactionManager.save(post_model_1.default, postObj); posts.push(post); }), Promise.resolve()); })); } catch (err) { logger_1.default.error({ type: 'post', message: 'error saving post', data: err.toString(), }); throw new bad_request_error_1.default('duplicate_slug'); } return res.send(posts.map((post) => (0, mappers_1.mapPost)(post))); }))); app.delete('/posts', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _l; const ids = (_l = req === null || req === void 0 ? void 0 : req.body) !== null && _l !== void 0 ? _l : []; if (!ids || (ids === null || ids === void 0 ? void 0 : ids.length) === 0) return res.send([]); const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const deleted = yield postRepository.delete({ id: (0, typeorm_1.In)(ids), }); return res.send(deleted); }))); app.put('/posts/:postId/content', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const entityManager = (0, typeorm_1.getManager)(); let post; try { yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { var _m, _o; const postRepository = transactionManager.getRepository(post_model_1.default); post = yield postRepository.findOne({ relations: [ 'meta', 'contentType', 'author', 'author.meta', 'parent', 'tags', ], where: { id: req.params.postId, }, }); if (!post) throw new bad_request_error_1.default('invalid_post'); yield (0, exports.createPostVersion)(transactionManager.getRepository(post_model_1.default), post, (_m = req === null || req === void 0 ? void 0 : req.data) === null || _m === void 0 ? void 0 : _m.user); const flat = (0, object_1.flatten)(req === null || req === void 0 ? void 0 : req.body); yield (0, orm_helpers_1.updateMeta)(transactionManager, post_model_1.default, post, Object.keys(flat).map((key) => ({ key: `content.${key}`, value: flat[key], })), /^content/); post.author = (_o = req === null || req === void 0 ? void 0 : req.data) === null || _o === void 0 ? void 0 : _o.user; post.updatedAt = new Date(); yield postRepository.save(post); })); } catch (err) { if ((err === null || err === void 0 ? void 0 : err.code) === '23505') { throw new bad_request_error_1.default('duplicate_slug'); } logger_1.default.error({ type: 'post', message: 'error saving post content', data: err.toString(), }); throw err; } res.send((0, mappers_1.mapPostWithMeta)(post)); }))); app.put(`/posts/publish`, (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const { publish, recursive, ids, publishedFrom, publishedUntil, content, saveContent } = req.body; const entityManager = (0, typeorm_1.getManager)(); try { const result = yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { var _p, _q; const postRepository = transactionManager.getRepository(post_model_1.default); const postTreeRepository = transactionManager.getTreeRepository(post_model_1.default); let posts = yield postRepository.findByIds(ids); if (!((posts === null || posts === void 0 ? void 0 : posts.length) > 0)) throw new bad_request_error_1.default('invalid_ids'); if (saveContent && content && (posts === null || posts === void 0 ? void 0 : posts.length) === 1) { const post = yield postRepository.findOne({ relations: [ 'meta', 'contentType', 'author', 'author.meta', 'parent', 'tags', ], where: { id: ids === null || ids === void 0 ? void 0 : ids[0], }, }); yield (0, exports.createPostVersion)(transactionManager.getRepository(post_model_1.default), post, (_p = req === null || req === void 0 ? void 0 : req.data) === null || _p === void 0 ? void 0 : _p.user); const flat = (0, object_1.flatten)(content); yield (0, orm_helpers_1.updateMeta)(transactionManager, post_model_1.default, post, Object.keys(flat).map((key) => ({ key: `content.${key}`, value: flat[key], })), /^content/); post.author = (_q = req === null || req === void 0 ? void 0 : req.data) === null || _q === void 0 ? void 0 : _q.user; post.updatedAt = new Date(); yield postRepository.save(post); } const qb = postRepository.createQueryBuilder('post').update(post_model_1.default); const now = new Date(); if (publish) { qb.set({ publishedAt: now, status: 'published', publishedFrom: publishedFrom || now, publishedUntil: publishedUntil ? (0, date_fns_1.endOfDay)(new Date(publishedUntil)) : null, updatedAt: now, }); } else { qb.set({ publishedAt: null, status: 'draft', publishedFrom: null, publishedUntil: null, updatedAt: now, }); } if (recursive) { const all = []; yield Promise.all(posts.map((post) => __awaiter(void 0, void 0, void 0, function* () { const descendants = yield postTreeRepository.findDescendants(post); descendants.forEach((descendant) => { all.push(descendant); }); }))); qb.where('post.id IN (:...ids)', { ids: all.map((post) => post.id), }); } else { qb.where('post.id IN (:...ids)', { ids: posts.map((post) => post.id), }); } yield qb.execute(); posts = yield postRepository.findByIds(ids); return posts; })); res.send(result); } catch (err) { logger_1.default.error({ type: 'post', message: 'error saving post', data: err.toString(), }); throw err; } }))); app.put('/posts/:postId', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const entityManager = (0, typeorm_1.getManager)(); let post; try { yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { var _r, _s, _t, _u; const postRepository = transactionManager.getRepository(post_model_1.default); const tagRepository = transactionManager.getRepository(tag_model_1.default); post = yield postRepository.findOne({ relations: [ 'meta', 'contentType', 'author', 'author.meta', 'parent', 'tags', ], where: { id: req.params.postId, }, }); if (!post) throw new bad_request_error_1.default('invalid_post'); if ((post === null || post === void 0 ? void 0 : post.type) === 'post_version') throw new bad_request_error_1.default('invalid_post_type'); yield (0, exports.createPostVersion)(transactionManager.getRepository(post_model_1.default), post, (_r = req === null || req === void 0 ? void 0 : req.data) === null || _r === void 0 ? void 0 : _r.user); if (req.body.slug) { const newSlug = req.body.slug; const oldSlugPath = post === null || post === void 0 ? void 0 : post.slugPath; const newSlugPath = post.parent ? `${(_s = post === null || post === void 0 ? void 0 : post.parent) === null || _s === void 0 ? void 0 : _s.slugPath}/${req.body.slug}` : req.body.slug; post.slug = newSlug; post.slugPath = newSlugPath; yield transactionManager.query((0, orm_helpers_1.getReplaceChildrenQuery)('post', 'slugPath', oldSlugPath, newSlugPath)); } if (req.body.name) { post.name = req.body.name; } if (Array.isArray((_t = req === null || req === void 0 ? void 0 : req.body) === null || _t === void 0 ? void 0 : _t.tags)) { const tags = yield tagRepository.find({ where: { id: (0, typeorm_1.In)((_u = req === null || req === void 0 ? void 0 : req.body) === null || _u === void 0 ? void 0 : _u.tags.map((tag) => tag === null || tag === void 0 ? void 0 : tag.id).filter((id) => !!id)), }, }); post.tags = tags; } post.updatedAt = new Date(); yield postRepository.save(post); return post; })); } catch (err) { if ((err === null || err === void 0 ? void 0 : err.code) === '23505') { throw new bad_request_error_1.default('duplicate_slug'); } logger_1.default.error({ type: 'post', message: 'error saving post', data: err.toString(), }); throw err; } res.send((0, mappers_1.mapPost)(post)); }))); app.get('/posts/one', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _v; const slugPath = (_v = req === null || req === void 0 ? void 0 : req.query) === null || _v === void 0 ? void 0 : _v.slugPath; const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const post = yield postRepository.findOne({ where: { slugPath, }, }); if (!post) throw new bad_request_error_1.default('invalid_post'); return res.send((0, mappers_1.mapPostWithMeta)(post)); }))); app.get('/posts/:postId', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const { versionId } = req === null || req === void 0 ? void 0 : req.query; const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const post = yield postRepository.findOne({ relations: ['meta', 'contentType', 'author', 'author.meta', 'tags'], where: { id: req.params.postId, }, }); if (!post) throw new bad_request_error_1.default('invalid_post'); if (versionId) { const postVersion = yield postRepository.findOne({ relations: ['meta', 'contentType', 'author', 'author.meta', 'tags'], where: { id: versionId, parentId: post === null || post === void 0 ? void 0 : post.id, }, }); if (!postVersion) throw new bad_request_error_1.default('invalid_post_version'); return res.send((0, mappers_1.mapPostWithMeta)(Object.assign(Object.assign({}, postVersion), { id: post === null || post === void 0 ? void 0 : post.id, slug: post === null || post === void 0 ? void 0 : post.slug, slugPath: post === null || post === void 0 ? void 0 : post.slugPath, versionId: postVersion === null || postVersion === void 0 ? void 0 : postVersion.id }))); } return res.send((0, mappers_1.mapPostWithMeta)(post)); }))); /** * Restore version */ app.get('/posts/:postId/versions', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const { count } = req === null || req === void 0 ? void 0 : req.query; const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const qb = postRepository .createQueryBuilder('post') .leftJoinAndSelect('post.contentType', 'contentType') .leftJoinAndSelect('post.author', 'author') .leftJoinAndSelect('post.tags', 'tags') .leftJoinAndSelect('author.meta', 'author.meta') .where('post.parentId = :parentId', { parentId: req.params.postId }) .andWhere('post.type = :type', { type: 'post_version' }); if (count) { const number = yield qb.getCount(); return res.send({ count: number, }); } const posts = yield qb.addOrderBy('post.createdAt', 'DESC').getMany(); return res.send(posts.map((post) => (0, mappers_1.mapPostWithMeta)(post))); }))); /** * Restore version */ app.post('/posts/:postId/versions/:versionId', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { const entityManager = (0, typeorm_1.getManager)(); let post; yield entityManager.transaction((transactionManager) => __awaiter(void 0, void 0, void 0, function* () { var _w; const postRepository = transactionManager.getRepository(post_model_1.default); post = yield postRepository .createQueryBuilder('post') .leftJoinAndSelect('post.contentType', 'contentType') .leftJoinAndSelect('post.meta', 'meta') .leftJoinAndSelect('post.tags', 'tags') .where('post.id = :id', { id: req.params.postId }) .getOne(); if (!post) throw new bad_request_error_1.default('invalid_post'); const postVersion = yield postRepository .createQueryBuilder('post') .leftJoinAndSelect('post.contentType', 'contentType') .leftJoinAndSelect('post.meta', 'meta') .leftJoinAndSelect('post.tags', 'tags') .where('post.id = :id', { id: req.params.versionId }) .andWhere('post.parentId = :parentId', { parentId: req.params.postId, }) .andWhere('post.type = :type', { type: 'post_version' }) .getOne(); if (!postVersion) throw new bad_request_error_1.default('invalid_post_version'); yield (0, exports.createPostVersion)(postRepository, post, (_w = req === null || req === void 0 ? void 0 : req.data) === null || _w === void 0 ? void 0 : _w.user); yield (0, orm_helpers_1.updateMeta)(transactionManager, post_model_1.default, post, postVersion === null || postVersion === void 0 ? void 0 : postVersion.meta); post.tags = postVersion.tags; post.content = postVersion.content; post.name = postVersion.name; yield postRepository.save(post); })); res.send((0, mappers_1.mapPostWithMeta)(post)); }))); /** * Delete versions */ app.delete('/posts/:postId/versions', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _x; const ids = (_x = req === null || req === void 0 ? void 0 : req.body) !== null && _x !== void 0 ? _x : []; if (!ids || (ids === null || ids === void 0 ? void 0 : ids.length) === 0) return res.send([]); const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const deleted = yield postRepository.delete({ id: (0, typeorm_1.In)(ids), type: 'post_version', }); return res.send(deleted); }))); app.get('/posts/preview/:postId', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _y, _z, _0; const id = (_y = req === null || req === void 0 ? void 0 : req.params) === null || _y === void 0 ? void 0 : _y.postId; const { versionId } = req === null || req === void 0 ? void 0 : req.query; const postRepository = (0, typeorm_1.getRepository)(post_model_1.default); const settingsRepository = (0, typeorm_1.getRepository)(site_settings_model_1.default); const setHttp = (link) => { if (link.search(/^http[s]?\:\/\//) == -1) { link = `http://${link}`; } return link; }; const where = { id }; const relations = []; if (versionId) { where.id = versionId; relations.push('parent'); } const post = yield postRepository.findOne({ where, relations, }); if (!post) throw new bad_request_error_1.default('invalid_post'); const slugPath = versionId ? (_z = post === null || post === void 0 ? void 0 : post.parent) === null || _z === void 0 ? void 0 : _z.slugPath : post === null || post === void 0 ? void 0 : post.slugPath; const previewSettings = yield settingsRepository.findOne({ where: { key: 'previewEditor', }, }); if (!previewSettings) throw new bad_request_error_1.default('configuration_missing'); let rewrites = []; try { const parsed = JSON.parse(previewSettings === null || previewSettings === void 0 ? void 0 : previewSettings.value); rewrites = parsed === null || parsed === void 0 ? void 0 : parsed.rewrites; } catch (_1) { throw new bad_request_error_1.default('configuration_invalid'); } const src = setHttp((0, post_utility_1.buildPath)(slugPath, rewrites)); const url = new URL(src); const searchParams = url.searchParams; if (!searchParams.get('versionId') && versionId) { searchParams.append('versionId', versionId); } const paramsString = ((_0 = searchParams.toString()) === null || _0 === void 0 ? void 0 : _0.length) > 0 ? `?${searchParams.toString()}` : ''; return res.send({ src: `${url.protocol}//${url.host}${url.pathname}${paramsString}`, }); }))); app.get('/content/*', (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _2, _3, _4, _5, _6; const draft = (0, utility_1.isTrue)((_2 = req === null || req === void 0 ? void 0 : req.query) === null || _2 === void 0 ? void 0 : _2.draft); const versionId = (_3 = req === null || req === void 0 ? void 0 : req.query) === null || _3 === void 0 ? void 0 : _3.versionId; const entityManager = (0, typeorm_1.getManager)(); const contentToken = (0, content_middleware_1.extractContentToken)(req); let relationsDepth; if (((_4 = req === null || req === void 0 ? void 0 : req.query) === null || _4 === void 0 ? void 0 : _4.relationsDepth) && !Number.isNaN(Number((_5 = req === null || req === void 0 ? void 0 : req.query) === null || _5 === void 0 ? void 0 : _5.relationsDepth))) { relationsDepth = Number((_6 = req === null || req === void 0 ? void 0 : req.query) === null || _6 === void 0 ? void 0 : _6.relationsDepth); } // Authorization let authorized; if (draft || versionId) { yield (0, content_middleware_1.verifyContentToken)({ entityManager, token: contentToken, }); authorized = true; } else { const apiAccess = yield entityManager .getRepository(site_settings_model_1.default) .findOne({ where: { key: 'apiAccess', }, }); if ((apiAccess === null || apiAccess === void 0 ? void 0 : apiAccess.value) === 'private') yield (0, content_middleware_1.verifyContentToken)({ token: contentToken, entityManager, }); authorized = true; } const slugPath = req.params[0].replace(/\/$/, ''); const post = yield (0, post_utility_1.retrievePostAndCompile)({ slugPath, versionId: authorized ? versionId : undefined, }, { relationsDepth, draft, query: req.query }); res.send(post); }))); app.post('/posts/compile', (0, auth_middleware_1.default)(), (0, async_middleware_1.default)((req, res) => __awaiter(void 0, void 0, void 0, function* () { var _7; const post = Object.assign(Object.assign({}, (req.body || {})), { meta: [] }); const flat = (0, object_1.flatten)(((_7 = req === null || req === void 0 ? void 0 : req.body) === null || _7 === void 0 ? void 0 : _7.meta) || {}); Object.keys(flat).forEach((key) => { if (!flat[key]) return; post.meta.push({ key, value: flat[key], }); }); post.meta = post.meta.filter((meta) => flat[meta.key]); const compiled = yield (0, post_utility_1.compilePost)(post, { draft: true }); res.send(compiled); }))); exports.default = app;