group.js 3.01 KB
Newer Older
1
const graphHelper = require('../../helpers/graph')
2
const safeRegex = require('safe-regex')
3
const _ = require('lodash')
NGPixel's avatar
NGPixel committed
4

5
/* global WIKI */
NGPixel's avatar
NGPixel committed
6

7 8
const gql = require('graphql')

NGPixel's avatar
NGPixel committed
9
module.exports = {
10
  Query: {
11 12 13 14 15 16
    async groups() { return {} }
  },
  Mutation: {
    async groups() { return {} }
  },
  GroupQuery: {
17
    async list(obj, args, context, info) {
18
      return WIKI.models.groups.query().select(
19
        'groups.*',
20
        WIKI.models.groups.relatedQuery('users').count().as('userCount')
21
      )
22 23
    },
    async single(obj, args, context, info) {
24
      return WIKI.models.groups.query().findById(args.id)
25 26
    }
  },
27
  GroupMutation: {
28
    async assignUser(obj, args) {
29
      const grp = await WIKI.models.groups.query().findById(args.groupId)
30 31 32
      if (!grp) {
        throw new gql.GraphQLError('Invalid Group ID')
      }
33
      const usr = await WIKI.models.users.query().findById(args.userId)
34 35 36
      if (!usr) {
        throw new gql.GraphQLError('Invalid User ID')
      }
37
      await grp.$relatedQuery('users').relate(usr.id)
38 39 40
      return {
        responseResult: graphHelper.generateSuccess('User has been assigned to group.')
      }
41
    },
42
    async create(obj, args) {
43
      const group = await WIKI.models.groups.query().insertAndFetch({
44 45
        name: args.name,
        permissions: JSON.stringify(WIKI.data.groups.defaultPermissions),
46
        pageRules: JSON.stringify(WIKI.data.groups.defaultPageRules),
47
        isSystem: false
48
      })
49
      await WIKI.auth.reloadGroups()
50 51 52 53
      return {
        responseResult: graphHelper.generateSuccess('Group created successfully.'),
        group
      }
54
    },
NGPixel's avatar
NGPixel committed
55
    async delete(obj, args) {
56
      await WIKI.models.groups.query().deleteById(args.id)
57
      await WIKI.auth.reloadGroups()
NGPixel's avatar
NGPixel committed
58 59 60
      return {
        responseResult: graphHelper.generateSuccess('Group has been deleted.')
      }
61
    },
62
    async unassignUser(obj, args) {
63
      const grp = await WIKI.models.groups.query().findById(args.groupId)
64 65 66
      if (!grp) {
        throw new gql.GraphQLError('Invalid Group ID')
      }
67
      const usr = await WIKI.models.users.query().findById(args.userId)
68 69 70
      if (!usr) {
        throw new gql.GraphQLError('Invalid User ID')
      }
71
      await grp.$relatedQuery('users').unrelate().where('userId', usr.id)
72 73 74
      return {
        responseResult: graphHelper.generateSuccess('User has been unassigned from group.')
      }
75
    },
76
    async update(obj, args) {
77
      if (_.some(args.pageRules, pr => {
78
        return pr.match === 'REGEX' && !safeRegex(pr.path)
79 80 81 82
      })) {
        throw new gql.GraphQLError('Some Page Rules contains unsafe or exponential time regex.')
      }

83 84 85 86 87
      await WIKI.models.groups.query().patch({
        name: args.name,
        permissions: JSON.stringify(args.permissions),
        pageRules: JSON.stringify(args.pageRules)
      }).where('id', args.id)
88 89 90

      await WIKI.auth.reloadGroups()

91 92 93
      return {
        responseResult: graphHelper.generateSuccess('Group has been updated.')
      }
94
    }
NGPixel's avatar
NGPixel committed
95
  },
96
  Group: {
NGPixel's avatar
NGPixel committed
97
    users(grp) {
98
      return grp.$relatedQuery('users')
NGPixel's avatar
NGPixel committed
99 100 101
    }
  }
}