diff --git a/controllers/users.js b/controllers/users.js new file mode 100644 index 0000000..dcc22c3 --- /dev/null +++ b/controllers/users.js @@ -0,0 +1,62 @@ +import { OAuth2Client } from "google-auth-library"; +import jwt from "jsonwebtoken"; +import Users from "../models/users.js"; + +export async function authenticateByGoogle(req, res, next) { + const client = new OAuth2Client(); + const { JWT_SECRET } = process.env; + + const { credential, clientId } = req.body; + try { + const ticket = await client.verifyIdToken({ + idToken: credential, + audience: clientId + }); + const { email, given_name, family_name, picture } = ticket.getPayload(); + + let user = await Users.findOne({ email }); + if (!user) { + user = await Users.create({ + email, + fName: given_name, + lName: family_name, + picture, + authSource: "google" + }); + } + + user = user.toJSON(); + delete user.password; + delete user.__v; + + const token = jwt.sign({ user }, JWT_SECRET); + res.status(200).json({ data: user, jwt: token }); + } catch (e) { + const error = { statusCode: 401, message: e.message || e }; + next(error); + } +} + +export async function signupByEmail(req, res, next) { + const { JWT_SECRET } = process.env; + const { email, password, firstName, lastName } = req.body; + try { + let user = await Users.findOne({ email }); + if (user) { + const error = { statusCode: 400, message: "User already exists" }; + throw error; + } + + user = await Users.create({ email, password, fName: firstName, lName: lastName, authSource: "self" }); + + user = user.toJSON(); + delete user.password; + delete user.__v; + + const token = jwt.sign({ user }, JWT_SECRET); + res.status(201).json({ data: user, jwt: token }); + } catch (e) { + const error = { statusCode: e.statusCode || 401, message: e.message || e }; + next(error); + } +} diff --git a/routes/users.js b/routes/users.js index 8396a45..7784b61 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,43 +1,11 @@ import dotenv from "dotenv"; import express from "express"; -import { OAuth2Client } from "google-auth-library"; -import jwt from "jsonwebtoken"; -import Users from "../models/users.js"; +import { authenticateByGoogle, signupByEmail } from "../controllers/users.js"; dotenv.config({ path: "./config.env" }); const router = express.Router(); -const client = new OAuth2Client(); -const { JWT_SECRET } = process.env; -router.post("/google", async (req, res) => { - const { credential, clientId } = req.body; - try { - const ticket = await client.verifyIdToken({ - idToken: credential, - audience: clientId - }); - const { email, given_name, family_name, picture } = ticket.getPayload(); - - let user = await Users.findOne({ email }); - if (!user) { - user = await Users.create({ - email, - fName: given_name, - lName: family_name, - picture, - authSource: "google" - }); - } - - user = user.toJSON(); - delete user.password; - delete user.__v; - - const token = jwt.sign({ user }, JWT_SECRET); - res.status(200).json({ data: user, jwt: token }); - } catch (e) { - res.status(400).json({ msg: err }); - } -}); +router.route("/google").post(authenticateByGoogle); +router.route("/signup").post(signupByEmail); export default router;