page.js 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  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. async history(obj, args, context, info) {
  13. return WIKI.models.pageHistory.getHistory({
  14. pageId: args.id,
  15. offsetPage: args.offsetPage || 0,
  16. offsetSize: args.offsetSize || 100
  17. })
  18. },
  19. async search (obj, args, context) {
  20. if (WIKI.data.searchEngine) {
  21. const resp = await WIKI.data.searchEngine.query(args.query, args)
  22. return {
  23. ...resp,
  24. results: _.filter(resp.results, r => {
  25. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  26. path: r.path,
  27. locale: r.locale
  28. })
  29. })
  30. }
  31. } else {
  32. return {
  33. results: [],
  34. suggestions: [],
  35. totalHits: 0
  36. }
  37. }
  38. },
  39. async list (obj, args, context, info) {
  40. let results = await WIKI.models.pages.query().column([
  41. 'pages.id',
  42. 'path',
  43. { locale: 'localeCode' },
  44. 'title',
  45. 'description',
  46. 'isPublished',
  47. 'isPrivate',
  48. 'privateNS',
  49. 'contentType',
  50. 'createdAt',
  51. 'updatedAt'
  52. ])
  53. .eagerAlgorithm(WIKI.models.Objection.Model.JoinEagerAlgorithm)
  54. .eager('tags(selectTags)', {
  55. selectTags: builder => {
  56. builder.select('tag')
  57. }
  58. })
  59. .modify(queryBuilder => {
  60. if (args.limit) {
  61. queryBuilder.limit(args.limit)
  62. }
  63. if (args.locale) {
  64. queryBuilder.where('localeCode', args.locale)
  65. }
  66. if (args.tags && args.tags.length > 0) {
  67. queryBuilder.whereIn('tags.tag', args.tags)
  68. }
  69. const orderDir = args.orderByDirection === 'DESC' ? 'desc' : 'asc'
  70. switch (args.orderBy) {
  71. case 'CREATED':
  72. queryBuilder.orderBy('createdAt', orderDir)
  73. break
  74. case 'PATH':
  75. queryBuilder.orderBy('path', orderDir)
  76. break
  77. case 'TITLE':
  78. queryBuilder.orderBy('title', orderDir)
  79. break
  80. case 'UPDATED':
  81. queryBuilder.orderBy('updatedAt', orderDir)
  82. break
  83. default:
  84. queryBuilder.orderBy('pages.id', orderDir)
  85. break
  86. }
  87. })
  88. results = _.filter(results, r => {
  89. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  90. path: r.path,
  91. locale: r.locale
  92. })
  93. }).map(r => ({
  94. ...r,
  95. tags: _.map(r.tags, 'tag')
  96. }))
  97. if (args.tags && args.tags.length > 0) {
  98. results = _.filter(results, r => _.every(args.tags, t => _.includes(r.tags, t)))
  99. }
  100. return results
  101. },
  102. async single (obj, args, context, info) {
  103. let page = await WIKI.models.pages.getPageFromDb(args.id)
  104. if (page) {
  105. return {
  106. ...page,
  107. locale: page.localeCode,
  108. editor: page.editorKey
  109. }
  110. } else {
  111. throw new WIKI.Error.PageNotFound()
  112. }
  113. },
  114. async tags (obj, args, context, info) {
  115. return WIKI.models.tags.query().orderBy('tag', 'asc')
  116. },
  117. async tree (obj, args, context, info) {
  118. let results = []
  119. let conds = {
  120. localeCode: args.locale,
  121. parent: (args.parent < 1) ? null : args.parent
  122. }
  123. switch (args.mode) {
  124. case 'FOLDERS':
  125. conds.isFolder = true
  126. results = await WIKI.models.knex('pageTree').where(conds)
  127. break
  128. case 'PAGES':
  129. await WIKI.models.knex('pageTree').where(conds).andWhereNotNull('pageId')
  130. break
  131. default:
  132. results = await WIKI.models.knex('pageTree').where(conds)
  133. break
  134. }
  135. return results.filter(r => {
  136. return WIKI.auth.checkAccess(context.req.user, ['read:pages'], {
  137. path: r.path,
  138. locale: r.localeCode
  139. })
  140. }).map(r => ({
  141. ...r,
  142. locale: r.localeCode
  143. }))
  144. }
  145. },
  146. PageMutation: {
  147. async create(obj, args, context) {
  148. const page = await WIKI.models.pages.createPage({
  149. ...args,
  150. authorId: context.req.user.id
  151. })
  152. return {
  153. responseResult: graphHelper.generateSuccess('Page created successfully.'),
  154. page
  155. }
  156. },
  157. async delete(obj, args, context) {
  158. await WIKI.models.pages.deletePage({
  159. ...args,
  160. authorId: context.req.user.id
  161. })
  162. return {
  163. responseResult: graphHelper.generateSuccess('Page has been deleted.')
  164. }
  165. },
  166. async update(obj, args, context) {
  167. const page = await WIKI.models.pages.updatePage({
  168. ...args,
  169. authorId: context.req.user.id
  170. })
  171. return {
  172. responseResult: graphHelper.generateSuccess('Page has been updated.'),
  173. page
  174. }
  175. },
  176. async flushCache(obj, args, context) {
  177. try {
  178. await WIKI.models.pages.flushCache()
  179. return {
  180. responseResult: graphHelper.generateSuccess('Pages Cache has been flushed successfully.')
  181. }
  182. } catch (err) {
  183. return graphHelper.generateError(err)
  184. }
  185. },
  186. async migrateToLocale(obj, args, context) {
  187. try {
  188. const count = await WIKI.models.pages.migrateToLocale(args)
  189. return {
  190. responseResult: graphHelper.generateSuccess('Migrated content to target locale successfully.'),
  191. count
  192. }
  193. } catch (err) {
  194. return graphHelper.generateError(err)
  195. }
  196. }
  197. },
  198. Page: {
  199. // comments(pg) {
  200. // return pg.$relatedQuery('comments')
  201. // }
  202. }
  203. }