feat: page links table

This commit is contained in:
Nick 2019-09-02 22:18:59 -04:00
parent ab463fcae1
commit 33e31a9901
7 changed files with 93 additions and 21 deletions

View File

@ -63,7 +63,7 @@ exports.up = knex => {
}) })
// LOCALES ----------------------------- // LOCALES -----------------------------
.createTable('locales', table => { .createTable('locales', table => {
table.string('code', 2).notNullable().primary() table.string('code', 5).notNullable().primary()
table.json('strings') table.json('strings')
table.boolean('isRTL').notNullable().defaultTo(false) table.boolean('isRTL').notNullable().defaultTo(false)
table.string('name').notNullable() table.string('name').notNullable()
@ -100,7 +100,7 @@ exports.up = knex => {
table.integer('pageId').unsigned().references('id').inTable('pages') table.integer('pageId').unsigned().references('id').inTable('pages')
table.string('editorKey').references('key').inTable('editors') 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('authorId').unsigned().references('id').inTable('users')
}) })
// PAGES ------------------------------- // PAGES -------------------------------
@ -123,7 +123,7 @@ exports.up = knex => {
table.string('updatedAt').notNullable() table.string('updatedAt').notNullable()
table.string('editorKey').references('key').inTable('editors') 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('authorId').unsigned().references('id').inTable('users')
table.integer('creatorId').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('parent').unsigned().references('id').inTable('pageTree')
table.integer('pageId').unsigned().references('id').inTable('pages') 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 --------------------------- // RENDERERS ---------------------------
.createTable('renderers', table => { .createTable('renderers', table => {
@ -204,7 +204,7 @@ exports.up = knex => {
table.string('updatedAt').notNullable() table.string('updatedAt').notNullable()
table.string('providerKey').references('key').inTable('authentication').notNullable().defaultTo('local') 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') table.string('defaultEditor').references('key').inTable('editors').notNullable().defaultTo('markdown')
}) })
// ===================================== // =====================================

View File

@ -18,7 +18,7 @@ exports.up = knex => {
table.integer('pageId').unsigned() table.integer('pageId').unsigned()
table.string('editorKey').references('key').inTable('editors') 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('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;`) .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.integer('pageId').unsigned().references('id').inTable('pages')
table.string('editorKey').references('key').inTable('editors') 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('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;') .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;')

View File

@ -2,8 +2,12 @@ exports.up = knex => {
return knex.schema return knex.schema
.createTable('pageLinks', table => { .createTable('pageLinks', table => {
table.increments('id').primary() table.increments('id').primary()
table.integer('sourcePageId').unsigned().references('id').inTable('pages').onDelete('CASCADE') table.integer('pageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
table.integer('targetPageId').unsigned().references('id').inTable('pages').onDelete('CASCADE') table.string('path').notNullable()
table.string('localeCode', 5).notNullable()
})
.table('pageLinks', table => {
table.index(['path', 'localeCode'])
}) })
} }

View File

@ -8,8 +8,12 @@ exports.up = knex => {
.createTable('pageLinks', table => { .createTable('pageLinks', table => {
if (dbCompat.charset) { table.charset('utf8mb4') } if (dbCompat.charset) { table.charset('utf8mb4') }
table.increments('id').primary() table.increments('id').primary()
table.integer('sourcePageId').unsigned().references('id').inTable('pages').onDelete('CASCADE') table.integer('pageId').unsigned().references('id').inTable('pages').onDelete('CASCADE')
table.integer('targetPageId').unsigned().references('id').inTable('pages').onDelete('CASCADE') table.string('path').notNullable()
table.string('localeCode', 5).notNullable()
})
.table('pageLinks', table => {
table.index(['path', 'localeCode'])
}) })
} }

View 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'
}
}
}
}
}

View File

@ -64,15 +64,11 @@ module.exports = class Page extends Model {
} }
}, },
links: { links: {
relation: Model.ManyToManyRelation, relation: Model.HasManyRelation,
modelClass: Page, modelClass: require('./pageLinks'),
join: { join: {
from: 'pages.id', from: 'pages.id',
through: { to: 'pageLinks.pageId'
from: 'pageLinks.sourcePageId',
to: 'pageLinks.targetPageId'
},
to: 'pages.id'
} }
}, },
author: { author: {

View File

@ -31,8 +31,8 @@ module.exports = {
$('a').each((i, elm) => { $('a').each((i, elm) => {
let href = $(elm).attr('href') let href = $(elm).attr('href')
// -> Ignore empty links // -> Ignore empty / anchor links
if (!href || href.length < 1) { if (!href || href.length < 1 || href.indexOf('#') === 0) {
return return
} }
@ -79,9 +79,11 @@ module.exports = {
// Detect internal link states // Detect internal link states
// -------------------------------- // --------------------------------
const pastLinks = await this.page.$relatedQuery('links')
if (internalRefs.length > 0) { if (internalRefs.length > 0) {
// -> Find matching pages // -> 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) => { internalRefs.forEach((ref, idx) => {
if (idx < 1) { if (idx < 1) {
builder.where(ref) builder.where(ref)
@ -106,6 +108,38 @@ module.exports = {
$(elm).addClass(`is-invalid-page`) $(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>', '') return $.html('body').replace('<body>', '').replace('</body>', '')