Skip to content

Commit b54a3e8

Browse files
committedJan 4, 2019
initia commit
0 parents  commit b54a3e8

File tree

6 files changed

+357
-0
lines changed

6 files changed

+357
-0
lines changed
 

‎app.js

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
const express = require('express');
2+
const bodyParser = require('body-parser');
3+
const graphqlHttp = require('express-graphql');
4+
//const { buildSchema } = require('graphql');
5+
const mongoose = require('mongoose');
6+
7+
const graphQLSchema = require('./graphql/schema/index');
8+
const graphQLResolvers = require('./graphql/resolvers/index');
9+
10+
11+
const app = express();
12+
13+
app.use(bodyParser.json());
14+
15+
16+
17+
app.use('/graphql', graphqlHttp({
18+
schema: graphQLSchema,
19+
rootValue: graphQLResolvers,
20+
graphiql: true
21+
}));
22+
23+
mongoose.connect(`mongodb+srv://${process.env.MONGO_USER}:${
24+
process.env.MONGO_PASSWORD
25+
}@cluster0-h8ga2.mongodb.net/${process.env.MONGO_DB}?retryWrites=true`
26+
).then(() => {
27+
app.listen(3000);
28+
})
29+
.catch(err => {
30+
console.log(err)
31+
});
32+

‎graphql/resolvers/index.js

+203
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
const bcrypt = require('bcryptjs');
2+
3+
const Event = require('../../models/event');
4+
const User = require('../../models/user');
5+
6+
const events = async eventIds => {
7+
try {
8+
const events = await Event.find({_id: {$in: eventIds}});
9+
events.map(event => {
10+
return {
11+
...event._doc,
12+
_id: event.id,
13+
date: new Date(event._doc.date).toISOString(),
14+
creator: user.bind(this, event.creator)
15+
};
16+
});
17+
return events.map();
18+
} catch(err) {
19+
throw err;
20+
}
21+
};
22+
23+
const user = async userId => {
24+
try {
25+
const user = await User.findById(userId);
26+
return {
27+
...user._doc,
28+
_id: user.id,
29+
createdEvents: events.bind(this, user._doc.createdEvents)
30+
};
31+
} catch(err) {
32+
throw err;
33+
}
34+
};
35+
36+
37+
// const user = userId => {
38+
// return User.findById(userId)
39+
// .then(user => {
40+
// return {
41+
// ...user._doc,
42+
// _id: user.id,
43+
// createdEvents: events.bind(this, user._doc.createdEvents)
44+
// }
45+
// })
46+
// .catch(err => {
47+
// throw err;
48+
// })
49+
// };
50+
51+
52+
module.exports = {
53+
events: async () => {
54+
try {
55+
const events = await Event.find();
56+
return events.map(event => {
57+
//return { ...event._doc, _id: event._doc._id.toString() };
58+
return {
59+
...event._doc,
60+
_id: event.id,
61+
date: new Date(event._doc.date).toISOString(),
62+
creator: user.bind(this, event._doc.creator)
63+
}; // shortcut virtual getter mongoose
64+
});
65+
} catch(err) {
66+
throw err;
67+
}
68+
},
69+
createEvent: async args => {
70+
const event = new Event({
71+
title: args.eventInput.title,
72+
description: args.eventInput.description,
73+
price: +args.eventInput.price,
74+
date: new Date(args.eventInput.date),
75+
creator: '5c210f381e5293861c6c2c3f'
76+
});
77+
let createdEvent;
78+
79+
try {
80+
const result = await event
81+
.save();
82+
createdEvent = {
83+
...result._doc,
84+
_id: result._doc._id.toString(),
85+
date: new Date(event._doc.date).toISOString(),
86+
creator: user.bind(this, result._doc.creator)
87+
};
88+
const creator = await User.findById('5c210f381e5293861c6c2c3f');
89+
90+
91+
if (!creator) {
92+
throw new Error('User not found')
93+
}
94+
creator.createdEvents.push(event);
95+
await creator.save();
96+
97+
return createdEvent;
98+
} catch(err) {
99+
console.log(err);
100+
throw err;
101+
}
102+
},
103+
createUser: async args => {
104+
try {
105+
const existingUser = await User.findOne({email: args.userInput.email});
106+
107+
if (existingUser) {
108+
throw new Error('User exists already');
109+
}
110+
const hashedPassword = await bcrypt.hash(args.userInput.password, 12);
111+
112+
113+
const user = new User({
114+
email: args.userInput.email,
115+
password: hashedPassword
116+
});
117+
const result = await user.save();
118+
119+
120+
return {...result._doc, password: null, _id: result.id}
121+
} catch(err) {
122+
throw err;
123+
}
124+
125+
}
126+
};
127+
128+
// module.exports = {
129+
// events: () => {
130+
// return Event.find()
131+
// .then(events => {
132+
// return events.map(event => {
133+
// //return { ...event._doc, _id: event._doc._id.toString() };
134+
// return { ...event._doc,
135+
// _id: event.id,
136+
// date: new Date(event._doc.date).toISOString(),
137+
// creator: user.bind(this, event._doc.creator)
138+
// }; // shortcut virtual getter mongoose
139+
// });
140+
// })
141+
// .catch(err => {
142+
// throw err;
143+
// })
144+
// },
145+
// createEvent: ( args ) => {
146+
// const event = new Event({
147+
// title: args.eventInput.title,
148+
// description: args.eventInput.description,
149+
// price: +args.eventInput.price,
150+
// date: new Date(args.eventInput.date),
151+
// creator: '5c18473daf935d1004745020'
152+
// });
153+
// let createdEvent;
154+
// return event
155+
// .save()
156+
// .then(result => {
157+
// createdEvent = {
158+
// ...result._doc,
159+
// _id: result._doc._id.toString(),
160+
// date: new Date(event._doc.date).toISOString(),
161+
// creator: user.bind(this, result._doc.creator )
162+
// };
163+
// return User.findById('5c18473daf935d1004745020')
164+
// })
165+
// .then(user => {
166+
// if (!user) {
167+
// throw new Error('User not found')
168+
// }
169+
// user.createdEvents.push(event);
170+
// return user.save();
171+
// })
172+
// .then(result => {
173+
// return createdEvent;
174+
// })
175+
// .catch(err => {
176+
// console.log(err);
177+
// throw err;
178+
// });
179+
// },
180+
// createUser: args => {
181+
// return User.findOne({email: args.userInput.email})
182+
// .then(user => {
183+
// if (user) {
184+
// throw new Error('User exists already')
185+
// }
186+
// return bcrypt.hash(args.userInput.password, 12)
187+
// })
188+
// .then(hashedPassword => {
189+
// const user = new User({
190+
// email: args.userInput.email,
191+
// password: hashedPassword
192+
// });
193+
// return user.save();
194+
// })
195+
// .then(result => {
196+
// return {...result._doc, password: null, _id: result.id}
197+
// })
198+
// .catch(err => {
199+
// throw err;
200+
// });
201+
//
202+
// }
203+
// }

