const express = require('express'); const path = require('path'); const bcrypt = require('bcrypt'); const session = require('express-session'); //const ejs = require('ejs'); const mongoose = require('mongoose'); const EntryItem = require('./models/entryItem'); const User = require('./models/user'); require('dotenv').config(); // for global var things like mongodb uri const app = express(); // connect to db mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(console.log('Connected to MongoDB database.')) .catch(err => console.log(err)); const db = mongoose.connection; db.on('error', console.error.bind(console, 'connection error:')); app.use(express.static(path.join(__dirname, 'public'))); app.use(session({ secret: 'deez nuts', resave: true, saveUninitialized: false, cookie: { maxAge: 2678000 * 1000 } })); app.set('view engine', 'ejs'); app.use(express.urlencoded({ extended: false })); // only here so it can work // index app.get('/', async (req, res) => { //const todoItems = await TodoItem.find(); User.findById(req.session.userId) .exec(async (error, user) => { if (error) { res.render('index', { req: req, User: User, name: null }); } else { if (user === null) { //let err = new Error('Not logged in!'); res.render('index', { req: req, User: User, name: null }); //return err.status = 400; //return next(err); } else { const entryItems = EntryItem; // const entryItems = await EntryItem.find({user: user.name}); //console.log(await entryItems.find({"type": "purchase"})); // (await entryItems.find({ username: user.name, "type": "purchase" })).forEach(entryItem => { // working // }); // let carF; // let sellerF; // let priceF; // let dateF; const loop = await EntryItem.find({ "type": "purchase", user: user.username }); //console.log(user.username) //console.log(loop) // (await loop).forEach(entryItem => { // carF = entryItem.cars; // sellerF = entryItem.seller; // priceF = entryItem.price; // dateF = entryItem.date; // }); // let carX; // let sellerX; // let priceX; // let dateX; const loop2 = await EntryItem.find({ "type": "sale", "user": user.username }); // (await loop2).forEach(entryItem => { // carX = entryItem.cars; // sellerX = entryItem.seller; // priceX = entryItem.price; // dateX = entryItem.date; // }); // let carY; // let sellerY; // let priceY; // let dateY; const loop3 = await EntryItem.find({ "type": "trade", "user": user.username }); // (await loop3).forEach(entryItem => { // carY = entryItem.cars; // sellerY = entryItem.seller; // priceY = entryItem.price; // dateY = entryItem.date; // }); return res.render('index', { req: req, User: User, name: user.username, entryItems: entryItems, user: user, loop: loop, // carF: carF, // sellerF: sellerF, // priceF: priceF, // dateF: dateF, loop2: loop2, // carX: carX, // sellerX: sellerX, // priceX: priceX, // dateX: dateX, loop3: loop3, // carY: carY, // sellerY: sellerY, // priceY: priceY, // dateY: dateY, }); // (await loop1).forEach(entryItem => { // }) // loop.forEach(entryItem => { // parms = parms; // }); // const entryItemsPurchase = (await entryItems.find({ username: user.name, "type": "purchase" })).forEach(entryItem => {}); // const entryItemsSale = (await entryItems.find({ username: user.name, "type": "sale" })).forEach(entryItem => {}); // const entryItemsTrade = (await entryItems.find({ username: user.name, "type": "trade" })).forEach(entryItem => {}); //entryItems.find({ username: user.name, "type": "trade" }).forEach(entryItem => {}); // entryItems.find({"user": user.username, "type": "purchase"}).forEach(entryItem => { // console.log(entryItemsPurchase.forEach(entryItem => { // entryItem.cars; // })); } } }); }); // if 404, redir to root // app.get('*', (req, res) => { // res.redirect('/'); // }); app.get('/login', (req, res) => { res.render('login'); }); app.get('/signup', (req, res) => { res.render('signup'); }); app.get('/api/v1/entries', async (req, res) => { let resAlt = 12 + await EntryItem.countDocuments(); res.json({ entries: resAlt }); }); app.get('/api/v1/users', async (req, res) => { let resAlt = 29 + await User.countDocuments(); res.json({ entries: resAlt }); }); // create new db entry on post app.post('/submitEntry', async (req, res) => { User.findById(req.session.userId) .exec(async (error, user) => { if (error) { return res.render('error'); } else { if (user === null) { return res.render('error'); } else { await EntryItem.create({ user: user.username, type: req.body.transactionType, cars: req.body.carsType, seller: req.body.sellerType, price: req.body.priceType, date: new Date() }); } return res.redirect('/'); } }); res.redirect('/'); }); app.post('/login', async (req, res) => { if (req.body.userLogin && req.body.passLogin) { authenticate = (username, password, callback) => { User.findOne({ username: username }) .exec((err, user) => { if (err) { return res.render('error'); } else if (!user) { return res.render('error'); } bcrypt.compare(password, user.password, (err, result) => { if (result === true) { return callback(null, user); } else { return callback(); } }); }); }; authenticate(req.body.userLogin, req.body.passLogin, (error, user) => { if (error || !user) { //let err = new Error('Wrong username or password.'); //err.status = 401; return res.render('error'); } else { req.session.userId = user._id; return res.redirect('/'); } }); } }); app.post('/signup', async (req, res) => { if (req.body.userSignup && req.body.passSignup) { let hashedPass = bcrypt.hash(req.body.passSignup, 10); const userData = { email: req.body.emailSignup, username: req.body.userSignup, password: await hashedPass }; User.create(userData, (err, user) => { if (err) { return res.render('error'); } else { req.session.userId = user._id; return res.redirect('/login'); } }); } }); app.post('/logout', (req, res, next) => { if (req.session) { req.session.destroy((err) => { if (err) { return res.render('error'); } else { return res.redirect('/'); } }); } }); app.get('/logout', (req, res, next) => { if (req.session) { req.session.destroy((err) => { if (err) { return res.render('error'); } else { return res.redirect('/'); } }); } }); app.get('/profile', async (req, res, next) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error'); } else { if (user === null) { //let err = new Error('Not logged in!'); return res.render('login', { req: req, User: User }); //return err.status = 400; //return next(err); } else { return res.render('profile', { req: req, User: User, name: user.username }); } } }); }); app.get('/profile/legacy', async (req, res, next) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error'); } else { if (user === null) { return res.json({ name: 'null' }); } else { return res.json({ name: user.username }); } } }); }); app.get('/error', (req, res) => { res.render('error'); }); app.get('/terms', (req, res) => { res.render('terms'); }); app.listen(80); console.log(`Listening on port 80.`); // honestly have no idea why it says port as undefined fix this when u feel like it )