1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
|
const bcrypt = require('bcryptjs');
const jwt = require('jsonwebtoken');
const { forwardTo } = require('prisma-binding');
const { getUserId, Context } = require('../utils');
const { randomBytes } = require('crypto');
const { promisify } = require('util');
const mutations = {
// Signup Mutations
async signup(parent, args, ctx, info) {
const password = await bcrypt.hash(args.password, 10);
const user = await ctx.db.mutation.createUser({
data: { ...args, password },
});
return {
token: jwt.sign({ userId: user.id }, process.env.APP_SECRET),
user,
};
},
async signin(parent, { email, password }, ctx, info) {
const user = await ctx.db.query.user({ where: { email } });
if (!user) {
throw new Error(`No such user found for email: ${email}`);
}
const valid = await bcrypt.compare(password, user.password);
if (!valid) {
throw new Error('Invalid password');
}
return {
token: jwt.sign({ userId: user.id }, process.env.APP_SECRET),
user,
};
},
// Creation of Post Mutations
async createItem(parent, args, ctx, info) {
return ctx.db.mutation.createItem({ data: { ...args } }, info);
},
async deleteItem(parent, args, ctx, info) {
// TODO - handle auth for deleting an item
return ctx.db.mutation.deleteItem(
{
where: {
id: args.id,
},
},
info
);
},
async updateItem(parent, args, ctx, info) {
const updates = { ...args };
delete updates.id;
return ctx.db.mutation.updateItem({
where: { id: args.id },
data: {
...updates,
},
});
},
async createDraft(parent, { title, text }, ctx, info) {
// const userId = getUserId(ctx);
const userId = getUserId(ctx);
return ctx.db.mutation.createPost(
{
data: {
title,
text,
isPublished: false,
author: {
connect: { id: userId },
},
},
},
info
);
},
async publish(parent, { id }, ctx, info) {
const userId = getUserId(ctx);
const postExists = await ctx.db.exists.Post({
id,
author: { id: userId },
});
if (!postExists) {
throw new Error(`Post not found or you're not the author`);
}
return ctx.db.mutation.updatePost(
{
where: { id },
data: { isPublished: true },
},
info
);
},
async deletePost(parent, { id }, ctx, info) {
const userId = getUserId(ctx);
const postExists = await ctx.db.exists.Post({
id,
author: { id: userId },
});
if (!postExists) {
throw new Error(`Post not found or you're not the author`);
}
return ctx.db.mutation.deletePost({ where: { id } });
},
// Wes Added this brand new one!
async updatePost(parent, args, ctx, info) {
const updatedPost = await ctx.db.mutation.updatePost({
where: { id: args.id },
data: {
title: args.title,
text: args.text,
},
});
return updatedPost;
},
// Send password request
async requestReset(parent, args, ctx, info) {
// 1. find if there is a user with that email
const user = await ctx.db.query.user({ where: { email: args.email } });
if (!user) {
throw new Error(`No user with the email ${args.email}`);
}
console.log(user);
// 2. Set a reset token, and a reset date
// const resetToken = await promisify(randomBytes)(20);
// const resetTokenExpiry = Date.now() + 3600000; // 1 hour from now
// console.log({ resetToken, resetTokenExpiry });
// const res = await ctx.db.mutation.updateUser({
// where: { email: args.email },
// data: { resetToken, resetTokenExpiry },
// });
// console.log(res);
// 3. Send them their token via email
},
};
module.exports = mutations;
|