|
|
|
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)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|