diff --git a/package.json b/package.json index 06f4fbec..63607b2d 100644 --- a/package.json +++ b/package.json @@ -64,6 +64,7 @@ "fs-extra": "~4.0.0", "git-wrapper2-promise": "~0.2.9", "graphql": "~0.10.5", + "graphql-tools": "/home/nick1.1.0", "highlight.js": "~9.12.0", "i18next": "~8.4.3", "i18next-express-middleware": "~1.0.5", diff --git a/server/index.js b/server/index.js index 3f0007af..30ea6e2c 100644 --- a/server/index.js +++ b/server/index.js @@ -48,9 +48,9 @@ if (numWorkers > numCPUs) { } if (cluster.isMaster) { - wiki.logger.info('--------------------------') - wiki.logger.info('Wiki.js is initializing...') - wiki.logger.info('--------------------------') + wiki.logger.info('=======================================') + wiki.logger.info('= Wiki.js =============================') + wiki.logger.info('=======================================') require('./master').then(() => { // -> Create background workers diff --git a/server/models/_relations.js b/server/models/_relations.js index 7a851396..73436762 100644 --- a/server/models/_relations.js +++ b/server/models/_relations.js @@ -5,6 +5,7 @@ */ 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.File.belongsTo(db.Folder) diff --git a/server/modules/graphql.js b/server/modules/graphql.js index 4de7a8c7..d40b6d04 100644 --- a/server/modules/graphql.js +++ b/server/modules/graphql.js @@ -2,66 +2,27 @@ /* global wiki */ -const gql = require('graphql') +const gqlTools = require('graphql-tools') +const fs = require('fs') +const path = require('path') -const User = new gql.GraphQLObjectType({ - name: 'User', - description: 'A User', - fields() { - return { - id: { - type: gql.GraphQLInt, - resolve(usr) { - return usr.id - } - }, - email: { - type: gql.GraphQLString, - resolve(usr) { - return usr.email - } - }, - provider: { - type: gql.GraphQLString, - resolve(usr) { - return usr.provider - } - }, - providerId: { - type: gql.GraphQLString, - resolve(usr) { - return usr.providerId - } - } - } - } -}) +const typeDefs = fs.readFileSync(path.join(wiki.SERVERPATH, 'schemas/types.graphql'), 'utf8') -const Query = new gql.GraphQLObjectType({ - name: 'Query', - description: 'Root Query', - fields() { - return { - users: { - type: new gql.GraphQLList(User), - args: { - id: { - type: gql.GraphQLInt - }, - email: { - type: gql.GraphQLString - } - }, - resolve(root, args) { - return wiki.db.User.findAll({ where: args }) - } - } - } - } -}) +const GroupResolvers = require('../schemas/resolvers-group') +const UserResolvers = require('../schemas/resolvers-user') + +const resolvers = { + Query: { + groups: GroupResolvers.Query, + users: UserResolvers.Query + }, + Group: GroupResolvers.Type, + User: UserResolvers.Type +} -const Schema = new gql.GraphQLSchema({ - query: Query +const Schema = gqlTools.makeExecutableSchema({ + typeDefs, + resolvers }) module.exports = Schema diff --git a/server/schemas/resolvers-group.js b/server/schemas/resolvers-group.js new file mode 100644 index 00000000..bde68195 --- /dev/null +++ b/server/schemas/resolvers-group.js @@ -0,0 +1,14 @@ +'use strict' + +/* global wiki */ + +module.exports = { + Query(obj, args, context, info) { + return wiki.db.Group.findAll({ where: args }) + }, + Type: { + users(grp) { + return grp.getUsers() + } + } +} diff --git a/server/schemas/resolvers-user.js b/server/schemas/resolvers-user.js new file mode 100644 index 00000000..d7a876fd --- /dev/null +++ b/server/schemas/resolvers-user.js @@ -0,0 +1,14 @@ +'use strict' + +/* global wiki */ + +module.exports = { + Query(obj, args, context, info) { + return wiki.db.User.findAll({ where: args }) + }, + Type: { + groups(usr) { + return usr.getGroups() + } + } +} diff --git a/server/schemas/types.graphql b/server/schemas/types.graphql new file mode 100644 index 00000000..90722ddc --- /dev/null +++ b/server/schemas/types.graphql @@ -0,0 +1,136 @@ +# SCALARS + +scalar Date + +# ENUMS + +enum UserRole { + guest + user + admin +} + +enum FileType { + binary + image +} + +enum RightRole { + read + write + manage +} + +# INTERFACES + +interface Base { + id: Int! + createdOn: Date + updatedOn: Date +} + +# TYPES + +type Comment implements Base { + id: Int! + createdOn: Date + updatedOn: Date + content: String + document: Document! + author: User! +} + +type Document implements Base { + id: Int! + createdOn: Date + updatedOn: Date + path: String! + title: String! + subtitle: String + parentPath: String + parentTitle: String + isDirectory: Boolean! + isEntry: Boolean! + searchContent: String + tags: [Tag] +} + +type File implements Base { + id: Int! + createdOn: Date + updatedOn: Date + category: FileType! + mime: String! + extra: String + filename: String! + basename: String! + filesize: Int! + folder: Folder +} + +type Folder implements Base { + id: Int! + createdOn: Date + updatedOn: Date + name: String! +} + +type Group implements Base { + id: Int! + createdOn: Date + updatedOn: Date + name: String! + users: [User] + rights: [Right] +} + +type Right implements Base { + id: Int! + createdOn: Date + updatedOn: Date + path: String! + role: RightRole! + exact: Boolean! + allow: Boolean! +} + +type Setting implements Base { + id: Int! + createdOn: Date + updatedOn: Date + key: String! + config: String! +} + +type Tag implements Base { + id: Int! + createdOn: Date + updatedOn: Date + key: String! +} + +type User implements Base { + id: Int! + createdOn: Date + updatedOn: Date + email: String! + provider: String + providerId: String + name: String + role: UserRole! + groups: [Group] +} + +# QUERY + +type Query { + comments(id: Int): [Comment] + documents(id: Int, path: String): [Document] + files(id: Int): [File] + folders(id: Int, name: String): [Folder] + groups(id: Int, name: String): [Group] + rights(id: Int): [Right] + settings(key: String): [Setting] + tags(key: String): [Tag] + users(id: Int, email: String, provider: String, providerId: String, role: UserRole): [User] +} diff --git a/yarn.lock b/yarn.lock index 534390bc..d6f8684e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1794,6 +1794,10 @@ depd@1.1.0, depd@^1.1.0, depd@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.0.tgz#e1bd82c6aab6ced965b97b88b17ed3e528ca18c3" +deprecated-decorator@^0.1.6: + version "0.1.6" + resolved "https://registry.yarnpkg.com/deprecated-decorator/-/deprecated-decorator-0.1.6.tgz#00966317b7a12fe92f3cc831f7583af329b86c37" + destroy@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" @@ -2926,6 +2930,16 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" +graphql-tools@/home/nick1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/graphql-tools/-/graphql-tools-1.1.0.tgz#8d86ea6997b0dea3089b62dc655e47146a663ebb" + dependencies: + deprecated-decorator "^0.1.6" + lodash "^4.3.0" + uuid "^3.0.1" + optionalDependencies: + "@types/graphql" "^0.9.0" + graphql@~0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.10.5.tgz#c9be17ca2bdfdbd134077ffd9bbaa48b8becd298"