Cleaning up code

react_convert
Mark Moffat 2018-01-14 22:11:22 +01:00
parent ecef3b8224
commit 3c39b5e5c5
4 changed files with 108 additions and 105 deletions

View File

@ -17,6 +17,8 @@ Keeping expressCart running after closing the terminal can be done in a few ways
4. Save the PM2 config: `pm2 save` 4. Save the PM2 config: `pm2 save`
5. To start/stop: `pm2 start expressCart` / `pm2 stop expressCart` 5. To start/stop: `pm2 start expressCart` / `pm2 stop expressCart`
> Note: Node.js version 7.x or greater is needed.
## Admin ## Admin
Visit: [http://127.0.0.1:1111/admin](http://127.0.0.1:1111/admin) Visit: [http://127.0.0.1:1111/admin](http://127.0.0.1:1111/admin)

2
app.js
View File

@ -184,7 +184,7 @@ handlebars = handlebars.create({
} }
}); });
// var session store // session store
let store = new MongoStore({ let store = new MongoStore({
uri: config.databaseConnectionString, uri: config.databaseConnectionString,
collection: 'sessions' collection: 'sessions'

View File

@ -2,12 +2,17 @@ const _ = require('lodash');
const uglifycss = require('uglifycss'); const uglifycss = require('uglifycss');
const colors = require('colors'); const colors = require('colors');
const lunr = require('lunr'); const lunr = require('lunr');
const cheerio = require('cheerio');
const fs = require('fs'); const fs = require('fs');
const path = require('path');
const glob = require('glob');
const async = require('async');
const nodemailer = require('nodemailer');
const escape = require('html-entities').AllHtmlEntities; const escape = require('html-entities').AllHtmlEntities;
let ObjectId = require('mongodb').ObjectID; let ObjectId = require('mongodb').ObjectID;
// common functions // common functions
exports.checkLogin = function(req, res, next){ exports.checkLogin = (req, res, next) => {
// if not protecting we check for public pages and don't checkLogin // if not protecting we check for public pages and don't checkLogin
if(req.session.needsSetup === true){ if(req.session.needsSetup === true){
res.redirect('/setup'); res.redirect('/setup');
@ -21,7 +26,7 @@ exports.checkLogin = function(req, res, next){
res.redirect('/login'); res.redirect('/login');
}; };
exports.showCartCloseBtn = function(page){ exports.showCartCloseBtn = (page) => {
let showCartCloseButton = true; let showCartCloseButton = true;
if(page === 'checkout' || page === 'pay'){ if(page === 'checkout' || page === 'pay'){
showCartCloseButton = false; showCartCloseButton = false;
@ -31,9 +36,9 @@ exports.showCartCloseBtn = function(page){
}; };
// adds products to sitemap.xml // adds products to sitemap.xml
exports.addSitemapProducts = function(req, res, cb){ exports.addSitemapProducts = (req, res, cb) => {
let db = req.app.db; let db = req.app.db;
let async = require('async');
let config = exports.getConfig(); let config = exports.getConfig();
let hostname = config.baseUrl; let hostname = config.baseUrl;
@ -59,11 +64,11 @@ exports.addSitemapProducts = function(req, res, cb){
}); });
}; };
exports.restrict = function(req, res, next){ exports.restrict = (req, res, next) => {
exports.checkLogin(req, res, next); exports.checkLogin(req, res, next);
}; };
exports.clearSessionValue = function(session, sessionVar){ exports.clearSessionValue = (session, sessionVar) => {
let temp; let temp;
if(session){ if(session){
temp = session[sessionVar]; temp = session[sessionVar];
@ -72,7 +77,7 @@ exports.clearSessionValue = function(session, sessionVar){
return temp; return temp;
}; };
exports.updateTotalCartAmount = function(req, res){ exports.updateTotalCartAmount = (req, res) => {
let config = exports.getConfig(); let config = exports.getConfig();
req.session.totalCartAmount = 0; req.session.totalCartAmount = 0;
@ -90,8 +95,7 @@ exports.updateTotalCartAmount = function(req, res){
} }
}; };
exports.checkDirectorySync = function (directory){ exports.checkDirectorySync = (directory) => {
let fs = require('fs');
try{ try{
fs.statSync(directory); fs.statSync(directory);
}catch(e){ }catch(e){
@ -99,16 +103,12 @@ exports.checkDirectorySync = function (directory){
} }
}; };
exports.getThemes = function (){ exports.getThemes = () => {
let fs = require('fs');
let path = require('path');
return fs.readdirSync(path.join('public', 'themes')).filter(file => fs.statSync(path.join(path.join('public', 'themes'), file)).isDirectory()); return fs.readdirSync(path.join('public', 'themes')).filter(file => fs.statSync(path.join(path.join('public', 'themes'), file)).isDirectory());
}; };
exports.getImages = function (dir, req, res, callback){ exports.getImages = (dir, req, res, callback) => {
let db = req.app.db; let db = req.app.db;
let glob = require('glob');
let fs = require('fs');
db.products.findOne({_id: exports.getId(dir)}, (err, product) => { db.products.findOne({_id: exports.getId(dir)}, (err, product) => {
if(err){ if(err){
@ -144,10 +144,7 @@ exports.getImages = function (dir, req, res, callback){
}); });
}; };
exports.getConfig = function(){ exports.getConfig = () => {
let fs = require('fs');
let path = require('path');
let config = JSON.parse(fs.readFileSync(path.join(__dirname, '../config', 'settings.json'), 'utf8')); let config = JSON.parse(fs.readFileSync(path.join(__dirname, '../config', 'settings.json'), 'utf8'));
config.customCss = typeof config.customCss !== 'undefined' ? escape.decode(config.customCss) : null; config.customCss = typeof config.customCss !== 'undefined' ? escape.decode(config.customCss) : null;
config.footerHtml = typeof config.footerHtml !== 'undefined' ? escape.decode(config.footerHtml) : null; config.footerHtml = typeof config.footerHtml !== 'undefined' ? escape.decode(config.footerHtml) : null;
@ -171,9 +168,7 @@ exports.getConfig = function(){
return config; return config;
}; };
exports.getPaymentConfig = function(){ exports.getPaymentConfig = () => {
let fs = require('fs');
let path = require('path');
let siteConfig = this.getConfig(); let siteConfig = this.getConfig();
let config = []; let config = [];
@ -184,9 +179,7 @@ exports.getPaymentConfig = function(){
return config; return config;
}; };
exports.updateConfig = function(fields){ exports.updateConfig = (fields) => {
let fs = require('fs');
let path = require('path');
let settingsFile = JSON.parse(fs.readFileSync(path.join(__dirname, '../config/settings.json'), 'utf8')); let settingsFile = JSON.parse(fs.readFileSync(path.join(__dirname, '../config/settings.json'), 'utf8'));
_.forEach(fields, (value, key) => { _.forEach(fields, (value, key) => {
@ -230,12 +223,12 @@ exports.updateConfig = function(fields){
} }
}; };
exports.getMenu = function(db){ exports.getMenu = (db) => {
return db.menu.findOne({}); return db.menu.findOne({});
}; };
// creates a new menu item // creates a new menu item
exports.newMenu = function(req, res){ exports.newMenu = (req, res) => {
const db = req.app.db; const db = req.app.db;
return exports.getMenu(db) return exports.getMenu(db)
.then((menu) => { .then((menu) => {
@ -263,7 +256,7 @@ exports.newMenu = function(req, res){
}; };
// delete a menu item // delete a menu item
exports.deleteMenu = function(req, res, menuIndex){ exports.deleteMenu = (req, res, menuIndex) => {
const db = req.app.db; const db = req.app.db;
return exports.getMenu(db) return exports.getMenu(db)
.then((menu) => { .then((menu) => {
@ -280,7 +273,7 @@ exports.deleteMenu = function(req, res, menuIndex){
}; };
// updates and existing menu item // updates and existing menu item
exports.updateMenu = function(req, res){ exports.updateMenu = (req, res) => {
const db = req.app.db; const db = req.app.db;
return exports.getMenu(db) return exports.getMenu(db)
.then((menu) => { .then((menu) => {
@ -298,7 +291,7 @@ exports.updateMenu = function(req, res){
}); });
}; };
exports.sortMenu = function(menu){ exports.sortMenu = (menu) => {
if(menu && menu.items){ if(menu && menu.items){
menu.items = _.sortBy(menu.items, 'order'); menu.items = _.sortBy(menu.items, 'order');
return menu; return menu;
@ -307,7 +300,7 @@ exports.sortMenu = function(menu){
}; };
// orders the menu // orders the menu
exports.orderMenu = function(req, res){ exports.orderMenu = (req, res) => {
const db = req.app.db; const db = req.app.db;
return exports.getMenu(db) return exports.getMenu(db)
.then((menu) => { .then((menu) => {
@ -325,11 +318,8 @@ exports.orderMenu = function(req, res){
}); });
}; };
exports.getEmailTemplate = function(result){ exports.getEmailTemplate = (result) => {
let cheerio = require('cheerio');
let config = this.getConfig(); let config = this.getConfig();
let fs = require('fs');
let path = require('path');
let template = fs.readFileSync(path.join(__dirname, '../public/email_template.html'), 'utf8'); let template = fs.readFileSync(path.join(__dirname, '../public/email_template.html'), 'utf8');
@ -347,9 +337,8 @@ exports.getEmailTemplate = function(result){
return $.html(); return $.html();
}; };
exports.sendEmail = function(to, subject, body){ exports.sendEmail = (to, subject, body) => {
let config = this.getConfig(); let config = this.getConfig();
let nodemailer = require('nodemailer');
let emailSettings = { let emailSettings = {
host: config.emailHost, host: config.emailHost,
@ -384,7 +373,7 @@ exports.sendEmail = function(to, subject, body){
}; };
// gets the correct type of index ID // gets the correct type of index ID
exports.getId = function(id){ exports.getId = (id) => {
if(id){ if(id){
if(id.length !== 24){ if(id.length !== 24){
return id; return id;
@ -394,7 +383,7 @@ exports.getId = function(id){
}; };
// run the DB query // run the DB query
exports.dbQuery = function(db, query, sort, limit, callback){ exports.dbQuery = (db, query, sort, limit, callback) => {
if(sort && limit){ if(sort && limit){
db.find(query).sort(sort).limit(parseInt(limit)).toArray((err, results) => { db.find(query).sort(sort).limit(parseInt(limit)).toArray((err, results) => {
if(err){ if(err){
@ -412,6 +401,32 @@ exports.dbQuery = function(db, query, sort, limit, callback){
} }
}; };
exports.getData = async (req, page, query) => {
let db = req.app.db;
let config = exports.getConfig();
let numberProducts = config.productsPerPage ? config.productsPerPage : 6;
let skip = 0;
if(page > 1){
skip = (page - 1) * numberProducts;
}
query['productPublished'] = 'true';
// Run our queries
return Promise.all([
db.products.find(query).skip(skip).limit(parseInt(numberProducts)).toArray(),
db.products.count(query)
])
.then((result) => {
const returnData = {data: result[0], totalProducts: result[1]};
return returnData;
})
.catch((err) => {
throw new Error('Error retrieving products');
});
};
exports.indexProducts = (app) => { exports.indexProducts = (app) => {
// index all products in lunr on startup // index all products in lunr on startup
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
@ -422,7 +437,7 @@ exports.indexProducts = (app) => {
} }
// setup lunr indexing // setup lunr indexing
const productsIndex = lunr(function (){ const productsIndex = lunr(function(){
this.field('productTitle', {boost: 10}); this.field('productTitle', {boost: 10});
this.field('productTags', {boost: 5}); this.field('productTags', {boost: 5});
this.field('productDescription'); this.field('productDescription');
@ -458,7 +473,7 @@ exports.indexOrders = (app, cb) => {
} }
// setup lunr indexing // setup lunr indexing
const ordersIndex = lunr(function (){ const ordersIndex = lunr(function(){
this.field('orderEmail', {boost: 10}); this.field('orderEmail', {boost: 10});
this.field('orderLastname', {boost: 5}); this.field('orderLastname', {boost: 5});
this.field('orderPostcode'); this.field('orderPostcode');

View File

@ -13,7 +13,7 @@ router.get('/payment/:orderId', async (req, res, next) => {
if(err){ if(err){
console.info(err.stack); console.info(err.stack);
} }
res.render(config.themeViews + 'payment_complete', { res.render(`${config.themeViews}payment_complete`, {
title: 'Payment complete', title: 'Payment complete',
config: common.getConfig(), config: common.getConfig(),
session: req.session, session: req.session,
@ -40,7 +40,7 @@ router.get('/checkout', async (req, res, next) => {
} }
// render the checkout // render the checkout
res.render(config.themeViews + 'checkout', { res.render(`${config.themeViews}checkout`, {
title: 'Checkout', title: 'Checkout',
config: common.getConfig(), config: common.getConfig(),
session: req.session, session: req.session,
@ -66,7 +66,7 @@ router.get('/pay', async (req, res, next) => {
} }
// render the payment page // render the payment page
res.render(config.themeViews + 'pay', { res.render(`${config.themeViews}pay`, {
title: 'Pay', title: 'Pay',
config: common.getConfig(), config: common.getConfig(),
paymentConfig: common.getPaymentConfig(), paymentConfig: common.getPaymentConfig(),
@ -112,7 +112,7 @@ router.get('/product/:id', (req, res) => {
// show the view // show the view
common.getImages(result._id, req, res, async (images) => { common.getImages(result._id, req, res, async (images) => {
res.render(config.themeViews + 'product', { res.render(`${config.themeViews}product`, {
title: result.productTitle, title: result.productTitle,
result: result, result: result,
productOptions: productOptions, productOptions: productOptions,
@ -254,13 +254,12 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => {
pageNum = req.params.pageNum; pageNum = req.params.pageNum;
} }
// we search on the lunr indexes Promise.all([
getData(req, pageNum, {_id: {$in: lunrIdArray}}, async (err, results) => { common.getData(req, pageNum, {_id: {$in: lunrIdArray}}),
if(err){ common.getMenu(db)
console.error(colors.red('Error searching for products', err)); ])
} .then(([results, menu]) => {
res.render(`${config.themeViews}index`, {
res.render(config.themeViews + 'index', {
title: 'Results', title: 'Results',
results: results.data, results: results.data,
filtered: true, filtered: true,
@ -275,10 +274,13 @@ router.get('/search/:searchTerm/:pageNum?', (req, res) => {
pageNum: pageNum, pageNum: pageNum,
paginateUrl: 'search', paginateUrl: 'search',
config: config, config: config,
menu: common.sortMenu(await common.getMenu(db)), menu: common.sortMenu(menu),
helpers: req.handlebars.helpers, helpers: req.handlebars.helpers,
showFooter: 'showFooter' showFooter: 'showFooter'
}); });
})
.catch((err) => {
console.error(colors.red('Error searching for products', err));
}); });
}); });
@ -300,13 +302,14 @@ router.get('/category/:cat/:pageNum?', (req, res) => {
pageNum = req.params.pageNum; pageNum = req.params.pageNum;
} }
// we search on the lunr indexes Promise.all([
getData(req, pageNum, {_id: {$in: lunrIdArray}}, async (err, results) => { common.getData(req, pageNum, {_id: {$in: lunrIdArray}}),
if(err){ common.getMenu(db)
console.error(colors.red('Error getting products for category', err)); ])
} .then(([results, menu]) => {
const sortedMenu = common.sortMenu(menu);
res.render(config.themeViews + 'index', { res.render(`${config.themeViews}index`, {
title: 'Category', title: 'Category',
results: results.data, results: results.data,
filtered: true, filtered: true,
@ -319,13 +322,16 @@ router.get('/category/:cat/:pageNum?', (req, res) => {
productsPerPage: numberProducts, productsPerPage: numberProducts,
totalProductCount: results.totalProducts, totalProductCount: results.totalProducts,
pageNum: pageNum, pageNum: pageNum,
menuLink: _.find(common.sortMenu(await common.getMenu(db)).items, (obj) => { return obj.link === searchTerm; }), menuLink: _.find(sortedMenu.items, (obj) => { return obj.link === searchTerm; }),
paginateUrl: 'category', paginateUrl: 'category',
config: config, config: config,
menu: common.sortMenu(await common.getMenu(db)), menu: sortedMenu,
helpers: req.handlebars.helpers, helpers: req.handlebars.helpers,
showFooter: 'showFooter' showFooter: 'showFooter'
}); });
})
.catch((err) => {
console.error(colors.red('Error getting products for category', err));
}); });
}); });
@ -367,12 +373,12 @@ router.get('/page/:pageNum', (req, res, next) => {
let config = common.getConfig(); let config = common.getConfig();
let numberProducts = config.productsPerPage ? config.productsPerPage : 6; let numberProducts = config.productsPerPage ? config.productsPerPage : 6;
getData(req, req.params.pageNum, {}, async (err, results) => { Promise.all([
if(err){ common.getData(req, req.params.pageNum),
console.error(colors.red('Error getting products for page', err)); common.getMenu(db)
} ])
.then(([results, menu]) => {
res.render(config.themeViews + 'index', { res.render(`${config.themeViews}index`, {
title: 'Shop', title: 'Shop',
results: results.data, results: results.data,
session: req.session, session: req.session,
@ -387,11 +393,15 @@ router.get('/page/:pageNum', (req, res, next) => {
paginateUrl: 'page', paginateUrl: 'page',
helpers: req.handlebars.helpers, helpers: req.handlebars.helpers,
showFooter: 'showFooter', showFooter: 'showFooter',
menu: common.sortMenu(await common.getMenu(db)) menu: common.sortMenu(menu)
}); });
})
.catch((err) => {
console.error(colors.red('Error getting products for page', err));
}); });
}); });
// The main entry point of the shop
router.get('/:page?', (req, res, next) => { router.get('/:page?', (req, res, next) => {
let db = req.app.db; let db = req.app.db;
let config = common.getConfig(); let config = common.getConfig();
@ -399,13 +409,13 @@ router.get('/:page?', (req, res, next) => {
// if no page is specified, just render page 1 of the cart // if no page is specified, just render page 1 of the cart
if(!req.params.page){ if(!req.params.page){
getData(req, 1, {}, async (err, results) => { Promise.all([
if(err){ common.getData(req, 1, {}),
console.error(colors.red('Error getting products for page', err)); common.getMenu(db)
} ])
.then(([results, menu]) => {
res.render(config.themeViews + 'index', { res.render(`${config.themeViews}index`, {
title: 'Shop', title: `${config.cartTitle} - Shop`,
theme: config.theme, theme: config.theme,
results: results.data, results: results.data,
session: req.session, session: req.session,
@ -419,8 +429,11 @@ router.get('/:page?', (req, res, next) => {
paginateUrl: 'page', paginateUrl: 'page',
helpers: req.handlebars.helpers, helpers: req.handlebars.helpers,
showFooter: 'showFooter', showFooter: 'showFooter',
menu: common.sortMenu(await common.getMenu(db)) menu: common.sortMenu(menu)
}); });
})
.catch((err) => {
console.error(colors.red('Error getting products for page', err));
}); });
}else{ }else{
if(req.params.page === 'admin'){ if(req.params.page === 'admin'){
@ -434,7 +447,7 @@ router.get('/:page?', (req, res, next) => {
} }
// if we have a page lets render it, else throw 404 // if we have a page lets render it, else throw 404
if(page){ if(page){
res.render(config.themeViews + 'page', { res.render(`${config.themeViews}page`, {
title: page.pageName, title: page.pageName,
page: page, page: page,
session: req.session, session: req.session,
@ -461,31 +474,4 @@ router.get('/:page?', (req, res, next) => {
} }
}); });
const getData = function (req, page, query, cb){
let db = req.app.db;
let config = common.getConfig();
let numberProducts = config.productsPerPage ? config.productsPerPage : 6;
let skip = 0;
if(page > 1){
skip = (page - 1) * numberProducts;
}
query['productPublished'] = 'true';
db.products.count(query, (err, totalProducts) => {
if(err){
console.error(colors.red('Error getting total product count', err));
}
db.products.find(query).skip(skip).limit(parseInt(numberProducts)).toArray((err, results) => {
if(err){
cb(new Error('Error retrieving products'), null);
}else{
cb(null, {data: results, totalProducts: totalProducts});
}
});
});
};
module.exports = router; module.exports = router;