const express = require('express'); const path = require('path'); const bcrypt = require('bcrypt'); const session = require('express-session'); const formidable = require('formidable'); const quotes = require('quotes-go'); const fs = require('fs'); //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) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { //let err = new Error('Not logged in!'); res.render('index', { req: req, User: User, name: null, quote: quotes.getRandomQuote() }); //return err.status = 400; //return next(err); } else { const entryItems = EntryItem; const loop = await EntryItem.find({ "type": "purchase", user: user.username }); const loopCount = await EntryItem.find({ "type": "purchase", "user": user.username }).countDocuments(); const loop2 = await EntryItem.find({ "type": "sale", "user": user.username }); const loop2Count = await EntryItem.find({ "type": "sale", "user": user.username }).countDocuments(); const loop3 = await EntryItem.find({ "type": "trade", "user": user.username }); const loop3Count = await EntryItem.find({ "type": "trade", "user": user.username }).countDocuments(); let EntryCount = await EntryItem.countDocuments(); let UserCount = await User.countDocuments(); let rawUptime = process.uptime(); const date = new Date(rawUptime * 1000); const days = date.getUTCDate() - 1, hours = date.getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds(); let segments = []; if (days > 0) segments.push(days + ' day' + ((days == 1) ? '' : 's')); if (hours > 0) segments.push(hours + ' hour' + ((hours == 1) ? '' : 's')); if (minutes > 0) segments.push(minutes + ' minute' + ((minutes == 1) ? '' : 's')); if (seconds > 0) segments.push(seconds + ' second' + ((seconds == 1) ? '' : 's')); if (milliseconds > 0) segments.push(milliseconds + ' millisecond' + ((seconds == 1) ? '' : 's')); const dateString = segments.join(', '); return res.render('index', { req: req, User: User, name: user.username, entryItems: entryItems, user: user, loop: loop, loopCount: loopCount, loop2: loop2, loop2Count: loop2Count, loop3: loop3, loop3Count: loop3Count, EntryCount: EntryCount, UserCount: UserCount, dateString: dateString, quote: quotes.getRandomQuote() }); } } }); }); // if 404, redir to root // app.get('*', (req, res) => { // res.redirect('/'); // }); app.get('/login', (req, res) => { res.render('login', { quote: quotes.getRandomQuote() }); }); app.get('/signup', (req, res) => { res.render('signup', { quote: quotes.getRandomQuote() }); }); 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', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Not logged in.' }); } 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(req.get('referer')); } } }); 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', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else if (!user) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown user.' }); } 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', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown username or password.' }); } else { req.session.userId = user._id; if (req.get('referer') == 'http://' + req.get('host') + '/login' || req.get('referer') == 'https://' + req.get('host') + '/login') { return res.redirect('/'); } return res.redirect(req.get('referer')); } }); } }); 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, registrationIP: req.headers['x-forwarded-for'] || req.connection.remoteAddress }; User.create(userData, (err, user) => { if (err) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Username already exists.' }); } else { req.session.userId = user._id; return res.redirect('/'); } }); } }); app.post('/logout', (req, res, next) => { if (req.session) { req.session.destroy((err) => { if (err) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { return res.redirect('/'); } }); } }); // app.get('/logout', (req, res, next) => { // if (req.session) { // req.session.userId.destroy((err) => { // if (err) { // return res.render('error', { // quote: quotes.getRandomQuote(), // errorMsg: 'Unknown error.' // }); // } else { // return res.redirect('/'); // } // }); // } // }); app.get('/profile', async (req, res, next) => { let EntryCount = await EntryItem.countDocuments(); let UserCount = await User.countDocuments(); let rawUptime = process.uptime(); const date = new Date(rawUptime * 1000); const days = date.getUTCDate() - 1, hours = date.getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds(); let segments = []; if (days > 0) segments.push(days + ' day' + ((days == 1) ? '' : 's')); if (hours > 0) segments.push(hours + ' hour' + ((hours == 1) ? '' : 's')); if (minutes > 0) segments.push(minutes + ' minute' + ((minutes == 1) ? '' : 's')); if (seconds > 0) segments.push(seconds + ' second' + ((seconds == 1) ? '' : 's')); if (milliseconds > 0) segments.push(milliseconds + ' millisecond' + ((seconds == 1) ? '' : 's')); const dateString = segments.join(', '); User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { //let err = new Error('Not logged in!'); return res.render('login', { req: req, User: User, quote: quotes.getRandomQuote() }); //return err.status = 400; //return next(err); } else { return res.render('profile', { req: req, User: User, name: user.username, quote: quotes.getRandomQuote(), EntryCount: EntryCount, UserCount: UserCount, dateString: dateString }); } } }); }); app.get('/profile/legacy', async (req, res, next) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown 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', { // quote: quotes.getRandomQuote() // }); // }); app.get('/terms', (req, res) => { res.render('terms'); }); // app.post('/submitPFP', (req, res) => { // let form = new formidable.IncomingForm(); // form.parse(req, (err, fields, files) => { // let oldPath = files.filetoupload.path; // let newPath = __dirname + files.filetoupload.name; // fs.rename(oldPath, newPath, (err) => { // if (err) throw err; // res.write('File uploaded and moved!'); // res.end(); // }) // }) // }); // app.get('/marketplace', (req, res) => { // User.findById(req.session.userId) // .exec((error, user) => { // if (error) { // return res.render('error', { // quote: quotes.getRandomQuote(), // errorMsg: 'Unknown error.' // }); // } else { // if (user === null) { // //let err = new Error('Not logged in!'); // return res.render('login', { // req: req, // User: User, // quote: quotes.getRandomQuote() // }); // //return err.status = 400; // //return next(err); // } else { // return res.redirect('/') // } // } // }) // }) app.post('/closeExampleVideo', async (req, res) => { req.session.exampleVideo = false; return res.redirect('/'); }); app.post('/openExampleVideo', async (req, res) => { req.session.exampleVideo = true; return res.redirect('/'); }); app.get('/admin', (req, res) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { //let err = new Error('Not logged in!'); return res.render('login', { req: req, User: User, quote: quotes.getRandomQuote() }); //return err.status = 400; //return next(err); } else { if (user.username == 'sin') { return res.redirect('/') // return res.render('profile', { // req: req, // User: User, // name: user.username, // quote: quotes.getRandomQuote() // }); } else { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Not authorized.' }); } } } }) }) app.get('/change-password', (req, res) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { //let err = new Error('Not logged in!'); return res.render('login', { req: req, User: User, quote: quotes.getRandomQuote() }); //return err.status = 400; //return next(err); } else { return res.render('change-password', { quote: quotes.getRandomQuote() }); } } }) }); app.post('/change-password', async (req, res) => { if (req.body.passReset && req.body.passResetCheck) { let hashedPass = bcrypt.hash(req.body.passReset, 10); const userData = { password: await hashedPass }; User.findByIdAndUpdate(req.session.userId, userData, (err, user) => { if (err) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Error changing password.' }); } else { return res.redirect('/'); } }) } }); app.post('/deleteItem/:id', (req, res) => { EntryItem.findByIdAndDelete(req.params.id) .exec((err, user) => { if (err) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { res.redirect('/') } }) }) app.get('/marketplace', async (req, res) => { //const todoItems = await TodoItem.find(); User.findById(req.session.userId) .exec(async (error, user) => { if (error) { return res.render('error', { quote: quotes.getRandomQuote(), errorMsg: 'Unknown error.' }); } else { if (user === null) { //let err = new Error('Not logged in!'); res.render('marketplace', { req: req, User: User, name: null, quote: quotes.getRandomQuote() }); //return err.status = 400; //return next(err); } else { const entryItems = EntryItem; const loop = await EntryItem.find({ "type": "purchase", user: user.username }); const loopCount = await EntryItem.find({ "type": "purchase", "user": user.username }).countDocuments(); const loop2 = await EntryItem.find({ "type": "sale", "user": user.username }); const loop2Count = await EntryItem.find({ "type": "sale", "user": user.username }).countDocuments(); const loop3 = await EntryItem.find({ "type": "trade", "user": user.username }); const loop3Count = await EntryItem.find({ "type": "trade", "user": user.username }).countDocuments(); let EntryCount = await EntryItem.countDocuments(); let UserCount = await User.countDocuments(); let rawUptime = process.uptime(); const date = new Date(rawUptime * 1000); const days = date.getUTCDate() - 1, hours = date.getUTCHours(), minutes = date.getUTCMinutes(), seconds = date.getUTCSeconds(), milliseconds = date.getUTCMilliseconds(); let segments = []; if (days > 0) segments.push(days + ' day' + ((days == 1) ? '' : 's')); if (hours > 0) segments.push(hours + ' hour' + ((hours == 1) ? '' : 's')); if (minutes > 0) segments.push(minutes + ' minute' + ((minutes == 1) ? '' : 's')); if (seconds > 0) segments.push(seconds + ' second' + ((seconds == 1) ? '' : 's')); if (milliseconds > 0) segments.push(milliseconds + ' millisecond' + ((seconds == 1) ? '' : 's')); const dateString = segments.join(', '); return res.render('marketplace', { req: req, User: User, name: user.username, entryItems: entryItems, user: user, loop: loop, loopCount: loopCount, loop2: loop2, loop2Count: loop2Count, loop3: loop3, loop3Count: loop3Count, EntryCount: EntryCount, UserCount: UserCount, dateString: dateString, quote: quotes.getRandomQuote() }); } } }); }); app.get('*', (req, res) => { res.redirect('/') }) 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 )