feat: tags on page fetch + pageLinks table schema
This commit is contained in:
		| @@ -77,11 +77,11 @@ | |||||||
|                   label |                   label | ||||||
|                   color='teal lighten-5' |                   color='teal lighten-5' | ||||||
|                   v-for='(tag, idx) in tags' |                   v-for='(tag, idx) in tags' | ||||||
|                   :href='`/t/` + tag.slug' |                   :href='`/t/` + tag.tag' | ||||||
|                   :key='tag.slug' |                   :key='tag.tag' | ||||||
|                   ) |                   ) | ||||||
|                   v-icon(color='teal', left, small) mdi-label |                   v-icon(color='teal', left, small) mdi-label | ||||||
|                   span.teal--text.text--darken-2 {{tag.text}} |                   span.teal--text.text--darken-2 {{tag.title}} | ||||||
|  |  | ||||||
|             v-card.mb-5 |             v-card.mb-5 | ||||||
|               .pa-5 |               .pa-5 | ||||||
|   | |||||||
							
								
								
									
										13
									
								
								server/db/migrations-sqlite/2.0.0-beta.293.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								server/db/migrations-sqlite/2.0.0-beta.293.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | 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') | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | exports.down = knex => { | ||||||
|  |   return knex.schema | ||||||
|  |     .dropTableIfExists('pageLinks') | ||||||
|  | } | ||||||
							
								
								
									
										19
									
								
								server/db/migrations/2.0.0-beta.293.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								server/db/migrations/2.0.0-beta.293.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | |||||||
|  | /* global WIKI */ | ||||||
|  |  | ||||||
|  | exports.up = knex => { | ||||||
|  |   const dbCompat = { | ||||||
|  |     charset: (WIKI.config.db.type === `mysql` || WIKI.config.db.type === `mariadb`) | ||||||
|  |   } | ||||||
|  |   return knex.schema | ||||||
|  |     .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') | ||||||
|  |     }) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | exports.down = knex => { | ||||||
|  |   return knex.schema | ||||||
|  |     .dropTableIfExists('pageLinks') | ||||||
|  | } | ||||||
| @@ -63,6 +63,18 @@ module.exports = class Page extends Model { | |||||||
|           to: 'tags.id' |           to: 'tags.id' | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|  |       links: { | ||||||
|  |         relation: Model.ManyToManyRelation, | ||||||
|  |         modelClass: Page, | ||||||
|  |         join: { | ||||||
|  |           from: 'pages.id', | ||||||
|  |           through: { | ||||||
|  |             from: 'pageLinks.sourcePageId', | ||||||
|  |             to: 'pageLinks.targetPageId' | ||||||
|  |           }, | ||||||
|  |           to: 'pages.id' | ||||||
|  |         } | ||||||
|  |       }, | ||||||
|       author: { |       author: { | ||||||
|         relation: Model.BelongsToOneRelation, |         relation: Model.BelongsToOneRelation, | ||||||
|         modelClass: require('./users'), |         modelClass: require('./users'), | ||||||
| @@ -120,6 +132,12 @@ module.exports = class Page extends Model { | |||||||
|       publishEndDate: 'string', |       publishEndDate: 'string', | ||||||
|       publishStartDate: 'string', |       publishStartDate: 'string', | ||||||
|       render: 'string', |       render: 'string', | ||||||
|  |       tags: [ | ||||||
|  |         { | ||||||
|  |           tag: 'string', | ||||||
|  |           title: 'string' | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|       title: 'string', |       title: 'string', | ||||||
|       toc: 'string', |       toc: 'string', | ||||||
|       updatedAt: 'string' |       updatedAt: 'string' | ||||||
| @@ -349,6 +367,7 @@ module.exports = class Page extends Model { | |||||||
|  |  | ||||||
|   static async getPageFromDb(opts) { |   static async getPageFromDb(opts) { | ||||||
|     const queryModeID = _.isNumber(opts) |     const queryModeID = _.isNumber(opts) | ||||||
|  |     try { | ||||||
|       return WIKI.models.pages.query() |       return WIKI.models.pages.query() | ||||||
|         .column([ |         .column([ | ||||||
|           'pages.*', |           'pages.*', | ||||||
| @@ -361,6 +380,12 @@ module.exports = class Page extends Model { | |||||||
|         ]) |         ]) | ||||||
|         .joinRelation('author') |         .joinRelation('author') | ||||||
|         .joinRelation('creator') |         .joinRelation('creator') | ||||||
|  |         .eagerAlgorithm(Model.JoinEagerAlgorithm) | ||||||
|  |         .eager('tags(selectTags)', { | ||||||
|  |           selectTags: builder => { | ||||||
|  |             builder.select('tag', 'title') | ||||||
|  |           } | ||||||
|  |         }) | ||||||
|         .where(queryModeID ? { |         .where(queryModeID ? { | ||||||
|           'pages.id': opts |           'pages.id': opts | ||||||
|         } : { |         } : { | ||||||
| @@ -385,6 +410,10 @@ module.exports = class Page extends Model { | |||||||
|         //   } |         //   } | ||||||
|         // }) |         // }) | ||||||
|         .first() |         .first() | ||||||
|  |     } catch (err) { | ||||||
|  |       WIKI.logger.warn(err) | ||||||
|  |       throw err | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   static async savePageToCache(page) { |   static async savePageToCache(page) { | ||||||
| @@ -402,6 +431,7 @@ module.exports = class Page extends Model { | |||||||
|       publishEndDate: page.publishEndDate, |       publishEndDate: page.publishEndDate, | ||||||
|       publishStartDate: page.publishStartDate, |       publishStartDate: page.publishStartDate, | ||||||
|       render: page.render, |       render: page.render, | ||||||
|  |       tags: page.tags.map(t => _.pick(t, ['tag', 'title'])), | ||||||
|       title: page.title, |       title: page.title, | ||||||
|       toc: _.isString(page.toc) ? page.toc : JSON.stringify(page.toc), |       toc: _.isString(page.toc) ? page.toc : JSON.stringify(page.toc), | ||||||
|       updatedAt: page.updatedAt |       updatedAt: page.updatedAt | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ block body | |||||||
|       path=page.path |       path=page.path | ||||||
|       title=page.title |       title=page.title | ||||||
|       description=page.description |       description=page.description | ||||||
|       tags=page.tags |       :tags=page.tags | ||||||
|       created-at=page.createdAt |       created-at=page.createdAt | ||||||
|       updated-at=page.updatedAt |       updated-at=page.updatedAt | ||||||
|       author-name=page.authorName |       author-name=page.authorName | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user