comment.js 4.7 KB

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