comment.mjs 4.8 KB

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