feat: page links table
This commit is contained in:
parent
ab463fcae1
commit
33e31a9901
@ -63,7 +63,7 @@ exports.up = knex => {
|
||||
})
|
||||
// LOCALES -----------------------------
|
||||
.createTable('locales', table => {
|
||||
table.string('code', 2).notNullable().primary()
|
||||
table.string('code', 5).notNullable().primary()
|
||||
table.json('strings')
|
||||
table.boolean('isRTL').notNullable().defaultTo(false)
|
||||
table.string('name').notNullable()
|
||||
@ -100,7 +100,7 @@ exports.up = knex => {
|
||||
|
||||
table.integer('pageId').unsigned().references('id').inTable('pages')
|
||||
table.string('editorKey').references('key').inTable('editors')
|
||||
table.string('localeCode', 2).references('code').inTable('locales')
|
||||
table.string('localeCode', 5).references('code').inTable('locales')
|
||||
table.integer('authorId').unsigned().references('id').inTable('users')
|
||||
})
|
||||
// PAGES -------------------------------
|
||||
@ -123,7 +123,7 @@ exports.up = knex => {
|
||||
table.string('updatedAt').notNullable()
|
||||
|
||||
table.string('editorKey').references('key').inTable('editors')
|
||||
table.string('localeCode', 2).references('code').inTable('locales')
|
||||
table.string('localeCode', 5).references('code').inTable('locales')
|
||||
table.integer('authorId').unsigned().references('id').inTable('users')
|
||||
table.integer('creatorId').unsigned().references('id').inTable('users')
|
||||
})
|
||||
@ -139,7 +139,7 @@ exports.up = knex => {
|
||||
|
||||
table.integer('parent').unsigned().references('id').inTable('pageTree')
|
||||
table.integer('pageId').unsigned().references('id').inTable('pages')
|
||||
table.string('localeCode', 2).references('code').inTable('locales')
|
||||
table.string('localeCode', 5).references('code').inTable('locales')
|
||||
})
|
||||
// RENDERERS ---------------------------
|
||||
.createTable('renderers', table => {
|
||||
@ -204,7 +204,7 @@ exports.up = knex => {
|
||||
table.string('updatedAt').notNullable()
|
||||
|
||||
table.string('providerKey').references('key').inTable('authentication').notNullable().defaultTo('local')
|
||||
table.string('localeCode', 2).references('code').inTable('locales').notNullable().defaultTo('en')
|
||||
table.string('localeCode', 5).references('code').inTable('locales').notNullable().defaultTo('en')
|
||||
table.string('defaultEditor').references('key').inTable('editors').notNullable().defaultTo('markdown')
|
||||
})
|
||||
// =====================================
|
||||
|
@ -18,7 +18,7 @@ exports.up = knex => {
|
||||
|
||||
table.integer('pageId').unsigned()
|
||||
table.string('editorKey').references('key').inTable('editors')
|
||||
table.string('localeCode', 2).references('code').inTable('locales')
|
||||
table.string('localeCode', 5).references('code').inTable('locales')
|
||||
table.integer('authorId').unsigned().references('id').inTable('users')
|
||||
})
|
||||
.raw(`INSERT INTO pageHistory SELECT id,path,hash,title,description,isPrivate,isPublished,publishStartDate,publishEndDate,content,contentType,createdAt,'updated' AS action,pageId,editorKey,localeCode,authorId FROM pageHistory_old;`)
|
||||
@ -44,7 +44,7 @@ exports.down = knex => {
|
||||
|
||||
table.integer('pageId').unsigned().references('id').inTable('pages')
|
||||
table.string('editorKey').references('key').inTable('editors')
|
||||
table.string('localeCode', 2).references('code').inTable('locales')
|
||||
table.string('localeCode', 5).references('code').inTable('locales')
|
||||
table.integer('authorId').unsigned().references('id').inTable('users')
|
||||
})
|
||||
.raw('INSERT INTO pageHistory SELECT id,path,hash,title,description,isPrivate,isPublished,publishStartDate,publishEndDate,content,contentType,createdAt,NULL as pageId,editorKey,localeCode,authorId FROM pageHistory_old;')
|
||||
|
@ -2,8 +2,12 @@ exports.up = knex => {
|
||||
return knex.schema
|
||||
.createTable('pageLinks', table => {
|
||||
table.increments('id').primary()
|
||||
table.integer('sourcePageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.integer('targetPageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.integer('pageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.string('path').notNullable()
|
||||
table.string('localeCode', 5).notNullable()
|
||||
})
|
||||
.table('pageLinks', table => {
|
||||
table.index(['path', 'localeCode'])
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -8,8 +8,12 @@ exports.up = knex => {
|
||||
.createTable('pageLinks', table => {
|
||||
if (dbCompat.charset) { table.charset('utf8mb4') }
|
||||
table.increments('id').primary()
|
||||
table.integer('sourcePageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.integer('targetPageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.integer('pageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
|
||||
table.string('path').notNullable()
|
||||
table.string('localeCode', 5).notNullable()
|
||||
})
|
||||
.table('pageLinks', table => {
|
||||
table.index(['path', 'localeCode'])
|
||||
})
|
||||
}
|
||||
|
||||
|
34
server/models/pageLinks.js
Normal file
34
server/models/pageLinks.js
Normal file
@ -0,0 +1,34 @@
|
||||
const Model = require('objection').Model
|
||||
|
||||
/**
|
||||
* Users model
|
||||
*/
|
||||
module.exports = class PageLink extends Model {
|
||||
static get tableName() { return 'pageLinks' }
|
||||
|
||||
static get jsonSchema () {
|
||||
return {
|
||||
type: 'object',
|
||||
required: ['path', 'localeCode'],
|
||||
|
||||
properties: {
|
||||
id: {type: 'integer'},
|
||||
path: {type: 'string'},
|
||||
localeCode: {type: 'string'}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static get relationMappings() {
|
||||
return {
|
||||
page: {
|
||||
relation: Model.BelongsToOneRelation,
|
||||
modelClass: require('./pages'),
|
||||
join: {
|
||||
from: 'pageLinks.pageId',
|
||||
to: 'pages.id'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -64,15 +64,11 @@ module.exports = class Page extends Model {
|
||||
}
|
||||
},
|
||||
links: {
|
||||
relation: Model.ManyToManyRelation,
|
||||
modelClass: Page,
|
||||
relation: Model.HasManyRelation,
|
||||
modelClass: require('./pageLinks'),
|
||||
join: {
|
||||
from: 'pages.id',
|
||||
through: {
|
||||
from: 'pageLinks.sourcePageId',
|
||||
to: 'pageLinks.targetPageId'
|
||||
},
|
||||
to: 'pages.id'
|
||||
to: 'pageLinks.pageId'
|
||||
}
|
||||
},
|
||||
author: {
|
||||
|
@ -31,8 +31,8 @@ module.exports = {
|
||||
$('a').each((i, elm) => {
|
||||
let href = $(elm).attr('href')
|
||||
|
||||
// -> Ignore empty links
|
||||
if (!href || href.length < 1) {
|
||||
// -> Ignore empty / anchor links
|
||||
if (!href || href.length < 1 || href.indexOf('#') === 0) {
|
||||
return
|
||||
}
|
||||
|
||||
@ -79,9 +79,11 @@ module.exports = {
|
||||
// Detect internal link states
|
||||
// --------------------------------
|
||||
|
||||
const pastLinks = await this.page.$relatedQuery('links')
|
||||
|
||||
if (internalRefs.length > 0) {
|
||||
// -> Find matching pages
|
||||
const results = await WIKI.models.pages.query().column('path', 'localeCode').where(builder => {
|
||||
const results = await WIKI.models.pages.query().column('id', 'path', 'localeCode').where(builder => {
|
||||
internalRefs.forEach((ref, idx) => {
|
||||
if (idx < 1) {
|
||||
builder.where(ref)
|
||||
@ -106,6 +108,38 @@ module.exports = {
|
||||
$(elm).addClass(`is-invalid-page`)
|
||||
}
|
||||
})
|
||||
|
||||
// -> Add missing links
|
||||
const missingLinks = _.differenceWith(internalRefs, pastLinks, (nLink, pLink) => {
|
||||
return nLink.localeCode === pLink.localeCode && nLink.path === pLink.path
|
||||
})
|
||||
if (missingLinks.length > 0) {
|
||||
if (WIKI.config.db.type === 'postgres') {
|
||||
await WIKI.models.pageLinks.query().insert(missingLinks.map(lnk => ({
|
||||
pageId: this.page.id,
|
||||
path: lnk.path,
|
||||
localeCode: lnk.localeCode
|
||||
})))
|
||||
} else {
|
||||
for (const lnk of missingLinks) {
|
||||
await WIKI.models.pageLinks.query().insert({
|
||||
pageId: this.page.id,
|
||||
path: lnk.path,
|
||||
localeCode: lnk.localeCode
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -> Remove outdated links
|
||||
if (pastLinks) {
|
||||
const outdatedLinks = _.differenceWith(pastLinks, internalRefs, (nLink, pLink) => {
|
||||
return nLink.localeCode === pLink.localeCode && nLink.path === pLink.path
|
||||
})
|
||||
if (outdatedLinks.length > 0) {
|
||||
await WIKI.models.pageLinks.query().delete().whereIn('id', _.map(outdatedLinks, 'id'))
|
||||
}
|
||||
}
|
||||
|
||||
return $.html('body').replace('<body>', '').replace('</body>', '')
|
||||
|
Loading…
Reference in New Issue
Block a user