浏览代码

feat: GraphQL base implementation

NGPixel 7 年之前
父节点
当前提交
60750eeed8
共有 8 个文件被更改,包括 118 次插入20 次删除
  1. 2 0
      package.json
  2. 4 0
      server/index.js
  3. 1 3
      server/middlewares/security.js
  4. 1 1
      server/models/user.js
  5. 7 13
      server/modules/auth.js
  6. 1 2
      server/modules/db.js
  7. 67 0
      server/modules/graphql.js
  8. 35 1
      yarn.lock

+ 2 - 0
package.json

@@ -37,6 +37,7 @@
     "node": ">=6.11.1"
   },
   "dependencies": {
+    "apollo-server-express": "~1.0.4",
     "auto-load": "~3.0.0",
     "axios": "~0.16.2",
     "bcryptjs-then": "~1.0.1",
@@ -62,6 +63,7 @@
     "follow-redirects": "~1.2.4",
     "fs-extra": "~4.0.0",
     "git-wrapper2-promise": "~0.2.9",
+    "graphql": "~0.10.5",
     "highlight.js": "~9.12.0",
     "i18next": "~8.4.3",
     "i18next-express-middleware": "~1.0.5",

+ 4 - 0
server/index.js

@@ -65,6 +65,8 @@ const session = require('express-session')
 const SessionRedisStore = require('connect-redis')(session)
 const graceful = require('node-graceful')
 const socketio = require('socket.io')
+const graphqlApollo = require('apollo-server-express')
+const graphqlSchema = require('./modules/graphql')
 
 var mw = autoload(path.join(wiki.SERVERPATH, '/middlewares'))
 var ctrl = autoload(path.join(wiki.SERVERPATH, '/controllers'))
@@ -167,6 +169,8 @@ app.use(mw.flash)
 
 app.use('/', ctrl.auth)
 
+app.use('/graphql', graphqlApollo.graphqlExpress({ schema: graphqlSchema }))
+app.use('/graphiql', graphqlApollo.graphiqlExpress({ endpointURL: '/graphql' }))
 app.use('/uploads', mw.auth, ctrl.uploads)
 app.use('/admin', mw.auth, ctrl.admin)
 app.use('/', mw.auth, ctrl.pages)

+ 1 - 3
server/middlewares/security.js

@@ -1,7 +1,5 @@
 'use strict'
 
-/* global app */
-
 /**
  * Security Middleware
  *
@@ -12,7 +10,7 @@
  */
 module.exports = function (req, res, next) {
   // -> Disable X-Powered-By
-  app.disable('x-powered-by')
+  req.app.disable('x-powered-by')
 
   // -> Disable Frame Embedding
   res.set('X-Frame-Options', 'deny')

+ 1 - 1
server/models/user.js

@@ -99,7 +99,7 @@ module.exports = (sequelize, DataTypes) => {
             deny: false
           }]
         }
-        return db.User.create(nUsr)
+        return wiki.db.User.create(nUsr)
       }
       return user || Promise.reject(new Error(wiki.lang.t('auth:errors:notyetauthorized')))
     })

+ 7 - 13
server/modules/auth.js

@@ -214,20 +214,17 @@ module.exports = function (passport) {
 
         return wiki.db.User.create({
           provider: 'local',
-          email: 'guest',
+          email: 'guest@example.com',
           name: 'Guest',
           password: '',
-          rights: [{
-            role: 'read',
-            path: '/',
-            exact: false,
-            deny: !wiki.config.public
-          }]
+          role: 'guest'
         }).then(() => {
           wiki.logger.info('[AUTH] Guest account created successfully!')
+          return true
         }).catch((err) => {
           wiki.logger.error('[AUTH] An error occured while creating guest account:')
           wiki.logger.error(err)
+          return err
         })
       }
     }).then(() => {
@@ -241,17 +238,14 @@ module.exports = function (passport) {
               email: process.env.WIKI_ADMIN_EMAIL,
               name: 'Administrator',
               password: '$2a$04$MAHRw785Xe/Jd5kcKzr3D.VRZDeomFZu2lius4gGpZZ9cJw7B7Mna', // admin123 (default)
-              rights: [{
-                role: 'admin',
-                path: '/',
-                exact: false,
-                deny: false
-              }]
+              role: 'admin'
             }).then(() => {
               wiki.logger.info('[AUTH] Root admin account created successfully!')
+              return true
             }).catch((err) => {
               wiki.logger.error('[AUTH] An error occured while creating root admin account:')
               wiki.logger.error(err)
+              return err
             })
           } else { return true }
         })

