comment.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. const _ = require('lodash')
  2. const graphHelper = require('../../helpers/graph')
  3. module.exports = {
  4. Query: {
  5. /**
  6. * Fetch list of Comments Providers
  7. */
  8. async commentsProviders(obj, args, context, info) {
  9. const providers = await WIKI.db.commentProviders.getProviders()
  10. return providers.map(provider => {
  11. const providerInfo = _.find(WIKI.data.commentProviders, ['key', provider.key]) || {}
  12. return {
  13. ...providerInfo,
  14. ...provider,
  15. config: _.sortBy(_.transform(provider.config, (res, value, key) => {
  16. const configData = _.get(providerInfo.props, key, false)
  17. if (configData) {
  18. res.push({
  19. key,
  20. value: JSON.stringify({
  21. ...configData,
  22. value
  23. })
  24. })
  25. }
  26. }, []), 'key')
  27. }
  28. })
  29. },
  30. /**
  31. * Fetch list of comments for a page
  32. */
  33. async comments (obj, args, context) {
  34. const page = await WIKI.db.pages.query().select('id').findOne({ localeCode: args.locale, path: args.path })
  35. if (page) {
  36. if (WIKI.auth.checkAccess(context.req.user, ['read:comments'], args)) {
  37. const comments = await WIKI.db.comments.query().where('pageId', page.id).orderBy('createdAt')
  38. return comments.map(c => ({
  39. ...c,
  40. authorName: c.name,
  41. authorEmail: c.email,
  42. authorIP: c.ip
  43. }))
  44. } else {
  45. throw new WIKI.Error.CommentViewForbidden()
  46. }
  47. } else {
  48. return []
  49. }
  50. },
  51. /**
  52. * Fetch a single comment
  53. */
  54. async commentById (obj, args, context) {
  55. const cm = await WIKI.data.commentProvider.getCommentById(args.id)
  56. if (!cm || !cm.pageId) {
  57. throw new WIKI.Error.CommentNotFound()
  58. }
  59. const page = await WIKI.db.pages.query().select('localeCode', 'path').findById(cm.pageId)
  60. if (page) {
  61. if (WIKI.auth.checkAccess(context.req.user, ['read:comments'], {
  62. path: page.path,
  63. locale: page.localeCode
  64. })) {
  65. return {
  66. ...cm,
  67. authorName: cm.name,
  68. authorEmail: cm.email,
  69. authorIP: cm.ip
  70. }
  71. } else {
  72. throw new WIKI.Error.CommentViewForbidden()
  73. }
  74. } else {
  75. WIKI.logger.warn(`Comment #${cm.id} is linked to a page #${cm.pageId} that doesn't exist! [ERROR]`)
  76. throw new WIKI.Error.CommentGenericError()
  77. }
  78. }
  79. },
  80. Mutation: {
  81. /**
  82. * Create New Comment
  83. */
  84. async createComment (obj, args, context) {
  85. try {
  86. const cmId = await WIKI.db.comments.postNewComment({
  87. ...args,
  88. user: context.req.user,
  89. ip: context.req.ip
  90. })
  91. return {
  92. responseResult: graphHelper.generateSuccess('New comment posted successfully'),
  93. id: cmId
  94. }
  95. } catch (err) {
  96. return graphHelper.generateError(err)
  97. }
  98. },
  99. /**
  100. * Update an Existing Comment
  101. */
  102. async updateComment (obj, args, context) {
  103. try {
  104. const cmRender = await WIKI.db.comments.updateComment({
  105. ...args,
  106. user: context.req.user,
  107. ip: context.req.ip
  108. })
  109. return {
  110. responseResult: graphHelper.generateSuccess('Comment updated successfully'),
  111. render: cmRender
  112. }
  113. } catch (err) {
  114. return graphHelper.generateError(err)
  115. }
  116. },
  117. /**
  118. * Delete an Existing Comment
  119. */
  120. async deleteComment (obj, args, context) {
  121. try {
  122. await WIKI.db.comments.deleteComment({
  123. id: args.id,
  124. user: context.req.user,
  125. ip: context.req.ip
  126. })
  127. return {
  128. responseResult: graphHelper.generateSuccess('Comment deleted successfully')
  129. }
  130. } catch (err) {
  131. return graphHelper.generateError(err)
  132. }
  133. },
  134. /**
  135. * Update Comments Providers
  136. */
  137. async updateCommentsProviders(obj, args, context) {
  138. try {
  139. for (let provider of args.providers) {
  140. await WIKI.db.commentProviders.query().patch({
  141. isEnabled: provider.isEnabled,
  142. config: _.reduce(provider.config, (result, value, key) => {
  143. _.set(result, `${value.key}`, _.get(JSON.parse(value.value), 'v', null))
  144. return result
  145. }, {})
  146. }).where('key', provider.key)
  147. }
  148. await WIKI.db.commentProviders.initProvider()
  149. return {
  150. responseResult: graphHelper.generateSuccess('Comment Providers updated successfully')
  151. }
  152. } catch (err) {
  153. return graphHelper.generateError(err)
  154. }
  155. }
  156. }
  157. }