Skip to content

Commit efe3698

Browse files
committed
Implement GraphQL and REST API servers backed by MongoDB/Mongoose models.
1 parent 698c1d0 commit efe3698

File tree

5 files changed

+759
-0
lines changed

5 files changed

+759
-0
lines changed

graphql-server.js

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
"use strict";
2+
const graphqlHTTP = require("express-graphql");
3+
const {buildSchema} = require("graphql");
4+
const express = require("express");
5+
const app = express();
6+
7+
// Get the Mongoose models used for querying the database
8+
const {User, Group} = require("./models.js");
9+
10+
// Start up a GraphQL endpoint listening at /graphql
11+
app.use("/graphql", graphqlHTTP({
12+
// We construct our GraphQL schema which has three types:
13+
// The User, Group, and Query types (through which all
14+
// queries for data are defined)
15+
schema: buildSchema(`
16+
type Group {
17+
_id: String
18+
name: String
19+
}
20+
21+
type User {
22+
_id: String
23+
username: String
24+
group: Group
25+
}
26+
27+
type Query {
28+
user(id: String!): User
29+
users: [User]
30+
group(id: String!): Group
31+
groups: [Group]
32+
}
33+
`),
34+
// The methods that we'll use to get the data for our
35+
// main queries
36+
rootValue: {
37+
// Get a user based on the ID and return it as a Promise
38+
user({id}) {
39+
return User.findById(id);
40+
},
41+
// Get an array of users and return them as a Promise
42+
users() {
43+
return User.find({});
44+
},
45+
// Get a group based on the ID and return it as a Promise
46+
group({id}) {
47+
return Group.findById(id);
48+
},
49+
// Get an array of groups and return them as a Promise
50+
groups() {
51+
return Group.find({});
52+
},
53+
},
54+
// Display the GraphiQL web interface (for easy usage!)
55+
graphiql: true,
56+
}));
57+
58+
// Start the application, listening on port 3000
59+
app.listen(3000);

models.js

+36
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
"use strict";
2+
const mongoose = require("mongoose");
3+
4+
// Connect to the local MongoDB database named “testdb”
5+
mongoose.connect("mongodb://localhost/testdb",
6+
{useMongoClient: true});
7+
8+
// Use real promises
9+
mongoose.Promise = global.Promise;
10+
11+
// Create a Group schema to be stored in the MongoDB database
12+
const GroupSchema = new mongoose.Schema({
13+
_id: String,
14+
name: String,
15+
});
16+
17+
// Turn that schema into a model that we can query
18+
const Group = mongoose.model("Group", GroupSchema);
19+
20+
// Create a User schema to be stored in the MongoDB database
21+
const UserSchema = new mongoose.Schema({
22+
_id: String,
23+
username: String,
24+
groupId: String,
25+
});
26+
27+
// Retrieve the group associated with the user
28+
UserSchema.methods.group = function() {
29+
// Use .exec() to ensure a true Promise is returned
30+
return Group.findById(this.groupId).exec();
31+
};
32+
33+
// Turn that schema into a model that we can query
34+
const User = mongoose.model("User", UserSchema);
35+
36+
module.exports = {User, Group};

0 commit comments

Comments
 (0)