| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | const graphHelper = require('../../helpers/graph')const safeRegex = require('safe-regex')const _ = require('lodash')/* global WIKI */const gql = require('graphql')module.exports = {  Query: {    async groups() { return {} }  },  Mutation: {    async groups() { return {} }  },  GroupQuery: {    async list(obj, args, context, info) {      return WIKI.models.groups.query().select(        'groups.*',        WIKI.models.groups.relatedQuery('users').count().as('userCount')      )    },    async single(obj, args, context, info) {      return WIKI.models.groups.query().findById(args.id)    }  },  GroupMutation: {    async assignUser(obj, args) {      const grp = await WIKI.models.groups.query().findById(args.groupId)      if (!grp) {        throw new gql.GraphQLError('Invalid Group ID')      }      const usr = await WIKI.models.users.query().findById(args.userId)      if (!usr) {        throw new gql.GraphQLError('Invalid User ID')      }      await grp.$relatedQuery('users').relate(usr.id)      return {        responseResult: graphHelper.generateSuccess('User has been assigned to group.')      }    },    async create(obj, args) {      const group = await WIKI.models.groups.query().insertAndFetch({        name: args.name,        permissions: JSON.stringify(WIKI.data.groups.defaultPermissions),        pageRules: JSON.stringify([]),        isSystem: false      })      await WIKI.auth.reloadGroups()      return {        responseResult: graphHelper.generateSuccess('Group created successfully.'),        group      }    },    async delete(obj, args) {      await WIKI.models.groups.query().deleteById(args.id)      await WIKI.auth.reloadGroups()      return {        responseResult: graphHelper.generateSuccess('Group has been deleted.')      }    },    async unassignUser(obj, args) {      const grp = await WIKI.models.groups.query().findById(args.groupId)      if (!grp) {        throw new gql.GraphQLError('Invalid Group ID')      }      const usr = await WIKI.models.users.query().findById(args.userId)      if (!usr) {        throw new gql.GraphQLError('Invalid User ID')      }      await grp.$relatedQuery('users').unrelate().where('userId', usr.id)      return {        responseResult: graphHelper.generateSuccess('User has been unassigned from group.')      }    },    async update(obj, args) {      if(_.some(args.pageRules, pr => {        return pr.match === 'REGEX' && !safeRegex(pr.path)      })) {        throw new gql.GraphQLError('Some Page Rules contains unsafe or exponential time regex.')      }      await WIKI.models.groups.query().patch({        name: args.name,        permissions: JSON.stringify(args.permissions),        pageRules: JSON.stringify(args.pageRules)      }).where('id', args.id)      await WIKI.auth.reloadGroups()      return {        responseResult: graphHelper.generateSuccess('Group has been updated.')      }    }  },  Group: {    users(grp) {      return grp.$relatedQuery('users')    }  }}
 |