|
@@ -213,23 +213,35 @@ module.exports = class Page extends Model {
|
|
* @returns {Promise} Promise of the Page Model Instance
|
|
* @returns {Promise} Promise of the Page Model Instance
|
|
*/
|
|
*/
|
|
static async createPage(opts) {
|
|
static async createPage(opts) {
|
|
|
|
+ // -> Validate path
|
|
if (opts.path.indexOf('.') >= 0 || opts.path.indexOf(' ') >= 0) {
|
|
if (opts.path.indexOf('.') >= 0 || opts.path.indexOf(' ') >= 0) {
|
|
throw new WIKI.Error.PageIllegalPath()
|
|
throw new WIKI.Error.PageIllegalPath()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // -> Check for page access
|
|
|
|
+ if (!WIKI.auth.checkAccess(opts.user, ['write:pages'], {
|
|
|
|
+ locale: opts.locale,
|
|
|
|
+ path: opts.path
|
|
|
|
+ })) {
|
|
|
|
+ throw new WIKI.Error.PageDeleteForbidden()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Check for duplicate
|
|
const dupCheck = await WIKI.models.pages.query().select('id').where('localeCode', opts.locale).where('path', opts.path).first()
|
|
const dupCheck = await WIKI.models.pages.query().select('id').where('localeCode', opts.locale).where('path', opts.path).first()
|
|
if (dupCheck) {
|
|
if (dupCheck) {
|
|
throw new WIKI.Error.PageDuplicateCreate()
|
|
throw new WIKI.Error.PageDuplicateCreate()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // -> Check for empty content
|
|
if (!opts.content || _.trim(opts.content).length < 1) {
|
|
if (!opts.content || _.trim(opts.content).length < 1) {
|
|
throw new WIKI.Error.PageEmptyContent()
|
|
throw new WIKI.Error.PageEmptyContent()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // -> Create page
|
|
await WIKI.models.pages.query().insert({
|
|
await WIKI.models.pages.query().insert({
|
|
- authorId: opts.authorId,
|
|
|
|
|
|
+ authorId: opts.user.id,
|
|
content: opts.content,
|
|
content: opts.content,
|
|
- creatorId: opts.authorId,
|
|
|
|
|
|
+ creatorId: opts.user.id,
|
|
contentType: _.get(_.find(WIKI.data.editors, ['key', opts.editor]), `contentType`, 'text'),
|
|
contentType: _.get(_.find(WIKI.data.editors, ['key', opts.editor]), `contentType`, 'text'),
|
|
description: opts.description,
|
|
description: opts.description,
|
|
editorKey: opts.editor,
|
|
editorKey: opts.editor,
|
|
@@ -246,7 +258,7 @@ module.exports = class Page extends Model {
|
|
const page = await WIKI.models.pages.getPageFromDb({
|
|
const page = await WIKI.models.pages.getPageFromDb({
|
|
path: opts.path,
|
|
path: opts.path,
|
|
locale: opts.locale,
|
|
locale: opts.locale,
|
|
- userId: opts.authorId,
|
|
|
|
|
|
+ userId: opts.user.id,
|
|
isPrivate: opts.isPrivate
|
|
isPrivate: opts.isPrivate
|
|
})
|
|
})
|
|
|
|
|
|
@@ -288,22 +300,35 @@ module.exports = class Page extends Model {
|
|
* @returns {Promise} Promise of the Page Model Instance
|
|
* @returns {Promise} Promise of the Page Model Instance
|
|
*/
|
|
*/
|
|
static async updatePage(opts) {
|
|
static async updatePage(opts) {
|
|
|
|
+ // -> Fetch original page
|
|
const ogPage = await WIKI.models.pages.query().findById(opts.id)
|
|
const ogPage = await WIKI.models.pages.query().findById(opts.id)
|
|
if (!ogPage) {
|
|
if (!ogPage) {
|
|
throw new Error('Invalid Page Id')
|
|
throw new Error('Invalid Page Id')
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // -> Check for page access
|
|
|
|
+ if (!WIKI.auth.checkAccess(opts.user, ['write:pages'], {
|
|
|
|
+ locale: opts.locale,
|
|
|
|
+ path: opts.path
|
|
|
|
+ })) {
|
|
|
|
+ throw new WIKI.Error.PageUpdateForbidden()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Check for empty content
|
|
if (!opts.content || _.trim(opts.content).length < 1) {
|
|
if (!opts.content || _.trim(opts.content).length < 1) {
|
|
throw new WIKI.Error.PageEmptyContent()
|
|
throw new WIKI.Error.PageEmptyContent()
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ // -> Create version snapshot
|
|
await WIKI.models.pageHistory.addVersion({
|
|
await WIKI.models.pageHistory.addVersion({
|
|
...ogPage,
|
|
...ogPage,
|
|
isPublished: ogPage.isPublished === true || ogPage.isPublished === 1,
|
|
isPublished: ogPage.isPublished === true || ogPage.isPublished === 1,
|
|
action: 'updated'
|
|
action: 'updated'
|
|
})
|
|
})
|
|
|
|
+
|
|
|
|
+ // -> Update page
|
|
await WIKI.models.pages.query().patch({
|
|
await WIKI.models.pages.query().patch({
|
|
- authorId: opts.authorId,
|
|
|
|
|
|
+ authorId: opts.user.id,
|
|
content: opts.content,
|
|
content: opts.content,
|
|
description: opts.description,
|
|
description: opts.description,
|
|
isPublished: opts.isPublished === true || opts.isPublished === 1,
|
|
isPublished: opts.isPublished === true || opts.isPublished === 1,
|
|
@@ -311,7 +336,7 @@ module.exports = class Page extends Model {
|
|
publishStartDate: opts.publishStartDate || '',
|
|
publishStartDate: opts.publishStartDate || '',
|
|
title: opts.title
|
|
title: opts.title
|
|
}).where('id', ogPage.id)
|
|
}).where('id', ogPage.id)
|
|
- const page = await WIKI.models.pages.getPageFromDb({
|
|
|
|
|
|
+ let page = await WIKI.models.pages.getPageFromDb({
|
|
path: ogPage.path,
|
|
path: ogPage.path,
|
|
locale: ogPage.localeCode,
|
|
locale: ogPage.localeCode,
|
|
userId: ogPage.authorId,
|
|
userId: ogPage.authorId,
|
|
@@ -336,9 +361,106 @@ module.exports = class Page extends Model {
|
|
page
|
|
page
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // -> Perform move?
|
|
|
|
+ if (opts.locale !== page.localeCode || opts.path !== page.path) {
|
|
|
|
+ await WIKI.models.pages.movePage({
|
|
|
|
+ id: page.id,
|
|
|
|
+ destinationLocale: opts.locale,
|
|
|
|
+ destinationPath: opts.path,
|
|
|
|
+ user: opts.user
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
return page
|
|
return page
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Move a Page
|
|
|
|
+ *
|
|
|
|
+ * @param {Object} opts Page Properties
|
|
|
|
+ * @returns {Promise} Promise with no value
|
|
|
|
+ */
|
|
|
|
+ static async movePage(opts) {
|
|
|
|
+ const page = await WIKI.models.pages.query().findById(opts.id)
|
|
|
|
+ if (!page) {
|
|
|
|
+ throw new WIKI.Error.PageNotFound()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Check for source page access
|
|
|
|
+ if (!WIKI.auth.checkAccess(opts.user, ['manage:pages'], {
|
|
|
|
+ locale: page.sourceLocale,
|
|
|
|
+ path: page.sourcePath
|
|
|
|
+ })) {
|
|
|
|
+ throw new WIKI.Error.PageMoveForbidden()
|
|
|
|
+ }
|
|
|
|
+ // -> Check for destination page access
|
|
|
|
+ if (!WIKI.auth.checkAccess(opts.user, ['write:pages'], {
|
|
|
|
+ locale: opts.destinationLocale,
|
|
|
|
+ path: opts.destinationPath
|
|
|
|
+ })) {
|
|
|
|
+ throw new WIKI.Error.PageMoveForbidden()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Check for existing page at destination path
|
|
|
|
+ const destPage = await await WIKI.models.pages.query().findOne({
|
|
|
|
+ path: opts.destinationPath,
|
|
|
|
+ localeCode: opts.destinationLocale
|
|
|
|
+ })
|
|
|
|
+ if (destPage) {
|
|
|
|
+ throw new WIKI.Error.PagePathCollision()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Create version snapshot
|
|
|
|
+ await WIKI.models.pageHistory.addVersion({
|
|
|
|
+ ...page,
|
|
|
|
+ action: 'moved'
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ const destinationHash = pageHelper.generateHash({ path: opts.destinationPath, locale: opts.destinationLocale, privateNS: opts.isPrivate ? 'TODO' : '' })
|
|
|
|
+
|
|
|
|
+ // -> Move page
|
|
|
|
+ await WIKI.models.pages.query().patch({
|
|
|
|
+ path: opts.destinationPath,
|
|
|
|
+ localeCode: opts.destinationLocale,
|
|
|
|
+ hash: destinationHash
|
|
|
|
+ }).findById(page.id)
|
|
|
|
+ await WIKI.models.pages.deletePageFromCache(page)
|
|
|
|
+
|
|
|
|
+ // -> Rename in Search Index
|
|
|
|
+ await WIKI.data.searchEngine.renamed({
|
|
|
|
+ ...page,
|
|
|
|
+ destinationPath: opts.destinationPath,
|
|
|
|
+ destinationLocaleCode: opts.destinationLocale,
|
|
|
|
+ destinationHash
|
|
|
|
+ })
|
|
|
|
+
|
|
|
|
+ // -> Rename in Storage
|
|
|
|
+ if (!opts.skipStorage) {
|
|
|
|
+ await WIKI.models.storage.pageEvent({
|
|
|
|
+ event: 'renamed',
|
|
|
|
+ page: {
|
|
|
|
+ ...page,
|
|
|
|
+ destinationPath: opts.destinationPath,
|
|
|
|
+ destinationLocaleCode: opts.destinationLocale,
|
|
|
|
+ destinationHash,
|
|
|
|
+ moveAuthorId: opts.user.id,
|
|
|
|
+ moveAuthorName: opts.user.name,
|
|
|
|
+ moveAuthorEmail: opts.user.email
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Reconnect Links
|
|
|
|
+ await WIKI.models.pages.reconnectLinks({
|
|
|
|
+ sourceLocale: page.localeCode,
|
|
|
|
+ sourcePath: page.path,
|
|
|
|
+ locale: opts.destinationLocale,
|
|
|
|
+ path: opts.destinationPath,
|
|
|
|
+ mode: 'move'
|
|
|
|
+ })
|
|
|
|
+ }
|
|
|
|
+
|
|
/**
|
|
/**
|
|
* Delete an Existing Page
|
|
* Delete an Existing Page
|
|
*
|
|
*
|
|
@@ -358,10 +480,22 @@ module.exports = class Page extends Model {
|
|
if (!page) {
|
|
if (!page) {
|
|
throw new Error('Invalid Page Id')
|
|
throw new Error('Invalid Page Id')
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ // -> Check for page access
|
|
|
|
+ if (!WIKI.auth.checkAccess(opts.user, ['delete:pages'], {
|
|
|
|
+ locale: page.locale,
|
|
|
|
+ path: page.path
|
|
|
|
+ })) {
|
|
|
|
+ throw new WIKI.Error.PageDeleteForbidden()
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // -> Create version snapshot
|
|
await WIKI.models.pageHistory.addVersion({
|
|
await WIKI.models.pageHistory.addVersion({
|
|
...page,
|
|
...page,
|
|
action: 'deleted'
|
|
action: 'deleted'
|
|
})
|
|
})
|
|
|
|
+
|
|
|
|
+ // -> Delete page
|
|
await WIKI.models.pages.query().delete().where('id', page.id)
|
|
await WIKI.models.pages.query().delete().where('id', page.id)
|
|
await WIKI.models.pages.deletePageFromCache(page)
|
|
await WIKI.models.pages.deletePageFromCache(page)
|
|
|
|
|