diff options
Diffstat (limited to 'routes')
-rw-r--r-- | routes/account.js | 184 | ||||
-rw-r--r-- | routes/cats.js | 20 | ||||
-rw-r--r-- | routes/index.js | 93 | ||||
-rw-r--r-- | routes/recipe.js | 379 | ||||
-rw-r--r-- | routes/search.js | 21 |
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; |