burdy
Version:
Open Source Headless Platform
762 lines (761 loc) • 36.3 kB
JavaScript
"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;