| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 | const _ = require('lodash')const graphHelper = require('../../helpers/graph')/* global WIKI */module.exports = {  Query: {    async comments() { return {} }  },  Mutation: {    async comments() { return {} }  },  CommentQuery: {    /**     * Fetch list of Comments Providers     */    async providers(obj, args, context, info) {      const providers = await WIKI.models.commentProviders.getProviders()      return providers.map(provider => {        const providerInfo = _.find(WIKI.data.commentProviders, ['key', provider.key]) || {}        return {          ...providerInfo,          ...provider,          config: _.sortBy(_.transform(provider.config, (res, value, key) => {            const configData = _.get(providerInfo.props, key, false)            if (configData) {              res.push({                key,                value: JSON.stringify({                  ...configData,                  value                })              })            }          }, []), 'key')        }      })    },    /**     * Fetch list of comments for a page     */    async list (obj, args, context) {      const page = await WIKI.models.pages.query().select('id').findOne({ localeCode: args.locale, path: args.path })      if (page) {        if (WIKI.auth.checkAccess(context.req.user, ['read:comments'], args)) {          const comments = await WIKI.models.comments.query().where('pageId', page.id).orderBy('createdAt')          return comments.map(c => ({            ...c,            authorName: c.name,            authorEmail: c.email,            authorIP: c.ip          }))        } else {          throw new WIKI.Error.CommentViewForbidden()        }      } else {        return []      }    },    /**     * Fetch a single comment     */    async single (obj, args, context) {      const cm = await WIKI.data.commentProvider.getCommentById(args.id)      if (!cm || !cm.pageId) {        throw new WIKI.Error.CommentNotFound()      }      const page = await WIKI.models.pages.query().select('localeCode', 'path').findById(cm.pageId)      if (page) {        if (WIKI.auth.checkAccess(context.req.user, ['read:comments'], {          path: page.path,          locale: page.localeCode        })) {          return {            ...cm,            authorName: cm.name,            authorEmail: cm.email,            authorIP: cm.ip          }        } else {          throw new WIKI.Error.CommentViewForbidden()        }      } else {        WIKI.logger.warn(`Comment #${cm.id} is linked to a page #${cm.pageId} that doesn't exist! [ERROR]`)        throw new WIKI.Error.CommentGenericError()      }    }  },  CommentMutation: {    /**     * Create New Comment     */    async create (obj, args, context) {      try {        const cmId = await WIKI.models.comments.postNewComment({          ...args,          user: context.req.user,          ip: context.req.ip        })        return {          responseResult: graphHelper.generateSuccess('New comment posted successfully'),          id: cmId        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * Update an Existing Comment     */    async update (obj, args, context) {      try {        const cmRender = await WIKI.models.comments.updateComment({          ...args,          user: context.req.user,          ip: context.req.ip        })        return {          responseResult: graphHelper.generateSuccess('Comment updated successfully'),          render: cmRender        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * Delete an Existing Comment     */    async delete (obj, args, context) {      try {        await WIKI.models.comments.deleteComment({          id: args.id,          user: context.req.user,          ip: context.req.ip        })        return {          responseResult: graphHelper.generateSuccess('Comment deleted successfully')        }      } catch (err) {        return graphHelper.generateError(err)      }    },    /**     * Update Comments Providers     */    async updateProviders(obj, args, context) {      try {        for (let provider of args.providers) {          await WIKI.models.commentProviders.query().patch({            isEnabled: provider.isEnabled,            config: _.reduce(provider.config, (result, value, key) => {              _.set(result, `${value.key}`, _.get(JSON.parse(value.value), 'v', null))              return result            }, {})          }).where('key', provider.key)        }        await WIKI.models.commentProviders.initProvider()        return {          responseResult: graphHelper.generateSuccess('Comment Providers updated successfully')        }      } catch (err) {        return graphHelper.generateError(err)      }    }  }}
 |