From 840eb7e70575c4999e3f66c946705a49318750c0 Mon Sep 17 00:00:00 2001 From: NGPixel Date: Sun, 13 Aug 2017 20:33:06 -0400 Subject: [PATCH] feat: GraphQL mutations for folder, group, tag, user --- server/models/_relations.js | 6 ++-- server/modules/graphql.js | 4 +++ server/queues/git-sync.js | 2 +- server/queues/upl-clear-temp.js | 2 +- server/schemas/resolvers-folder.js | 29 +++++++++++++++ server/schemas/resolvers-group.js | 36 +++++++++++++++++++ server/schemas/resolvers-tag.js | 57 ++++++++++++++++++++++++++++++ server/schemas/resolvers-user.js | 8 +++++ server/schemas/types.graphql | 24 ++++++++++++- 9 files changed, 163 insertions(+), 5 deletions(-) create mode 100644 server/schemas/resolvers-folder.js create mode 100644 server/schemas/resolvers-tag.js diff --git a/server/models/_relations.js b/server/models/_relations.js index 73436762..61b84250 100644 --- a/server/models/_relations.js +++ b/server/models/_relations.js @@ -6,9 +6,11 @@ module.exports = db => { db.User.belongsToMany(db.Group, { through: 'userGroups' }) db.Group.belongsToMany(db.User, { through: 'userGroups' }) - db.Group.hasMany(db.Right, { as: 'groupRights' }) - db.Document.hasMany(db.Tag, { as: 'documentTags' }) + db.Group.hasMany(db.Right) + db.Document.belongsToMany(db.Tag, { through: 'documentTags' }) + db.Tag.belongsToMany(db.Document, { through: 'documentTags' }) db.File.belongsTo(db.Folder) + db.Folder.hasMany(db.File) db.Comment.belongsTo(db.Document) db.Comment.belongsTo(db.User, { as: 'author' }) } diff --git a/server/modules/graphql.js b/server/modules/graphql.js index a7f073b1..c3100774 100644 --- a/server/modules/graphql.js +++ b/server/modules/graphql.js @@ -10,11 +10,15 @@ const _ = require('lodash') const typeDefs = fs.readFileSync(path.join(wiki.SERVERPATH, 'schemas/types.graphql'), 'utf8') const DateScalar = require('../schemas/scalar-date') +const FolderResolvers = require('../schemas/resolvers-folder') const GroupResolvers = require('../schemas/resolvers-group') +const TagResolvers = require('../schemas/resolvers-tag') const UserResolvers = require('../schemas/resolvers-user') const resolvers = _.merge( + FolderResolvers, GroupResolvers, + TagResolvers, UserResolvers, DateScalar ) diff --git a/server/queues/git-sync.js b/server/queues/git-sync.js index ab4fefae..6c46e8ef 100644 --- a/server/queues/git-sync.js +++ b/server/queues/git-sync.js @@ -9,7 +9,7 @@ const moment = require('moment') const path = require('path') const entryHelper = require('../helpers/entry') -module.exports = (job, done) => { +module.exports = (job) => { return wiki.git.resync().then(() => { // -> Stream all documents diff --git a/server/queues/upl-clear-temp.js b/server/queues/upl-clear-temp.js index 00e2bf1e..9c3a1b5b 100644 --- a/server/queues/upl-clear-temp.js +++ b/server/queues/upl-clear-temp.js @@ -7,7 +7,7 @@ const fs = Promise.promisifyAll(require('fs-extra')) const moment = require('moment') const path = require('path') -module.exports = (job, done) => { +module.exports = (job) => { return fs.readdirAsync(wiki.UPLTEMPPATH).then((ls) => { let fifteenAgo = moment().subtract(15, 'minutes') diff --git a/server/schemas/resolvers-folder.js b/server/schemas/resolvers-folder.js new file mode 100644 index 00000000..de7add8e --- /dev/null +++ b/server/schemas/resolvers-folder.js @@ -0,0 +1,29 @@ +'use strict' + +/* global wiki */ + +module.exports = { + Query: { + folders(obj, args, context, info) { + return wiki.db.Folder.findAll({ where: args }) + } + }, + Mutation: { + createFolder(obj, args) { + return wiki.db.Folder.create(args) + }, + deleteGroup(obj, args) { + return wiki.db.Folder.destroy({ + where: { + id: args.id + }, + limit: 1 + }) + } + }, + Folder: { + files(grp) { + return grp.getFiles() + } + } +} diff --git a/server/schemas/resolvers-group.js b/server/schemas/resolvers-group.js index 14f5296c..189c0fd3 100644 --- a/server/schemas/resolvers-group.js +++ b/server/schemas/resolvers-group.js @@ -2,6 +2,8 @@ /* global wiki */ +const gql = require('graphql') + module.exports = { Query: { groups(obj, args, context, info) { @@ -9,8 +11,42 @@ module.exports = { } }, Mutation: { + assignUserToGroup(obj, args) { + return wiki.db.Group.findById(args.groupId).then(grp => { + if (!grp) { + throw new gql.GraphQLError('Invalid Group ID') + } + return wiki.db.User.findById(args.userId).then(usr => { + if (!usr) { + throw new gql.GraphQLError('Invalid User ID') + } + return grp.addUser(usr) + }) + }) + }, createGroup(obj, args) { return wiki.db.Group.create(args) + }, + deleteGroup(obj, args) { + return wiki.db.Group.destroy({ + where: { + id: args.id + }, + limit: 1 + }) + }, + removeUserFromGroup(obj, args) { + return wiki.db.Group.findById(args.groupId).then(grp => { + if (!grp) { + throw new gql.GraphQLError('Invalid Group ID') + } + return wiki.db.User.findById(args.userId).then(usr => { + if (!usr) { + throw new gql.GraphQLError('Invalid User ID') + } + return grp.removeUser(usr) + }) + }) } }, Group: { diff --git a/server/schemas/resolvers-tag.js b/server/schemas/resolvers-tag.js new file mode 100644 index 00000000..ecf05fda --- /dev/null +++ b/server/schemas/resolvers-tag.js @@ -0,0 +1,57 @@ +'use strict' + +/* global wiki */ + +const gql = require('graphql') + +module.exports = { + Query: { + tags(obj, args, context, info) { + return wiki.db.Tag.findAll({ where: args }) + } + }, + Mutation: { + assignTagToDocument(obj, args) { + return wiki.db.Tag.findById(args.tagId).then(tag => { + if (!tag) { + throw new gql.GraphQLError('Invalid Tag ID') + } + return wiki.db.Document.findById(args.documentId).then(doc => { + if (!doc) { + throw new gql.GraphQLError('Invalid Document ID') + } + return tag.addDocument(doc) + }) + }) + }, + createTag(obj, args) { + return wiki.db.Tag.create(args) + }, + deleteTag(obj, args) { + return wiki.db.Tag.destroy({ + where: { + id: args.id + }, + limit: 1 + }) + }, + removeTagFromDocument(obj, args) { + return wiki.db.Tag.findById(args.tagId).then(tag => { + if (!tag) { + throw new gql.GraphQLError('Invalid Tag ID') + } + return wiki.db.Document.findById(args.documentId).then(doc => { + if (!doc) { + throw new gql.GraphQLError('Invalid Document ID') + } + return tag.removeDocument(doc) + }) + }) + } + }, + Tag: { + documents(tag) { + return tag.getDocuments() + } + } +} diff --git a/server/schemas/resolvers-user.js b/server/schemas/resolvers-user.js index 7bd6278c..140ba83b 100644 --- a/server/schemas/resolvers-user.js +++ b/server/schemas/resolvers-user.js @@ -11,6 +11,14 @@ module.exports = { Mutation: { createUser(obj, args) { return wiki.db.User.create(args) + }, + deleteUser(obj, args) { + return wiki.db.User.destroy({ + where: { + id: args.id + }, + limit: 1 + }) } }, User: { diff --git a/server/schemas/types.graphql b/server/schemas/types.graphql index 95ce6ff8..9b347058 100644 --- a/server/schemas/types.graphql +++ b/server/schemas/types.graphql @@ -73,6 +73,7 @@ type Folder implements Base { createdAt: Date updatedAt: Date name: String! + files: [File] } type Group implements Base { @@ -107,7 +108,8 @@ type Tag implements Base { id: Int! createdAt: Date updatedAt: Date - key: String! + key: String!, + documents: [Document] } # A User @@ -138,13 +140,23 @@ type Query { # Mutations (Create, Update, Delete) type Mutation { + assignTagToDocument( + tagId: Int! + documentId: Int! + ): Boolean assignUserToGroup( userId: Int! groupId: Int! ): Boolean + createFolder( + name: String! + ): Folder createGroup( name: String! ): Group + createTag( + name: String! + ): Tag createUser( email: String! name: String @@ -152,12 +164,22 @@ type Mutation { providerId: String role: UserRole! ): User + deleteFolder( + id: Int! + ): Boolean deleteGroup( id: Int! ): Boolean + deleteTag( + id: Int! + ): Boolean deleteUser( id: Int! ): Boolean + removeTagFromDocument( + tagId: Int! + documentId: Int! + ): Boolean removeUserFromGroup( userId: Int! groupId: Int!