From 1344bd38434763a67621da16655b6e7e4f8e6772 Mon Sep 17 00:00:00 2001 From: Kuitos Date: Thu, 15 Jun 2017 18:10:33 +0800 Subject: [PATCH] init --- .babelrc | 10 +++++++ .gitignore | 3 ++ database/index.js | 19 ++++++++++++ database/pagination/schema.graphql | 5 ++++ database/resolver.js | 23 +++++++++++++++ database/schema.graphql | 10 +++++++ database/user/connector.js | 21 +++++++++++++ database/user/schema.graphql | 19 ++++++++++++ mock/user/index.js | 47 ++++++++++++++++++++++++++++++ package.json | 29 ++++++++++++++++++ server.js | 29 ++++++++++++++++++ utils/http.js | 14 +++++++++ 12 files changed, 229 insertions(+) create mode 100644 .babelrc create mode 100644 .gitignore create mode 100644 database/index.js create mode 100644 database/pagination/schema.graphql create mode 100644 database/resolver.js create mode 100644 database/schema.graphql create mode 100644 database/user/connector.js create mode 100644 database/user/schema.graphql create mode 100644 mock/user/index.js create mode 100644 package.json create mode 100644 server.js create mode 100644 utils/http.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..72b6b93 --- /dev/null +++ b/.babelrc @@ -0,0 +1,10 @@ +{ + "passPerPreset": true, + "presets": [ + "es2015", + "stage-0" + ], + "plugins": [ + "babel-plugin-inline-import" + ] +} \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d15a147 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +.idea/ +node_modules/ diff --git a/database/index.js b/database/index.js new file mode 100644 index 0000000..d766f58 --- /dev/null +++ b/database/index.js @@ -0,0 +1,19 @@ +/** + * @author Kuitos + * @homepage https://github.com/kuitos/ + * @since 2017-06-12 + */ +import userSchema from './user/schema.graphql'; +import rootSchema from './schema.graphql'; +import paginationSchema from './pagination/schema.graphql'; +import resolvers from './resolver'; +import { addErrorLoggingToSchema, makeExecutableSchema } from 'graphql-tools'; + +const schema = makeExecutableSchema({ typeDefs: [rootSchema, userSchema, paginationSchema], resolvers }); +addErrorLoggingToSchema(schema, { + log(e){ + console.error(e.stack); + } +}); + +export default schema; diff --git a/database/pagination/schema.graphql b/database/pagination/schema.graphql new file mode 100644 index 0000000..f19fc54 --- /dev/null +++ b/database/pagination/schema.graphql @@ -0,0 +1,5 @@ +interface Pagination { + pageSize: Int + pageNum: Int + total: Int, +} diff --git a/database/resolver.js b/database/resolver.js new file mode 100644 index 0000000..ee4cac3 --- /dev/null +++ b/database/resolver.js @@ -0,0 +1,23 @@ +/** + * @author Kuitos + * @homepage https://github.com/kuitos/ + * @since 2017-06-12 + */ + +import { getUser, getUsers } from './User/connector'; + +const resolver = { + + Query: { + user(root, { id }) { + return getUser(id); + }, + + users(root, { filters, pageNum, pageSize }) { + return getUsers(filters, pageNum, pageSize); + } + } + +}; + +export default resolver; diff --git a/database/schema.graphql b/database/schema.graphql new file mode 100644 index 0000000..d509c02 --- /dev/null +++ b/database/schema.graphql @@ -0,0 +1,10 @@ +type Query { + + user(id: ID!): User + + users(filters: UserQuery, pageNum: Int, pageSize: Int): UserPage +} + +schema { + query: Query +} \ No newline at end of file diff --git a/database/user/connector.js b/database/user/connector.js new file mode 100644 index 0000000..b9d5289 --- /dev/null +++ b/database/user/connector.js @@ -0,0 +1,21 @@ +/** + * @author Kuitos + * @homepage https://github.com/kuitos/ + * @since 2017-06-12 + */ + +import http from '../../utils/http'; +import qs from 'querystring'; + +export async function getUser(userId) { + + const user = await http.get(`http://127.0.0.1:8080/users/${userId}`).then(res => res.data); + return user; +} + +export async function getUsers(queryParams, pageNum, pageSize) { + + const params = qs.stringify({ ...queryParams, pageNum, pageSize }); + const users = await http.get(`http://127.0.0.1:8080/users?${params}`).then(res => res.data); + return users; +} diff --git a/database/user/schema.graphql b/database/user/schema.graphql new file mode 100644 index 0000000..4f97239 --- /dev/null +++ b/database/user/schema.graphql @@ -0,0 +1,19 @@ +type User { + id: ID! + userName: String + age: Int + gender: String +} + +input UserQuery { + userName: String + age: Int + gender: String +} + +type UserPage implements Pagination { + pageSize: Int + pageNum: Int + total: Int + data: [User] +} diff --git a/mock/user/index.js b/mock/user/index.js new file mode 100644 index 0000000..fbd1036 --- /dev/null +++ b/mock/user/index.js @@ -0,0 +1,47 @@ +/** + * @author Kuitos + * @homepage https://github.com/kuitos/ + * @since 2017-06-15 + */ + +export default router => { + + router.get('/users/:id', ({ params }, res) => { + const { id } = params; + res.send({ + id, + userName: `kuitos ${id}`, + age: Number(id), + gender: 'miss' + }); + }); + + router.get('/users', ({ query }, res) => { + + const { pageSize, pageNum, ...params } = query; + + res.send({ + + total: 50, + pageSize, + pageNum, + data: [ + { + id: params.id || 123, + userName: 'kuitos', + age: 18, + gender: 'miss' + }, + { + id: params.id || 123, + userName: 'kuitos', + age: 18, + gender: 'miss' + } + ] + + }); + + }); + +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2304ce4 --- /dev/null +++ b/package.json @@ -0,0 +1,29 @@ +{ + "name": "apollo-server", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "cross-env NODE_ENV=development nodemon ./server.js --exec babel-node" + }, + "dependencies": { + "axios": "^0.16.2", + "body-parser": "~1.17.1", + "cookie-parser": "~1.4.3", + "cors": "^2.8.3", + "debug": "~2.6.3", + "express": "~4.15.2", + "glob": "^7.1.2", + "graphql": "^0.10.1", + "graphql-server-express": "^0.8.0", + "graphql-tools": "^1.0.0", + "morgan": "^1.8.2" + }, + "devDependencies": { + "babel-cli": "^6.24.1", + "babel-plugin-inline-import": "^2.0.5", + "babel-preset-es2015": "^6.24.1", + "babel-preset-stage-0": "^6.24.1", + "cross-env": "^5.0.1", + "nodemon": "^1.11.0" + } +} diff --git a/server.js b/server.js new file mode 100644 index 0000000..7dbf23d --- /dev/null +++ b/server.js @@ -0,0 +1,29 @@ +import express from 'express'; +import bodyParser from 'body-parser'; +import logger from 'morgan'; +import cors from 'cors'; +import glob from 'glob'; +import path from 'path'; +import { graphiqlExpress, graphqlExpress } from 'graphql-server-express'; +import schema from './database'; + +const PORT = 8080; + +const app = express(); + +app.use(cors()); +app.use(logger('combined')); + +// bodyParser is needed just for POST. +app.use(bodyParser.urlencoded({ extended: true })); +app.use(bodyParser.json()); +app.use('/graphql', graphqlExpress({ schema })); +app.use('/graphiql', graphiqlExpress({ + endpointURL: '/graphql' +})); + +if (process.env.NODE_ENV === 'development') { + glob(path.resolve(__dirname, './mock/**/*.js'), {}, (er, modules) => modules.forEach(module => require(module).default(app))); +} + +app.listen(PORT, () => console.log(`> Listening at port ${PORT}`)); diff --git a/utils/http.js b/utils/http.js new file mode 100644 index 0000000..75c208d --- /dev/null +++ b/utils/http.js @@ -0,0 +1,14 @@ +/** + * @author Kuitos + * @homepage https://github.com/kuitos/ + * @since 2017-06-15 + */ + +import axios from 'axios'; + +const http = axios.create({ + baseURL: '/', + headers: { 'Cache-Control': 'no-cache' } +}); + +export default http;