From e0d0baa75ec0bf617f91b6cd779305d4009cae12 Mon Sep 17 00:00:00 2001 From: Wes Bos Date: Fri, 9 Feb 2018 13:31:39 -0500 Subject: 🆒 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/resolvers/Mutation.js | 129 +++++++++++++++++++++++++++++++++++--- 1 file changed, 121 insertions(+), 8 deletions(-) (limited to 'backend/src/resolvers') diff --git a/backend/src/resolvers/Mutation.js b/backend/src/resolvers/Mutation.js index 95be561..003a563 100644 --- a/backend/src/resolvers/Mutation.js +++ b/backend/src/resolvers/Mutation.js @@ -4,6 +4,7 @@ const { forwardTo } = require('prisma-binding'); const { getUserId, Context } = require('../utils'); const { randomBytes } = require('crypto'); const { promisify } = require('util'); +const mail = require('../mail'); const mutations = { // Signup Mutations @@ -136,16 +137,128 @@ const mutations = { } 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 }, - // }); + const resetToken = (await promisify(randomBytes)(20)).toString('hex'); + 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); + console.log(res); // 3. Send them their token via email + const mailRes = await mail.sendMail({ + from: 'wesbos@gmail.com', + to: 'wesbos@gmail.com', + subject: 'Your password reset token', + html: `Here is your reset link: http://localhost:3000/reset?resetToken=${resetToken}`, + }); + + return res.updateUser; + }, + + async resetPassword(parent, args, ctx, info) { + // 1. Check that the passwords match + if (args.password !== args.confirmPassword) { + throw new Error('Passwords do not match'); + } + + // 2. Check that this is a legit resetToken + // 3. Check that it's not expired + // Note: If we didn't need the user here, we could also use db.exists() + const [user] = await ctx.db.query.users({ + where: { + resetToken: args.resetToken, + resetTokenExpiry_gte: Date.now() - 3600000, // within the last hour + }, + }); + + if (!user) { + throw new Error('This token is either invalid or expired.'); + } + + // 4. Hash the password + const password = await bcrypt.hash(args.password, 10); + + // 5. Update the users password + // clean up the resetToken fields at the same time + const updatedUser = await ctx.db.mutation.updateUser({ + where: { email: user.email }, + data: { + password, + resetToken: null, + resetTokenExpiry: null, + }, + }); + + // 6. send back the Auth Payload for the GraphQL request on the client + return { + // TODO: This should use sub instead of userId + token: jwt.sign({ userId: updatedUser.id }, process.env.APP_SECRET), + user: updatedUser, + }; + }, + /* + Add to cart + */ + async addToCart(parent, args, ctx, info) { + console.l('Add to cart calle'); + const userId = getUserId(ctx); + // get the current user + const currentUser = await ctx.db.query.user( + { + where: { id: userId }, + }, + '{ cart { id, quantity item { id } }}' + ); + + // find out if the user currently has this item in their cart + const existingCartItemIndex = currentUser.cart.findIndex(cartItem => cartItem.item.id === args.id); + + if (existingCartItemIndex >= 0) { + console.l('======This item already exists in the cart============'); + const cartItem = currentUser.cart[existingCartItemIndex]; + return ctx.db.mutation.updateCartItem({ + where: { id: cartItem.id }, + data: { + quantity: cartItem.quantity + 1, + }, + }); + } + + const res = await ctx.db.mutation.updateUser({ + where: { id: userId }, + data: { + cart: { + create: [ + { + item: { + connect: { + id: args.id, + }, + }, + quantity: 1, + }, + ], + }, + }, + }); + console.log(res); + // return res; + }, + async removeFromCart(parent, args, ctx, info) { + // delete that cart item + return ctx.db.mutation.deleteCartItem({ + where: { id: args.id }, + }); + // const userId = getUserId(ctx); + // return ctx.db.query.user({ where: { id: userId } }, '{ id, cart { id, quantity }}'); + // const cartItem = await ctx.db.query.cartItem({ + // where: { id: args.id }, + // }); + + // console.log(cartItem); + // return cartItem; }, }; -- cgit v1.3