summaryrefslogtreecommitdiff
path: root/routes
diff options
context:
space:
mode:
Diffstat (limited to 'routes')
-rw-r--r--routes/account.js184
-rw-r--r--routes/cats.js20
-rw-r--r--routes/index.js93
-rw-r--r--routes/recipe.js379
-rw-r--r--routes/search.js21
5 files changed, 697 insertions, 0 deletions
diff --git a/routes/account.js b/routes/account.js
new file mode 100644
index 0000000..7702a0c
--- /dev/null
+++ b/routes/account.js
@@ -0,0 +1,184 @@
+const express = require('express'),
+ router = express.Router({ mergeParams: true }),
+ fs = require('fs'),
+ middleware = require('../middleware'),
+ Recipe = require('../models/recipe'),
+ Step = require('../models/step'),
+ User = require('../models/user'),
+ Account = require('../models/account');
+
+// SHOW
+router.get('/:id', middleware.getUser, middleware.getCats, (req, res) => {
+ let at = {
+ id: req.daUser._id,
+ username: req.daUser.username
+ }
+ Account.findOne({ author: at }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log('found account: ', foundAccount);
+ let ath = {
+ id: foundAccount.author.id,
+ username: foundAccount.author.username
+ }
+ Recipe.find({ author: ath }, (err, foundRecipes) => {
+ if(err) {
+ console.log(err);
+ } else {
+ console.log('found recipes: ', foundRecipes);
+ const page = 'account';
+ res.render('account/account', {
+ page: page,
+ usr: req.user,
+ account: foundAccount,
+ cats: req.cats,
+ recipes: foundRecipes
+ });
+ }
+ });
+ }
+ });
+});
+
+//EDIT BIO PAGE
+router.get('/:id/bio/edit', middleware.checkAccountOwnership, (req, res) => {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page = 'account';
+ res.render('account/editBio', {
+ page: page,
+ usr: req.user,
+ account: foundAccount
+ });
+ }
+ });
+});
+
+// UPDATE
+router.put('/:id', middleware.checkAccountOwnership, (req, res) => {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ foundAccount.bio.name = req.body.bio.name;
+ foundAccount.bio.website = req.body.bio.website;
+ foundAccount.bio.about = req.body.bio.about;
+ foundAccount.save();
+ res.redirect(`/account/${req.params.id}`);
+ }
+ });
+});
+
+// SAVED RECIPES
+router.get(`/:id/saved`, middleware.checkAccountOwnership, (req, res) => {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }).populate('favorites').exec((err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page ='account';
+ res.render(`account/saved`, {
+ page: page,
+ usr: req.user,
+ recipes: foundAccount.favorites,
+ account: foundAccount
+ });
+ }
+ })
+});
+
+//CHANGE PASSWORD
+router.get(`/:id/changepass`, middleware.checkAccountOwnership, (req, res) => {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page = 'account'
+ res.render(`account/changepass`, {
+ page: page,
+ usr: req.user,
+ account: foundAccount
+ })
+ }
+ });
+});
+
+router.post(`/:id/changepass`, middleware.checkAccountOwnership, (req, res) => {
+ User.findById(req.params.id, (err, foundUser) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ foundUser.changePassword(req.body.oldpassword, req.body.newpassword, (err) => {
+ if(err) {
+ console.log(`Incorrect password!`);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log(`Password was changed!`);
+ req.flash("success", `Password was changed`);
+ res.redirect(`/account/${req.params.id}`);
+ }
+ });
+ }
+ });
+});
+
+//DELETE ACCOUNT/USER
+router.delete(`/:id`, middleware.checkAccountOwnership, (req, res) => {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOneAndDelete({ author: ath }, (err) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log('Deleted account...');
+ }
+ });
+ User.findByIdAndDelete(req.user._id, (err) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log(`Deleted user...`);
+ req.flash("success", `Deleted user...`);
+
+ }
+ });
+ const userDir = `/var/www/inter-kitchen/public/images/${req.user.username}`;
+ fs.rmdir(userDir, { recursive: true }, (err) => {
+ if(err) console.log(err);
+ console.log(`Deleted ${userDir}`);
+ });
+ res.redirect(`/`);
+});
+
+module.exports = router;
diff --git a/routes/cats.js b/routes/cats.js
new file mode 100644
index 0000000..bf74eeb
--- /dev/null
+++ b/routes/cats.js
@@ -0,0 +1,20 @@
+const express = require('express'),
+ router = express.Router({ mergeParams: true }),
+ Recipe = require('../models/recipe'),
+ Step = require('../models/step'),
+ Account = require('../models/account'),
+ middleware = require('../middleware');
+
+router.get('/:name', middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'home'
+ res.render('category/cats', {
+ usr: req.user,
+ page: page,
+ recipes: req.recipes,
+ popular: req.lmPop,
+ cats: req.cats,
+ query: req.params.name
+ })
+});
+
+module.exports = router;
diff --git a/routes/index.js b/routes/index.js
new file mode 100644
index 0000000..14b90a5
--- /dev/null
+++ b/routes/index.js
@@ -0,0 +1,93 @@
+const express = require('express'),
+ router = express.Router(),
+ fs = require('fs'),
+ User = require("../models/user"),
+ Account = require("../models/account"),
+ Recipe = require('../models/recipe'),
+ middleware = require('../middleware'),
+ passport = require('passport');
+
+// INDEX
+router.get('/', middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'home';
+ res.render('index', {
+ page: page,
+ usr: req.user,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+});
+
+// LOGIN
+router.get('/login', middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'login';
+ res.render('login', {
+ page: page,
+ usr: req.user,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+});
+
+router.post(
+ "/login",
+ passport.authenticate("local", {
+ successRedirect: "/",
+ failureRedirect: "/login",
+ }),
+ (req, res) => {}
+);
+
+// REGISTER
+router.get('/register', middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'register';
+ res.render('register', {
+ page: page,
+ usr: req.user,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+});
+
+router.post("/register", (req, res) => {
+ let newUser = new User({ username: req.body.username });
+ User.register(newUser, req.body.password, (err, user) => {
+ if (err) {
+ console.log(err);
+ req.flash("error", err.message);
+ return res.redirect("/register");
+ }
+ passport.authenticate("local")(req, res, () => {
+ Account.create(req.body.account, (err, newAccount) => {
+ if (err) {
+ console.log(err);
+ req.flash("error", err.message);
+ } else {
+ const dpath = `/var/www/inter-kitchen/public/images/${req.user.username}`;
+ fs.mkdir(dpath, (err) => {
+ if(err) throw err;
+ console.log(`Created directory ${dpath}`);
+ })
+
+ newAccount.author.id = user._id;
+ newAccount.author.username = user.username;
+ newAccount.bio.name = req.body.name;
+ newAccount.bio.website = req.body.website;
+ newAccount.bio.about = req.body.about;
+ newAccount.save();
+ req.flash("success", "Welcome " + user.username);
+ res.redirect("/");
+ }
+ });
+ });
+ });
+});
+
+// LOGOUT
+router.get("/logout", (req, res) => {
+ req.logout();
+ req.flash("success", "Logged out");
+ res.redirect("/");
+});
+
+module.exports = router;
diff --git a/routes/recipe.js b/routes/recipe.js
new file mode 100644
index 0000000..0e63a96
--- /dev/null
+++ b/routes/recipe.js
@@ -0,0 +1,379 @@
+const express = require('express'),
+ router = express.Router({ mergeParams: true }),
+ fs = require('fs'),
+ busboy = require('connect-busboy'),
+ middleware = require('../middleware'),
+ Account = require('../models/account'),
+ Recipe = require('../models/recipe'),
+ Step = require('../models/step');
+
+// CREATE PAGE
+router.get('/create', middleware.isLoggedIn, middleware.getCats, middleware.getPops, (req, res) => {
+ const dpath = `/var/www/inter-kitchen/public/images/${req.user.username}`;
+ fs.readdir(dpath, (err, files) => {
+ if(err) throw err;
+ const page = 'create';
+ res.render('recipe/create', {
+ page: page,
+ usr: req.user,
+ popular: req.lmPop,
+ cats: req.cats,
+ files: files
+ });
+ });
+});
+
+//Create
+router.post('/', middleware.isLoggedIn, (req, res) => {
+ let author = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ req.body.recipe.author = author;
+ Recipe.create(req.body.recipe, (err, newRecipe) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('/recipe/create');
+ } else {
+ newRecipe.isLiked = 0;
+ newRecipe.save();
+ console.log('Created recipe: ', newRecipe);
+ }
+ });
+ const maxSteps = [
+ req.body.step1, req.body.step2, req.body.step3,
+ req.body.step4, req.body.step5, req.body.step6,
+ req.body.step7, req.body.step8, req.body.step9,
+ req.body.step10, req.body.step11, req.body.step12,
+ req.body.step13, req.body.step14, req.body.step15,
+ req.body.step16, req.body.step17, req.body.step18,
+ req.body.step19, req.body.step20
+ ];
+ for( i = 0; i <= req.body.recipe.nsteps - 1; i++ ) {
+ Step.create(maxSteps[i], (err, newStep) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('/recipe/create');
+ } else {
+ console.log('Created step: ', newStep);
+ Recipe.findOne({title: req.body.recipe.title}, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ foundRecipe.steps.push(newStep);
+ foundRecipe.save();
+ console.log('Full recipe: ', foundRecipe);
+ }
+ });
+ }
+ });
+ }
+ res.redirect(`/`);
+});
+
+// SHOW UPLOAD
+router.get(`/image/upload`, middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'create';
+ res.render(`recipe/upload`, {
+ page: page,
+ usr: req.user,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+});
+
+// UPLOAD
+router.post(`/image`, middleware.isLoggedIn, (req, res) => {
+ let fstream;
+ req.pipe(req.busboy);
+ req.busboy.on('file', (fieldname, file, filename) => {
+ console.log(`Uploading ${fieldname}`);
+ const home = `/var/www/inter-kitchen/public/images/${req.user.username}/`;
+ fstream = fs.createWriteStream(home + filename);
+ file.pipe(fstream);
+ fstream.on('close', () => {
+ console.log(`Finished uploading ${filename}`);
+ res.redirect(`/recipe/create`);
+ })
+ })
+});
+
+// SHOW
+router.get('/:id', middleware.getCats, middleware.getPops, middleware.getAccount, (req, res) => {
+ Recipe.findById(req.params.id).populate('steps').exec((err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const splitted = (ing) => {
+ return ing.toString().split(', ');
+ }
+ const ig = splitted(foundRecipe.ingridients); // Separate ingridients
+ foundRecipe.steps.sort((a, b) => a.number - b.number); // Make sure steps are in numerical order
+ if(req.user) {
+ let recAuthor = {
+ id: foundRecipe.author.id,
+ username: foundRecipe.author.username
+ }
+ Account.findOne({ author: recAuthor }, (err, foundRecAuthor) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page = 'show';
+ res.render('recipe/show', {
+ page: page,
+ usr: req.user,
+ account: req.daAccount,
+ recipe: foundRecipe,
+ recAuthor: foundRecAuthor,
+ ingridients: ig,
+ popular: req.lmPop,
+ recipes: req.recipes,
+ cats: req.cats
+ });
+ }
+ });
+ } else {
+ let a = {
+ id: foundRecipe.author.id,
+ username: foundRecipe.author.username
+ }
+ Account.findOne({ author: a }, (err, foundRecAuthor) => {
+ if(err) {
+ console.log(err);
+
+ } else {
+ const page = 'show';
+ res.render('recipe/show', {
+ page: page,
+ usr: req.user,
+ recAuthor: foundRecAuthor,
+ recipe: foundRecipe,
+ ingridients: ig,
+ popular: req.lmPop,
+ recipes: req.recipes,
+ cats: req.cats
+ });
+ }
+ });
+ }
+ }
+ });
+});
+
+// EDIT
+router.get('/:id/edit', middleware.checkRecipeOwnership, middleware.getCats, middleware.getPops, (req, res) => {
+ Recipe.findById(req.params.id).populate('steps').exec((err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const dpath = `/var/www/inter-kitchen/public/images/${req.user.username}`;
+ fs.readdir(dpath, (err, files) => {
+ if(err) throw err;
+ const page = 'account'
+ foundRecipe.steps.sort((a, b) => a.number - b.number); // Make sure steps are in numerical order
+ res.render('recipe/edit', {
+ page: page,
+ usr: req.user,
+ recipe: foundRecipe,
+ recipes: req.recipes,
+ popular: req.lmPop,
+ cats: req.cats,
+ files: files
+ });
+
+ })
+ }
+ });
+});
+
+// UPDATE
+router.put('/:id', middleware.checkRecipeOwnership, (req, res) => {
+ Recipe.findByIdAndUpdate(req.params.id, req.body.recipe, (err, updatedRecipe) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log(`Updated Recipe: ${updatedRecipe}`);
+ res.redirect(`/recipe/${req.params.id}`);
+ }
+ });
+});
+
+// Delete
+router.delete('/:id', middleware.checkRecipeOwnership, (req, res) => {
+ Recipe.findByIdAndRemove(req.params.id, (err) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ res.redirect(`/account/${req.user._id}`);
+ }
+ });
+});
+
+// EDIT STEPS
+router.get('/:id/step/:sid/edit', middleware.checkStepOwnership, middleware.getCats, middleware.getPops, (req, res) => {
+ Recipe.findById(req.params.id, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ Step.findById(req.params.sid, (err, foundStep) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page = 'account'
+ res.render('recipe/editSteps', {
+ page: page,
+ usr: req.user,
+ step: foundStep,
+ recipe: foundRecipe,
+ recipes: req.recipes,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+ }
+ });
+ }
+ });
+});
+
+// UPDATE STEPS
+router.put('/:id/step/:sid', middleware.checkStepOwnership, (req, res) => {
+ Step.findByIdAndUpdate(req.params.sid, req.body.step, (err, updatedStep) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log(`Updated step: ${updatedStep}`);
+ res.redirect(`/recipe/${req.params.id}/edit`);
+ }
+ });
+});
+
+// SHOW CREATE STEP
+router.get('/:id/step/create', middleware.checkRecipeOwnership, middleware.getCats, middleware.getPops, (req, res) => {
+ Recipe.findById(req.params.id, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ const page = 'create';
+ res.render('recipe/createStep', {
+ page: page,
+ usr: req.user,
+ recipe: foundRecipe,
+ recipes: req.recipes,
+ popular: req.lmPop,
+ cats: req.cats
+ });
+ }
+ });
+});
+
+// CREATE A NEW STEP
+router.post('/:id/step', middleware.checkRecipeOwnership, (req, res) => {
+ Step.create(req.body.newStep, (err, newStep) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ console.log('Created step: ', newStep);
+ Recipe.findOne({_id: req.params.id}, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ foundRecipe.steps.push(newStep);
+ foundRecipe.save();
+ console.log('Full recipe: ', foundRecipe);
+ }
+ });
+ }
+ res.redirect(`/recipe/${req.params.id}/edit`);
+ });
+});
+
+// DELETE STEP
+router.delete('/:id/step/:sid', middleware.checkStepOwnership, (req, res) => {
+ Step.findByIdAndRemove(req.params.sid, (err) => {
+ if(err) {
+ console.log(err);
+ req.flash("error", err.message);
+ res.redirect('back');
+ } else {
+ res.redirect(`/recipe/${req.params.id}/edit`);
+ }
+ })
+});
+
+// SAVE RECIPE
+router.put('/:id/save', middleware.isLoggedIn, (req, res) => {
+ Recipe.findById(req.params.id, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ } else {
+ if(!(foundRecipe.isLiked)) {
+ foundRecipe.isLiked = 1;
+ foundRecipe.save();
+ foundAccount.favorites.push(foundRecipe);
+ foundAccount.save();
+ res.redirect(`/recipe/${req.params.id}`);
+ } else {
+ foundRecipe.isLiked = foundRecipe.isLiked + 1;
+ foundRecipe.save();
+ foundAccount.favorites.push(foundRecipe);
+ foundAccount.save();
+ res.redirect(`/recipe/${req.params.id}`);
+ }
+ }
+ });
+ }
+ });
+})
+
+// UNSAVE RECIPE
+router.put(`/:id/unsave`, (req, res) => {
+ Recipe.findById(req.params.id, (err, foundRecipe) => {
+ if(err) {
+ console.log(err);
+ } else {
+ let ath = {
+ id: req.user._id,
+ username: req.user.username
+ }
+ Account.findOne({ author: ath }, (err, foundAccount) => {
+ if(err) {
+ console.log(err);
+ } else {
+ foundRecipe.isLiked = foundRecipe.isLiked - 1;
+ foundRecipe.save();
+ console.log(foundAccount.favorites);
+ const index = foundAccount.favorites.indexOf(req.params.id);
+ if(index > -1) {
+ foundAccount.favorites.splice(index, 1);
+ }
+ console.log(foundAccount.favorites);
+ foundAccount.save();
+ console.log(foundAccount.favorites);
+ res.redirect(`/recipe/${req.params.id}`);
+ }
+ });
+ }
+ })
+});
+
+module.exports = router;
diff --git a/routes/search.js b/routes/search.js
new file mode 100644
index 0000000..47e672b
--- /dev/null
+++ b/routes/search.js
@@ -0,0 +1,21 @@
+const express = require('express'),
+ router = express.Router(),
+ User = require("../models/user"),
+ Account = require("../models/account"),
+ Recipe = require('../models/recipe'),
+ middleware = require('../middleware');
+
+// SEARCH PAGE
+router.get('/:query', middleware.getCats, middleware.getPops, (req, res) => {
+ const page = 'search';
+ res.render('search', {
+ usr: req.user,
+ page: page,
+ recipes: req.recipes,
+ popular: req.lmPop,
+ cats: req.cats,
+ query: req.params.query
+ })
+});
+
+module.exports = router;