feat: GraphQL schema
This commit is contained in:
@@ -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
|
||||
|
@@ -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)
|
||||
|
@@ -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 Schema = new gql.GraphQLSchema({
|
||||
query: Query
|
||||
const resolvers = {
|
||||
Query: {
|
||||
groups: GroupResolvers.Query,
|
||||
users: UserResolvers.Query
|
||||
},
|
||||
Group: GroupResolvers.Type,
|
||||
User: UserResolvers.Type
|
||||
}
|
||||
|
||||
const Schema = gqlTools.makeExecutableSchema({
|
||||
typeDefs,
|
||||
resolvers
|
||||
})
|
||||
|
||||
module.exports = Schema
|
||||
|
14
server/schemas/resolvers-group.js
Normal file
14
server/schemas/resolvers-group.js
Normal file
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
14
server/schemas/resolvers-user.js
Normal file
14
server/schemas/resolvers-user.js
Normal file
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
136
server/schemas/types.graphql
Normal file
136
server/schemas/types.graphql
Normal file
@@ -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]
|
||||
}
|
Reference in New Issue
Block a user