Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
969ba92
added login/sign up related packages
aksharkay May 18, 2021
5e6430c
added login/signup features
aksharkay May 18, 2021
ebe1c50
minor edits
aksharkay May 18, 2021
744da02
added template
aksharkay May 18, 2021
325bbaf
minor edits
aksharkay May 18, 2021
f2af3a0
added login/sign up features
aksharkay May 18, 2021
7bb7a2b
edited flash message
aksharkay May 24, 2021
f93d0ff
all cart functions
aksharkay May 24, 2021
4a87174
created and updated schemas
aksharkay May 24, 2021
a671eaa
added fa icon size
aksharkay May 24, 2021
8884712
created and updated routes
aksharkay May 24, 2021
da44c2a
created admin page
aksharkay May 24, 2021
9404d86
added layout templates
aksharkay May 24, 2021
6f0491f
created page layout templates
aksharkay May 24, 2021
ef8edb6
created user profile page
aksharkay May 24, 2021
c078e21
made cart page dynamic and added updation functionalities
aksharkay May 24, 2021
7ea112c
added layout templates
aksharkay May 24, 2021
924bf93
added cart related routes
aksharkay May 24, 2021
b7bb236
created cookies
aksharkay May 24, 2021
9f6d63b
installed new packages
aksharkay May 24, 2021
f8e00ec
made cart page dynamic and added updation functionalities
aksharkay May 24, 2021
b52d2d2
updated fields
aksharkay May 24, 2021
2418e3b
updated variables
aksharkay May 24, 2021
e2b7762
updated checkout
aksharkay May 24, 2021
ec54c92
Add files via upload
VarshithaGudibandi May 25, 2021
1e10b8d
added link hover style
aksharkay May 25, 2021
74249c9
added footer tag
aksharkay May 25, 2021
509d3db
added link to item name and image
aksharkay May 25, 2021
c839fdc
added link to product name
aksharkay May 25, 2021
0bf79ab
added product detail page endpoint
aksharkay May 25, 2021
64cb689
added product detail page
aksharkay May 25, 2021
8691e3c
Merge branch 'Akshar-edits' of https://github.com/VarshithaGudibandi/…
aksharkay May 25, 2021
429750a
updated models
aksharkay May 25, 2021
a432326
added out of stock text
aksharkay May 25, 2021
191a828
linked item qty to stock in DB
aksharkay May 25, 2021
d68e545
made page content dynamic
aksharkay May 25, 2021
b9edd67
refactored content
aksharkay May 25, 2021
b402b20
added file and made content dynamic
aksharkay May 25, 2021
014948a
added more wishlist and cart related routes
aksharkay May 25, 2021
106c21b
minor edits
aksharkay Jun 8, 2021
6c39977
added Try on AR button
aksharkay Jun 8, 2021
aa6b80d
created order confirmation email layout
aksharkay Jun 8, 2021
6988df1
created order confirmation page shown after checkout
aksharkay Jun 8, 2021
dc4daac
added thank you page endpoint
aksharkay Jun 8, 2021
6c5caf8
initial commit
aksharkay Jun 8, 2021
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
349 changes: 297 additions & 52 deletions backend/app.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
const bcrypt = require('bcryptjs');
const User = require('./models/User');
const passport = require('passport');
var mongoose = require('mongoose');
var prodSchema = require('./models/product');
var nodemailer = require('nodemailer')
var ejs = require("ejs");
const { ensureAuthenticated } = require('./config/auth');
const Product = require('./models/Product');
var Cart = require('./models/carts')
var Order = require('./models/Order')

