const _ = require('lodash') /* global WIKI */ module.exports = async (pageId) => { WIKI.logger.info(`Rebuilding page tree...`) try { WIKI.models = require('../core/db').init() await WIKI.configSvc.loadFromDb() await WIKI.configSvc.applyFlags() const pages = await WIKI.models.pages.query().select('id', 'path', 'localeCode', 'title', 'isPrivate', 'privateNS').orderBy(['localeCode', 'path']) let tree = [] let pik = 0 for (const page of pages) { const pagePaths = page.path.split('/') let currentPath = '' let depth = 0 let parentId = null for (const part of pagePaths) { depth++ const isFolder = (depth < pagePaths.length) currentPath = currentPath ? `${currentPath}/${part}` : part const found = _.find(tree, { localeCode: page.localeCode, path: currentPath }) if (!found) { pik++ tree.push({ id: pik, localeCode: page.localeCode, path: currentPath, depth: depth, title: isFolder ? part : page.title, isFolder: isFolder, isPrivate: !isFolder && page.isPrivate, privateNS: !isFolder ? page.privateNS : null, parent: parentId, pageId: isFolder ? null : page.id }) parentId = pik } else if (isFolder && !found.isFolder) { found.isFolder = true parentId = found.id } else { parentId = found.id } } } await WIKI.models.knex.table('pageTree').truncate() if (tree.length > 0) { const { bindings, sql } = WIKI.models.knex.table('pageTree').insert(tree).toSQL(); if (WIKI.config.db.type === 'mssql') { await WIKI.models.knex.raw(sql, bindings).wrap( 'SET IDENTITY_INSERT pageTree ON;', 'SET IDENTITY_INSERT pageTree OFF;', ) } else { await WIKI.models.knex.raw(sql, bindings) } // await WIKI.models.knex.table('pageTree').insert(tree) } await WIKI.models.knex.destroy() WIKI.logger.info(`Rebuilding page tree: [ COMPLETED ]`) } catch (err) { WIKI.logger.error(`Rebuilding page tree: [ FAILED ]`) WIKI.logger.error(err.message) } }