comment.js 5.1 KB

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