From f702144fcc91f42a430f6d754491edec289531b5 Mon Sep 17 00:00:00 2001 From: Rohan Ramakrishnan Date: Sat, 3 Sep 2022 17:18:16 -0700 Subject: [PATCH 1/2] adding courses functionality --- app.js | 9 +- controllers/auth.controllers.js | 153 +++++++++++++++--------------- controllers/course.controllers.js | 31 ++++++ models/course.model.js | 25 +++++ models/user.model.js | 4 + routes/auth.routes.js | 4 +- routes/course.routes.js | 10 ++ 7 files changed, 151 insertions(+), 85 deletions(-) create mode 100644 controllers/course.controllers.js create mode 100644 models/course.model.js create mode 100644 routes/course.routes.js diff --git a/app.js b/app.js index e4529e3..65274ee 100644 --- a/app.js +++ b/app.js @@ -6,22 +6,23 @@ const cors = require("cors"); const app = express(); -const authRoutes = require('./routes/auth.routes'); +const authRoutes = require("./routes/auth.routes"); +const courseRoutes = require("./routes/course.routes"); require("dotenv").config(); app.use(bodyParser.urlencoded({ extended: true })); app.use(bodyParser.json()); -app.use(cookieParser(process.env.COOKIE_SECRET)); app.use( cors({ - origin: ["http://localhost:3001"], credentials: true, allowedHeaders: ["Content-Type", "Authorization"], + origin: ["http://localhost:3001"], }) ); -app.use('/auth', authRoutes); +app.use("/auth", authRoutes); +app.use("/course", courseRoutes); mongoose .connect("mongodb://localhost:27017/techoptimumdasboard") diff --git a/controllers/auth.controllers.js b/controllers/auth.controllers.js index 551b4ab..4c3e16d 100644 --- a/controllers/auth.controllers.js +++ b/controllers/auth.controllers.js @@ -10,55 +10,53 @@ sgMail.setApiKey(process.env.SENDGRID_API_KEY); exports.postLoginController = (req, res) => { const email = req.body.email; const password = req.body.password; - const paramsExist = Object.keys(req.query).length > 0; - if (!paramsExist) { - User.findOne({ - email, - }) - .then((users) => { - checkPassword(users.password, password).then((result) => { - if (result) { - generateToken(email) - .then((token) => { - return res - .cookie("token", token, { - maxAge: 1000 * 60 * 60, - httpOnly: true, - signed: true, - }) - .status(200) - .json({ - success: true, - username: users.username, - active: users.active, - }); - }) - .catch((err) => { - console.log(err); - return res.status(505).json({ - success: false, - errType: "tkngenerr", - msg: "Internal Server Error.", - }); - }); - } else { - return res.status(422).json({ - success: false, - msg: "Invalid email or password.", - errType: "lgnfail", - }); - } - }); - }) - .catch((err) => { - res.status(505).json({ + User.findOne({ + email, + }) + .then((users) => { + if (!users) { + return res.status(422).json({ success: false, - msg: "Internal Server Error.", - errType: "dberr", + msg: "Email not recognized.", + errType: "emnnr", }); - console.log(err); + } + checkPassword(users.password, password).then((result) => { + if (result) { + generateToken(email) + .then((token) => { + return res.status(200).json({ + token: token, + success: true, + username: users.username, + active: users.active, + }); + }) + .catch((err) => { + console.log(err); + return res.status(505).json({ + success: false, + errType: "tkngenerr", + msg: "Internal Server Error.", + }); + }); + } else { + return res.status(422).json({ + success: false, + msg: "Invalid email or password.", + errType: "lgnfail", + }); + } }); - } + }) + .catch((err) => { + res.status(505).json({ + success: false, + msg: "Internal Server Error.", + errType: "dberr", + }); + console.log(err); + }); }; exports.postRegisterController = (req, res) => { @@ -108,18 +106,12 @@ exports.postRegisterController = (req, res) => { .catch((err) => { console.log(err); }); - return res - .cookie("token", token, { - maxAge: 1000 * 60 * 60, - signed: true, - httpOnly: true, - }) - .status(200) - .json({ - success: true, - username, - active: false, - }); + return res.status(200).json({ + token: token, + success: true, + username, + active: false, + }); }) .catch((err) => { res.status(505).json({ @@ -158,7 +150,7 @@ exports.postRegisterController = (req, res) => { }; exports.postLogoutController = (req, res) => { - res.clearCookie("token").status(200).json({ success: true }); + res.status(200).json({ success: true }); }; exports.getVerifyController = (req, res) => { @@ -222,28 +214,31 @@ exports.postFPassReq = (req, res) => { }); } else { users.token = verifyToken; - users.save().then((result) => { - const link = `http://localhost:3001/verify/reset-password/${verifyToken}`; - const msg = { - to: email, - from: process.env.FROM_EMAIL, - subject: "Password Reset Requested.", - html: `

You requested a password reset.


Click here to continue.

Sincerely, Tech Optimum

`, - }; - sgMail - .send(msg) - .then((result) => { - console.log("Email sent."); - }) - .catch((err) => { - console.log(err); + users + .save() + .then((result) => { + const link = `http://localhost:3001/verify/reset-password/${verifyToken}`; + const msg = { + to: email, + from: process.env.FROM_EMAIL, + subject: "Password Reset Requested.", + html: `

You requested a password reset.


Click here to continue.

Sincerely, Tech Optimum

`, + }; + sgMail + .send(msg) + .then((result) => { + console.log("Email sent."); + }) + .catch((err) => { + console.log(err); + }); + return; + }) + .then(() => { + res.json({ + success: true, }); - return; - }).then(() => { - res.json({ - success: true, }); - }) } }); }; diff --git a/controllers/course.controllers.js b/controllers/course.controllers.js new file mode 100644 index 0000000..20049fc --- /dev/null +++ b/controllers/course.controllers.js @@ -0,0 +1,31 @@ +const User = require("../models/user.model"); +const Course = require("../models/course.model"); + +exports.postCreateCourseController = (req, res) => { + const name = req.body.courseTitle; + console.log(req.body); + const description = req.body.courseDescription; + const courseParts = req.body.courseParts; + console.log(courseParts, description, name); + Course.findOne({ + name, + }).then((course) => { + if (course) { + return res.json({ + success: false, + code: "coursealrex", + }); + } + const newCourse = new Course({ + courseName: name, + description: description, + user: req.user._id, + notionPageIds: courseParts, + }); + newCourse.save().then((result) => { + return res.json({ + success: true, + }); + }); + }); +}; diff --git a/models/course.model.js b/models/course.model.js new file mode 100644 index 0000000..4ed018c --- /dev/null +++ b/models/course.model.js @@ -0,0 +1,25 @@ +const mongoose = require('mongoose'); + +const Schema = mongoose.Schema; + +const CourseSchema = new Schema({ + courseName: { + type: String, + required: true, + }, + description: { + type: String, + required: true, + }, + user: { + type: Schema.Types.ObjectId, + ref: 'user', + required: true, + }, + notionPageIds: { + type: Object, + required: true, + } +}); + +module.exports = mongoose.model('course', CourseSchema); \ No newline at end of file diff --git a/models/user.model.js b/models/user.model.js index 145e5c9..442b2cc 100644 --- a/models/user.model.js +++ b/models/user.model.js @@ -22,6 +22,10 @@ const UserSchema = new Schema({ token: { type: String, required: false, + }, + courseProgress: { + type: Object, + required: false, } }); diff --git a/routes/auth.routes.js b/routes/auth.routes.js index 0ce44b2..8ce3426 100644 --- a/routes/auth.routes.js +++ b/routes/auth.routes.js @@ -1,5 +1,5 @@ const express = require("express"); -const { body } = require("express-validator/check"); +const { body } = require("express-validator"); const router = express.Router(); @@ -21,7 +21,7 @@ router.post( .contains("[@$!%*#?&]") .withMessage("Password must contain a special character"), body("confirmPassword") - .matches(req.body.password) + .matches("password") .withMessage("Passwords must match"), ], authControllers.postRegisterController diff --git a/routes/course.routes.js b/routes/course.routes.js new file mode 100644 index 0000000..99c74f6 --- /dev/null +++ b/routes/course.routes.js @@ -0,0 +1,10 @@ +const express = require("express"); +const authenticateToken = require("../middleware/authenticateToken"); + +const router = express.Router(); + +const courseControllers = require("../controllers/course.controllers"); + +router.post("/new-course", authenticateToken, courseControllers.postCreateCourseController); + +module.exports = router; \ No newline at end of file From 0a3bb31c61e07926bb0db9ee59eb67fb5db6c761 Mon Sep 17 00:00:00 2001 From: Rohan Ramakrishnan Date: Sat, 3 Sep 2022 17:20:40 -0700 Subject: [PATCH 2/2] creating course functionality --- controllers/course.controllers.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/controllers/course.controllers.js b/controllers/course.controllers.js index 20049fc..0e0e437 100644 --- a/controllers/course.controllers.js +++ b/controllers/course.controllers.js @@ -3,10 +3,8 @@ const Course = require("../models/course.model"); exports.postCreateCourseController = (req, res) => { const name = req.body.courseTitle; - console.log(req.body); const description = req.body.courseDescription; const courseParts = req.body.courseParts; - console.log(courseParts, description, name); Course.findOne({ name, }).then((course) => {