module.exports = function(app){
app.get('/products', async (req,res) => {
var prods = await prodSchema.find({});
//console.log(prods);
res.render('products', {'prods': prods});
});
app.get('/', (req,res) => {
res.render('index');
});
app.get('/contactus', (req,res) => {
res.render('contactus');
});
Expand All @@ -19,55 +19,300 @@ module.exports = function(app){
app.get('/signup', (req,res) => {
res.render('signup');
});
app.get('/cart', (req,res) => {
res.render('cart');
});
app.get('/wishlist', (req,res) => {
res.render('wishlist');
});
app.get('/beaded', async (req,res) => {
var prods = await prodSchema.find({category: 'Beaded'});
//console.log(prods);
res.render('categories/beaded', {'prods': prods});
app.get('/myprofile', (req,res) => {
res.render('my_profile', {user: req.user});
});
app.get('/bracelets', async (req,res) => {
var prods = await prodSchema.find({category: 'Bracelets'});
//console.log(prods);
res.render('categories/bracelets', {'prods': prods});
app.get('/logout', async (req,res) => {
req.logout();
req.flash('success_msg', 'Logout successful!');
res.redirect('login');
});
app.get('/earcuffs', async (req,res) => {
var prods = await prodSchema.find({category: 'Earcuffs'});
//console.log(prods);
res.render('categories/ear_cuffs', {'prods': prods});
app.get('/wishlist', ensureAuthenticated, async (req,res) => {
wishlist = req.user.wishlist;
var prods = [];
for(let name of wishlist){
var prod = await Product.findOne({name: name});
prods.push(prod);
}
// console.log(prods);
res.render('wishlist', {'prods': prods});
});
app.get('/necklaces', async (req,res) => {
var prods = await prodSchema.find({category: 'Necklaces'});
//console.log(prods);
res.render('categories/necklaces', {'prods': prods});
app.post('/auth', (req,res,next) => {
passport.authenticate('local', {
successRedirect: '/',
failureRedirect: '/login',
failureFlash: true,
})(req,res,next);
});
app.get('/pearls', async (req,res) => {
var prods = await prodSchema.find({category: 'Pearls'});
//console.log(prods);
res.render('categories/pearls', {'prods': prods});
});
app.get('/polymerclay', async (req,res) => {
var prods = await prodSchema.find({category: 'Polymer Clay'});
//console.log(prods);
res.render('categories/polymer_clay', {'prods': prods});
app.get('/details/:id', (req,res,next) => {
var productID = req.params.id;
Product.findById(productID, (err, product) => {
if(err){
return res.redirect('back');
}
try{
res.render('product_details', {'product':product, 'wishlist': req.user.wishlist});
}
catch(err){
res.render('product_details', {'product':product});
}
});
})
app.get('/add-to-cart/:id', (req,res,next) => {
var productID = req.params.id;
var cart = new Cart(req.session.cart ? req.session.cart : {});

Product.updateOne({_id: productID}, {$inc: {stock: -1}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('back');
}
});
Product.findById(productID, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('back');
}
cart.add(product, product._id);
req.session.cart = cart;
// if(typeof req.user.wishlist != 'undefined'){
// if(req.user.wishlist.includes(product.name)){
// User.updateOne({email: req.user.email}, {$pullAll: {wishlist: [product.name]}}, (err,product) => {
// if(err){
// req.flash('error_msg','Error. Please try again.')
// return res.redirect('back');
// }
// });
// }
// }
req.flash('success_msg','Item added to cart!')
res.redirect('back');
});
})
app.get('/add-to-wishlist/:name', ensureAuthenticated, (req,res,next) => {
User.updateOne({email: req.user.email}, {$push: {wishlist: [req.params.name]}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('/');
}
req.flash('success_msg','Item removed from wishlist!')
res.redirect('back');
});
})
app.get('/remove-from-wishlist/:name', ensureAuthenticated, (req,res,next) => {
User.updateOne({email: req.user.email}, {$pullAll: {wishlist: [req.params.name]}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('/');
}
req.flash('success_msg','Item removed from wishlist!')
res.redirect('back');
});
})
app.get('/reduce/:id', (req,res,next) => {
var productID = req.params.id;
Product.updateOne({_id: productID}, {$inc: {stock: 1}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('back');
}
});
var cart = new Cart(req.session.cart ? req.session.cart : {});
cart.reduceByOne(productID);
req.session.cart = cart;
res.redirect('/cart');
})
app.get('/remove-from-cart/:id', (req,res,next) => {
var cart = new Cart(req.session.cart);
var productID = req.params.id;
var incQty = cart.items[productID].qty;
Product.updateOne({_id: productID}, {$inc: {stock: incQty}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('back');
}
});
var cart = new Cart(req.session.cart);
cart.removeItem(productID);
req.session.cart = cart;
res.redirect('/cart');

});
app.get('/tassels', async (req,res) => {
var prods = await prodSchema.find({category: 'Tassels'});
//console.log(prods);
res.render('categories/tassels', {'prods': prods});
app.get('/clear-cart', (req,res,next) => {
var cart = new Cart(req.session.cart);
for(const property in cart.items){
var productID = cart.items[property].item._id
var incQty = cart.items[property].qty
Product.updateOne({_id: productID}, {$inc: {stock: incQty}}, (err,product) => {
if(err){
req.flash('error_msg','Error. Please try again.')
return res.redirect('back');
}
});
}
req.session.cart = null;
res.redirect('/cart');

});
app.get('/threads', async (req,res) => {
var prods = await prodSchema.find({category: 'Threads'});
//console.log(prods);
res.render('categories/threads', {'prods': prods});
app.get('/cart', async (req,res) => {
if(!req.session.cart){
return res.render('cart', {products: null});
}
var cart = new Cart(req.session.cart);
var prods = [];
var prod = {};
for(const property in cart.items){
var prod = {};
var product = await Product.findById(property);
prod = {
'_id': cart.items[property].item._id,
'name': cart.items[property].item.name,
'price': cart.items[property].item.price,
'qty': cart.items[property].qty,
'total': cart.items[property].price,
'path': cart.items[property].item.imgPath,
'stock': product.stock
}
prods.push(prod);
}

res.render('cart', {products: prods, totalPrice: cart.totalPrice});
});
app.get('/wiredearrings', async (req,res) => {
var prods = await prodSchema.find({category: 'Wired Earrings'});
//console.log(prods);
res.render('categories/wired_earrings', {'prods': prods});
app.get('/checkout', ensureAuthenticated, (req,res,next) => {
if(!req.session.cart){
return res.redirect('/cart');
}
console.log(req.body.note);
var cart = new Cart(req.session.cart);
var prods = [];
for(const property in cart.items){
var prod = {};
prod = {
'_id': cart.items[property].item._id,
'name': cart.items[property].item.name,
'price': cart.items[property].item.price,
'qty': cart.items[property].qty,
'total': cart.items[property].price,
}
prods.push(prod);
}
var order = new Order({
email: req.user.email,
cart: prods,
// note: note,
totalAmount: cart.totalPrice,
totalQty: cart.totalQty,
});
order.save((err,result) => {
if(err){
req.flash('error_msg', 'Order placement unsuccessful. Please try again.')
return res.redirect('/cart');
}
var transporter = nodemailer.createTransport({
service: 'gmail',
auth: {
user: 'elysianhandmade.official@gmail.com',
pass: 'Elysian@1234'
}
});
ejs.renderFile('./views/confirmation_mail.ejs', {order: order}, (err,data)=>{
if(err){
console.log(err);
}
else{
var mailOptions = {
from: 'elysianhandmade.official@gmail.com',
to: req.user.email,
subject: 'Order Confirmed',
html: data
};

transporter.sendMail(mailOptions, (err, info) => {
if(err){
console.log(err);
}
else{
console.log('Email sent: '+ info.response);
}
});
}
})

// req.flash('success_msg', 'Order placed successfully!');
req.session.cart = null;
res.render('thank_you');
})
})
app.post('/register', (req,res) => {
//console.log(req.body);
const { firstname, lastname, email, contact, password, password2 } = req.body;
let errors = [];
// console.log({ firstname, lastname, email, contact, password, password2 });

//Check if any fields are empty
if(!firstname || !lastname || !email || !contact || !password || !password2){
errors.push({ msg: 'Please fill in all fields.' });
}

//Check if passwords match
if(password !== password2){
errors.push({ msg: 'Passwords do no match.' })
}

//Check password length
if(password.length < 6){
errors.push({ msg: 'Password should be atleast 6 characters.'})
}

if(errors.length > 0){
// console.log(errors);
res.render('signup', {
errors,
firstname,
lastname,
email,
contact,
password,
password2,
});
}
else{
User.findOne({email: email}).then(user => {
if(user){
errors.push({msg: 'E-mail already exists.'})
res.render('signup', {
errors,
firstname,
lastname,
email,
contact,
password,
password2,
});
}
else{
const newUser = new User({
firstName: firstname,
lastName: lastname,
email,
password,
contact,
});

bcrypt.genSalt(10, (err,salt) =>
bcrypt.hash(newUser.password, salt, (err, hash) => {
if(err) throw err;

newUser.password = hash;
newUser.save()
.then((user) => {
req.flash('success_msg', 'Sign up successful! You can now login.')
res.redirect('/login');
})
.catch(err => console.log(err));
}))
}
})
}
});
};
17 changes: 17 additions & 0 deletions backend/config/auth.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
module.exports = {
ensureAuthenticated: function(req,res,next) {
if(req.isAuthenticated()){
return next();
}

str=req.url.substring(1);
if(str=='checkout'){
req.flash('error_msg', `Please log in to ${str}.`);
}
else{
req.flash('error_msg', `Please log in to access your ${str}.`);
}

res.redirect('/login');
}
}
Loading