page.js 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. const _ = require('lodash')
  2. const graphHelper = require('../../helpers/graph')
  3. /* global WIKI */
  4. module.exports = {
  5. Query: {
  6. async pages() { return {} }
  7. },
  8. Mutation: {
  9. async pages() { return {} }
  10. },
  11. PageQuery: {
  12. /**
  13. * PAGE HISTORY
  14. */
  15. async history(obj, args, context, info) {
  16. return WIKI.models.pageHistory.getHistory({
  17. pageId: args.id,
  18. offsetPage: args.offsetPage || 0,
  19. offsetSize: args.offsetSize || 100
  20. })
  21. },
  22. /**
  23. * SEARCH PAGES
  24. */
  25. async search (obj, args, context) {
  26. if (WIKI.data.searchEngine) {
  27. const resp = await WIKI.data.searchEngine.query(args.query, args)
  28. return {
  29. ...resp,
  30. results: _.filter(resp.results, r => {
  31. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  32. path: r.path,
  33. locale: r.locale
  34. })
  35. })
  36. }
  37. } else {
  38. return {
  39. results: [],
  40. suggestions: [],
  41. totalHits: 0
  42. }
  43. }
  44. },
  45. /**
  46. * LIST PAGES
  47. */
  48. async list (obj, args, context, info) {
  49. let results = await WIKI.models.pages.query().column([
  50. 'pages.id',
  51. 'path',
  52. { locale: 'localeCode' },
  53. 'title',
  54. 'description',
  55. 'isPublished',
  56. 'isPrivate',
  57. 'privateNS',
  58. 'contentType',
  59. 'createdAt',
  60. 'updatedAt'
  61. ])
  62. .eagerAlgorithm(WIKI.models.Objection.Model.JoinEagerAlgorithm)
  63. .eager('tags(selectTags)', {
  64. selectTags: builder => {
  65. builder.select('tag')
  66. }
  67. })
  68. .modify(queryBuilder => {
  69. if (args.limit) {
  70. queryBuilder.limit(args.limit)
  71. }
  72. if (args.locale) {
  73. queryBuilder.where('localeCode', args.locale)
  74. }
  75. if (args.tags && args.tags.length > 0) {
  76. queryBuilder.whereIn('tags.tag', args.tags)
  77. }
  78. const orderDir = args.orderByDirection === 'DESC' ? 'desc' : 'asc'
  79. switch (args.orderBy) {
  80. case 'CREATED':
  81. queryBuilder.orderBy('createdAt', orderDir)
  82. break
  83. case 'PATH':
  84. queryBuilder.orderBy('path', orderDir)
  85. break
  86. case 'TITLE':
  87. queryBuilder.orderBy('title', orderDir)
  88. break
  89. case 'UPDATED':
  90. queryBuilder.orderBy('updatedAt', orderDir)
  91. break
  92. default:
  93. queryBuilder.orderBy('pages.id', orderDir)
  94. break
  95. }
  96. })
  97. results = _.filter(results, r => {
  98. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  99. path: r.path,
  100. locale: r.locale
  101. })
  102. }).map(r => ({
  103. ...r,
  104. tags: _.map(r.tags, 'tag')
  105. }))
  106. if (args.tags && args.tags.length > 0) {
  107. results = _.filter(results, r => _.every(args.tags, t => _.includes(r.tags, t)))
  108. }
  109. return results
  110. },
  111. /**
  112. * FETCH SINGLE PAGE
  113. */
  114. async single (obj, args, context, info) {
  115. let page = await WIKI.models.pages.getPageFromDb(args.id)
  116. if (page) {
  117. return {
  118. ...page,
  119. locale: page.localeCode,
  120. editor: page.editorKey
  121. }
  122. } else {
  123. throw new WIKI.Error.PageNotFound()
  124. }
  125. },
  126. /**
  127. * FETCH TAGS
  128. */
  129. async tags (obj, args, context, info) {
  130. return WIKI.models.tags.query().orderBy('tag', 'asc')
  131. },
  132. /**
  133. * FETCH PAGE TREE
  134. */
  135. async tree (obj, args, context, info) {
  136. let results = []
  137. let conds = {
  138. localeCode: args.locale
  139. }
  140. if (args.parent) {
  141. conds.parent = (args.parent < 1) ? null : args.parent
  142. } else if (args.path) {
  143. // conds.parent = (args.parent < 1) ? null : args.parent
  144. }
  145. switch (args.mode) {
  146. case 'FOLDERS':
  147. conds.isFolder = true
  148. results = await WIKI.models.knex('pageTree').where(conds)
  149. break
  150. case 'PAGES':
  151. await WIKI.models.knex('pageTree').where(conds).andWhereNotNull('pageId')
  152. break
  153. default:
  154. results = await WIKI.models.knex('pageTree').where(conds)
  155. break
  156. }
  157. return results.filter(r => {
  158. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  159. path: r.path,
  160. locale: r.localeCode
  161. })
  162. }).map(r => ({
  163. ...r,
  164. parent: r.parent || 0,
  165. locale: r.localeCode
  166. }))
  167. },
  168. /**
  169. * FETCH PAGE LINKS
  170. */
  171. async links (obj, args, context, info) {
  172. let results = []
  173. results = await WIKI.models.knex('pages')
  174. .column({ id: 'pages.id' }, { path: 'pages.path' }, 'title', { link: 'pageLinks.path' }, { locale: 'pageLinks.localeCode' })
  175. .fullOuterJoin('pageLinks', 'pages.id', 'pageLinks.pageId')
  176. .where({
  177. 'pages.localeCode': args.locale
  178. })
  179. return _.reduce(results, (result, val) => {
  180. // -> Check if user has access to source and linked page
  181. if (
  182. !WIKI.auth.checkAccess(context.req.user, ['read:pages'], { path: val.path, locale: args.locale }) ||
  183. !WIKI.auth.checkAccess(context.req.user, ['read:pages'], { path: val.link, locale: val.locale })
  184. ) {
  185. return result
  186. }
  187. const existingEntry = _.findIndex(result, ['id', val.id])
  188. if (existingEntry >= 0) {
  189. if (val.link) {
  190. result[existingEntry].links.push(`${val.locale}/${val.link}`)
  191. }
  192. } else {
  193. result.push({
  194. id: val.id,
  195. title: val.title,
  196. path: `${args.locale}/${val.path}`,
  197. links: val.link ? [`${val.locale}/${val.link}`] : []
  198. })
  199. }
  200. return result
  201. }, [])
  202. }
  203. },
  204. PageMutation: {
  205. /**
  206. * CREATE PAGE
  207. */
  208. async create(obj, args, context) {
  209. try {
  210. const page = await WIKI.models.pages.createPage({
  211. ...args,
  212. user: context.req.user
  213. })
  214. return {
  215. responseResult: graphHelper.generateSuccess('Page created successfully.'),
  216. page
  217. }
  218. } catch (err) {
  219. return graphHelper.generateError(err)
  220. }
  221. },
  222. /**
  223. * UPDATE PAGE
  224. */
  225. async update(obj, args, context) {
  226. try {
  227. const page = await WIKI.models.pages.updatePage({
  228. ...args,
  229. user: context.req.user
  230. })
  231. return {
  232. responseResult: graphHelper.generateSuccess('Page has been updated.'),
  233. page
  234. }
  235. } catch (err) {
  236. return graphHelper.generateError(err)
  237. }
  238. },
  239. /**
  240. * MOVE PAGE
  241. */
  242. async move(obj, args, context) {
  243. try {
  244. await WIKI.models.pages.movePage({
  245. ...args,
  246. user: context.req.user
  247. })
  248. return {
  249. responseResult: graphHelper.generateSuccess('Page has been moved.')
  250. }
  251. } catch (err) {
  252. return graphHelper.generateError(err)
  253. }
  254. },
  255. /**
  256. * DELETE PAGE
  257. */
  258. async delete(obj, args, context) {
  259. try {
  260. await WIKI.models.pages.deletePage({
  261. ...args,
  262. user: context.req.user
  263. })
  264. return {
  265. responseResult: graphHelper.generateSuccess('Page has been deleted.')
  266. }
  267. } catch (err) {
  268. return graphHelper.generateError(err)
  269. }
  270. },
  271. /**
  272. * FLUSH PAGE CACHE
  273. */
  274. async flushCache(obj, args, context) {
  275. try {
  276. await WIKI.models.pages.flushCache()
  277. return {
  278. responseResult: graphHelper.generateSuccess('Pages Cache has been flushed successfully.')
  279. }
  280. } catch (err) {
  281. return graphHelper.generateError(err)
  282. }
  283. },
  284. /**
  285. * MIGRATE ALL PAGES FROM SOURCE LOCALE TO TARGET LOCALE
  286. */
  287. async migrateToLocale(obj, args, context) {
  288. try {
  289. const count = await WIKI.models.pages.migrateToLocale(args)
  290. return {
  291. responseResult: graphHelper.generateSuccess('Migrated content to target locale successfully.'),
  292. count
  293. }
  294. } catch (err) {
  295. return graphHelper.generateError(err)
  296. }
  297. },
  298. /**
  299. * REBUILD TREE
  300. */
  301. async rebuildTree(obj, args, context) {
  302. try {
  303. await WIKI.models.pages.rebuildTree()
  304. return {
  305. responseResult: graphHelper.generateSuccess('Page tree rebuilt successfully.')
  306. }
  307. } catch (err) {
  308. return graphHelper.generateError(err)
  309. }
  310. },
  311. /**
  312. * RENDER PAGE
  313. */
  314. async render (obj, args, context) {
  315. try {
  316. const page = await WIKI.models.pages.query().findById(args.id)
  317. if (!page) {
  318. throw new Error('Invalid Page Id')
  319. }
  320. await WIKI.models.pages.renderPage(page)
  321. return {
  322. responseResult: graphHelper.generateSuccess('Page rendered successfully.')
  323. }
  324. } catch (err) {
  325. return graphHelper.generateError(err)
  326. }
  327. }
  328. },
  329. Page: {
  330. // comments(pg) {
  331. // return pg.$relatedQuery('comments')
  332. // }
  333. }
  334. }