‎graphql/schema/index.js

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
const { buildSchema } = require('graphql');
2+
3+
module.exports = buildSchema(`
4+
type Event {
5+
_id: ID!
6+
title: String!
7+
description: String!
8+
price: Float!
9+
date: String!
10+
creator: User!
11+
}
12+
13+
type User {
14+
_id: ID!
15+
email: String!
16+
password: String
17+
createdEvents: [Event!]
18+
}
19+
20+
input EventInput {
21+
title: String!
22+
description: String!
23+
price: Float!
24+
date: String!
25+
}
26+
27+
input UserInput {
28+
email: String!
29+
password: String!
30+
}
31+
32+
type RootQuery {
33+
events: [Event!]!
34+
}
35+
36+
type RootMutation {
37+
createEvent( eventInput: EventInput ): Event
38+
createUser(userInput: UserInput): User
39+
}
40+
41+
schema {
42+
query: RootQuery
43+
mutation: RootMutation
44+
}
45+
`);

‎models/event.js

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
const mongoose = require('mongoose');
2+
3+
const Schema = mongoose.Schema;
4+
5+
const eventSchema = new Schema({
6+
title: {
7+
type: String,
8+
required: true
9+
},
10+
description: {
11+
type: String,
12+
required: true
13+
},
14+
price: {
15+
type: Number,
16+
required: true
17+
},
18+
date: {
19+
type: Date,
20+
required: true
21+
},
22+
creator: {
23+
type: Schema.Types.ObjectId,
24+
ref: 'User'
25+
}
26+
});
27+
28+
module.exports = mongoose.model('Event', eventSchema);

‎models/user.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const mongoose = require('mongoose');
2+
3+
const Schema = mongoose.Schema;
4+
5+
const userSchema = new Schema({
6+
email: {
7+
type: String,
8+
required: true
9+
},
10+
password: {
11+
type: String,
12+
required: true
13+
},
14+
createdEvents: [
15+
{
16+
type: Schema.Types.ObjectId,
17+
ref: 'Event'
18+
}
19+
]
20+
});
21+
22+
module.exports = mongoose.model('User', userSchema);

‎package.json

+27
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "graphql-test",
3+
"version": "1.0.0",
4+
"description": "",
5+
"main": "index.js",
6+
"scripts": {
7+
"test": "echo \"Error: no test specified\" && exit 1",
8+
"start": "nodemon --exec babel-node --presets env,stage-2 app.js"
9+
},
10+
"author": "",
11+
"license": "ISC",
12+
"dependencies": {
13+
"bcryptjs": "^2.4.3",
14+
"body-parser": "^1.18.3",
15+
"express": "^4.16.4",
16+
"express-graphql": "^0.7.1",
17+
"graphql": "^14.0.2",
18+
"mongoose": "^5.4.0"
19+
},
20+
"devDependencies": {
21+
"babel-cli": "^6.26.0",
22+
"babel-preset-env": "^1.7.0",
23+
"babel-preset-stage-2": "^6.24.1",
24+
"babel-register": "^6.26.0",
25+
"nodemon": "^1.18.7"
26+
}
27+
}

0 commit comments

Comments
 (0)
Please sign in to comment.