+ 1 - 2
server/modules/db.js

@@ -64,8 +64,7 @@ module.exports = {
     // Sync DB
 
     self.onReady = self.inst.sync({
-      force: false,
-      logging: wiki.logger.verbose
+      force: false
     })
 
     return self

+ 67 - 0
server/modules/graphql.js

@@ -0,0 +1,67 @@
+'use strict'
+
+/* global wiki */
+
+const gql = require('graphql')
+
+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 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 Schema = new gql.GraphQLSchema({
+  query: Query
+})
+
+module.exports = Schema

+ 35 - 1
yarn.lock

@@ -65,7 +65,7 @@
   dependencies:
     "@types/node" "*"
 
-"@types/express@*":
+"@types/express@*", "@types/express@^4.0.35":
   version "4.0.36"
   resolved "https://registry.yarnpkg.com/@types/express/-/express-4.0.36.tgz#14eb47de7ecb10319f0a2fb1cf971aa8680758c2"
   dependencies:
@@ -76,6 +76,10 @@
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/@types/geojson/-/geojson-1.0.2.tgz#b02d10ab028e2928ac592a051aaa4981a1941d03"
 
+"@types/graphql@^0.9.0", "@types/graphql@^0.9.1":
+  version "0.9.4"
+  resolved "https://registry.yarnpkg.com/@types/graphql/-/graphql-0.9.4.tgz#cdeb6bcbef9b6c584374b81aa7f48ecf3da404fa"
+
 "@types/ldapjs@^1.0.0":
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/@types/ldapjs/-/ldapjs-1.0.0.tgz#d940cb412140caec14edaa9c76d5b92799dab495"
@@ -296,6 +300,26 @@ ap@~0.2.0:
   version "0.2.0"
   resolved "https://registry.yarnpkg.com/ap/-/ap-0.2.0.tgz#ae0942600b29912f0d2b14ec60c45e8f330b6110"
 
+apollo-server-core@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/apollo-server-core/-/apollo-server-core-1.0.2.tgz#6860a6b5680c42c8727153c524eefc84fb91e500"
+  optionalDependencies:
+    "@types/graphql" "^0.9.0"
+
+apollo-server-express@~1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/apollo-server-express/-/apollo-server-express-1.0.4.tgz#fad6045493d818b09ad4610faa389768386a68b6"
+  dependencies:
+    apollo-server-core "^1.0.2"
+    apollo-server-module-graphiql "^1.0.4"
+  optionalDependencies:
+    "@types/express" "^4.0.35"
+    "@types/graphql" "^0.9.1"
+
+apollo-server-module-graphiql@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/apollo-server-module-graphiql/-/apollo-server-module-graphiql-1.0.4.tgz#d6db21a8c60f052649124da5cde1d88dab702319"
+
 app-root-path@^1.3.0:
   version "1.4.0"
   resolved "https://registry.yarnpkg.com/app-root-path/-/app-root-path-1.4.0.tgz#6335d865c9640d0fad99004e5a79232238e92dfa"
@@ -2868,6 +2892,12 @@ 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@~0.10.5:
+  version "0.10.5"
+  resolved "https://registry.yarnpkg.com/graphql/-/graphql-0.10.5.tgz#c9be17ca2bdfdbd134077ffd9bbaa48b8becd298"
+  dependencies:
+    iterall "^1.1.0"
+
 growly@^1.3.0:
   version "1.3.0"
   resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
@@ -3482,6 +3512,10 @@ isurl@^1.0.0-alpha5:
     has-to-string-tag-x "^1.2.0"
     is-object "^1.0.1"
 
+iterall@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/iterall/-/iterall-1.1.1.tgz#f7f0af11e9a04ec6426260f5019d9fcca4d50214"
+
 jackpot@>=0.0.6:
   version "0.0.6"
   resolved "https://registry.yarnpkg.com/jackpot/-/jackpot-0.0.6.tgz#3cff064285cbf66f4eab2593c90bce816a821849"