123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- import { generateError, generateSuccess } from '../../helpers/graph.mjs'
- import { isNil } from 'lodash-es'
- export default {
- Query: {
- async navigationById (obj, args, context, info) {
- return WIKI.db.navigation.getNav({ id: args.id, cache: true, userGroups: context.req.user?.groups })
- }
- },
- Mutation: {
- async updateNavigation (obj, args, context) {
- try {
- let updateInherited = false
- let updateInheritedNavId = null
- let updateNavId = null
- let ancestorNavId = null
- const treeEntry = await WIKI.db.knex('tree').where('id', args.pageId).first()
- if (!treeEntry) {
- throw new Error('Invalid ID')
- }
- const currentNavId = treeEntry.folderPath === '' && treeEntry.fileName === 'home' ? treeEntry.siteId : treeEntry.id
- const treeEntryPath = treeEntry.folderPath ? `${treeEntry.folderPath}.${treeEntry.fileName}` : treeEntry.fileName
- // -> Create / Update Nav Menu Items
- if (!isNil(args.items)) {
- await WIKI.db.knex('navigation').insert({
- id: currentNavId,
- items: JSON.stringify(args.items),
- siteId: treeEntry.siteId
- }).onConflict('id').merge({
- items: JSON.stringify(args.items)
- })
- }
- // -> Find ancestor nav ID
- const ancNavResult = await WIKI.db.knex.raw(`
- SELECT "navigationId", "navigationMode", nlevel("folderPath" || "fileName") AS levels
- FROM tree
- WHERE ("folderPath" || "fileName") @> :currentPath
- AND "navigationMode" IN ('override', 'hide')
- ORDER BY levels DESC
- LIMIT 1
- `, {
- currentPath: treeEntry.folderPath
- })
- if (ancNavResult.rowCount > 0) {
- ancestorNavId = ancNavResult.rows[0]?.navigationId
- } else {
- ancestorNavId = treeEntry.siteId
- }
- // -> Update mode
- switch (args.mode) {
- case 'inherit': {
- updateNavId = ancestorNavId
- if (['override', 'hide'].includes(treeEntry.navigationMode)) {
- updateInherited = true
- updateInheritedNavId = ancestorNavId
- }
- break
- }
- case 'override': {
- updateNavId = treeEntry.id
- updateInherited = true
- updateInheritedNavId = treeEntry.id
- break
- }
- case 'overrideExact': {
- updateNavId = treeEntry.id
- if (['override', 'hide'].includes(treeEntry.navigationMode)) {
- updateInherited = true
- updateInheritedNavId = ancestorNavId
- }
- break
- }
- case 'hide': {
- updateInherited = true
- updateNavId = null
- break
- }
- case 'hideExact': {
- updateNavId = null
- if (['override', 'hide'].includes(treeEntry.navigationMode)) {
- updateInherited = true
- updateInheritedNavId = ancestorNavId
- }
- break
- }
- }
- // -> Set for current path
- await WIKI.db.knex('tree').where('id', treeEntry.id).update({ navigationMode: args.mode, navigationId: updateNavId })
- // -> Update nodes that inherit from current
- if (updateInherited) {
- await WIKI.db.knex.raw(`
- UPDATE tree tt
- SET "navigationId" = :navId
- WHERE type IN ('page', 'folder')
- AND "folderPath" <@ :overridePath
- AND "navigationMode" = 'inherit'
- AND NOT EXISTS (
- SELECT 1
- FROM tree tc
- WHERE type IN ('page', 'folder')
- AND tc."folderPath" <@ :overridePath
- AND tc."folderPath" @> tt."folderPath"
- AND tc."navigationMode" IN ('override', 'hide')
- )
- `, {
- navId: updateInheritedNavId,
- overridePath: treeEntryPath
- })
- }
- // for (const tree of args.tree) {
- // await WIKI.cache.set(`nav:sidebar:${tree.locale}`, tree.items, 300)
- // }
- return {
- operation: generateSuccess('Navigation updated successfully'),
- navigationMode: args.mode,
- navigationId: updateNavId
- }
- } catch (err) {
- return generateError(err)
- }
- }
- }
- }
|