Merged PetitTetonApps with the website now that the deployment server always uses SSL. Used the Apps more recent implementation of NodeJS/Express.

This commit is contained in:
Wynne Crisman
2016-05-31 14:37:42 -07:00
parent a98d7d3a5f
commit 78be012a14
192 changed files with 58459 additions and 19 deletions

242
app/routes.js Normal file
View File

@@ -0,0 +1,242 @@
var ejs = require('ejs');
var fs = require('fs');
var path = require('path');
var adminPath;
//Notes:
//Use res.send or res.sendFile for static resources (like images or html)
//Use res.send(ejs.render(htmlStr, viewArgs)) to manually render EJS files
//Use res.render("my.ejs", {root: adminPath}) to render EJS files (if you have setup the ejs renderer
module.exports = function(app, rootPath, passport, smtpTransport, sequelize) {
adminPath = path.join(rootPath, 'admin');
// =====================================
// HOME PAGE (with login links)
// =====================================
//app.get('/', isLoggedIn, function(req, res) {
// res.render('index.ejs'); // load the index.ejs file
//});
//Handle the root being requested, and the search engine requesting a static page with content.
app.get('/', function(req, res) {
try {
//Note: This is for search engines.
if(typeof(req.query._escaped_fragment_) !== "undefined") {
console.log("Search Engine Detected");
var viewArgs = {}; //What args to use for a search engine?
//The DIY method which is somewhat brittle since it relies on <!--CONTENT--> existing in the index file, and it replaces that with the contents of the passed parameter (what is after the #!) for the content html which is inserted into the index file in place of <!--CONTENT-->.
fs.readFile(rootPath + '/index.html', {encoding: "UTF8"}, function(err, indexContent) {
if(!err) {
var file = rootPath + '/' + req.query._escaped_fragment_ + '.html';
fs.readFile(file, {encoding: "UTF8"}, function(err, content) {
if(!err) {
//Non-regex method.//
if(content.indexOf("<runonce>") != -1 && content.indexOf("</runonce>") != -1) {
content = content.substr(0, content.indexOf("<runonce>")) + content.substr(content.indexOf("</runonce>") + 10, -1);
}
//Doesn't work? Not sure why. Works in the regex test tools.//
//content = content.replace(/<runonce>(.|\n)*?<\x2frunonce>/, " ");
//Doesn't work? Based on the regex failure above, I think that replace is failing.//
var html = indexContent.replace(/<!--CONTENT-->/g, content);
//console.log(html);
//res.send(ejs.render(html, viewArgs));
res.send(html);
}
else console.log("Error reading the content file '" + file + "'. " + err);
});
}
else console.log("Error reading the index.html file. " + err);
});
}
else {
//res.render("index.html", {root: rootPath});
res.sendFile("index.html", {root: rootPath});
}
} catch(e) {
console.log(e);
}
});
app.get('/admin', isLoggedIn, function(req, res) {
try {
//Note: This is for search engines.
if(typeof(req.query._escaped_fragment_) !== "undefined") {
var viewArgs = {}; //What args to use for a search engine?
//The DIY method which is somewhat brittle since it relies on <!--CONTENT--> existing in the index file, and it replaces that with the contents of the passed parameter (what is after the #!) for the content html which is inserted into the index file in place of <!--CONTENT-->.
fs.readFile(adminPath + '/index.ejs', {encoding: "UTF8"}, function(err, indexContent) {
if(!err) {
var file = adminPath + '/' + req.query._escaped_fragment_ + '.ejs';
fs.readFile(file, {encoding: "UTF8"}, function(err, content) {
if(!err) {
//Non-regex method.//
if(content.indexOf("<runonce>") != -1 && content.indexOf("</runonce>") != -1) {
content = content.substr(0, content.indexOf("<runonce>")) + content.substr(content.indexOf("</runonce>") + 10, -1);
}
//Doesn't work? Not sure why. Works in the regex test tools.//
//content = content.replace(/<runonce>(.|\n)*?<\x2frunonce>/, " ");
//Doesn't work? Based on the regex failure above, I think that replace is failing.//
var html = indexContent.replace(/<!--CONTENT-->/g, content);
//console.log(html);
res.send(ejs.render(html, viewArgs));
}
else console.log("Error reading the content file '" + file + "'. " + err);
});
}
else console.log("Error reading the index.ejs file. " + err);
});
}
else {
console.log("Looking for index.ejs in " + adminPath);
//res.render("index.ejs", {root: adminPath});
res.render(path.join(adminPath, req.baseUrl, "index"));
}
} catch(e) {console.log(e);}
});
app.use('/ContactUs', function(req, res) {
try {
var firstName = req.body.FirstName;
var lastName = req.body.LastName;
var email = req.body.Email;
var message = req.body.Text;
var params = {from: config.fromAddress, to: config.contactUsRecipient, subject: "Contact Us", text: "A user has commented via the Petit Teton website.\n\nFirst Name: " + firstName + "\nLast Name: " + lastName + "\nEmail: " + email + "\n" + message};
smtpTransport.sendMail(params, function(error, response) {
if(error) {
try {
console.log("Received an error while sending the contact us email to the admin. " + error);
fs.appendFile(rootPath + '/emailFailures.txt', JSON.stringify(params) + '\n', function(err) {if(err) {console.log("Failed to write email data to file! (contact us)");}});
} catch(e) {console.log(e);}
}
});
res.status(200).send('success');
} catch(e) {console.log(e);}
});
// =====================================
// LOGIN
// =====================================
// show the login form
app.get('/admin/login', function(req, res) {
// render the page and pass in any flash data if it exists
res.render(path.join(adminPath, req.baseUrl, 'login.ejs'), { message: req.flash('loginMessage') });
});
// process the login form
app.post('/admin/login', passport.authenticate('local-login', {successRedirect: '/admin', failureRedirect: '/admin/login', failureFlash: true}));
// =====================================
// SIGNUP
// =====================================
// show the signup form
/* Turned off since only admin users can add admin users.
app.get('/admin/signup', function(req, res) {
// render the page and pass in any flash data if it exists
res.render(path.join(adminPath, req.baseUrl, 'signup.ejs'), { message: req.flash('signupMessage') });
});
app.post('/admin/signup', passport.authenticate('local-signup', {successRedirect: '/admin', failureRedirect: '/admin/signup', failureFlash: true}));
*/
// =====================================
// PROFILE SECTION
// =====================================
// we will want this protected so you have to be logged in to visit
// we will use route middleware to verify this (the isLoggedIn function)
app.get('/admin/profile', isLoggedIn, function(req, res) {
res.render(path.join(adminPath, req.baseUrl, 'profile.ejs'), {
user : req.user // get the user out of session and pass to template
});
});
// =====================================
// LOGOUT
// =====================================
app.get('/admin/logout', function(req, res) {
req.logout();
res.redirect('/');
});
// Check for an ejs first even if an html is requested.
app.get('/admin/**/*.html', isLoggedIn, function(req, res) {
var ejs = req.path.substring(0, req.path.length - 4) + ".ejs";
//console.log("Checking for an ejs: " + ejs);
fs.stat(ejs, function(err, stats) {
if(!err) {
res.render(ejs);
}
else {
res.sendFile(req.path);
}
});
});
app.get('/admin/getCategories', isLoggedIn, function(req, res) {
sequelize.models.Category.findAll({attributes: ['id', 'name', 'visible'], order: [['name', 'DESC'], ['visible', 'DESC']]}).then(function(values) {
res.json(values);
});
});
app.get('/admin/getSubcategories', isLoggedIn, function(req, res) {
sequelize.models.Subcategory.findAll({where: {categoryId: req.query.id}, attributes: ['id', 'name', 'visible'], order: [['name', 'DESC'], ['visible', 'DESC']]}).then(function(values) {
res.json(values);
}).catch(function(error) {
console.log(error);
res.json("[]");
});
});
app.get('/admin/getItems', isLoggedIn, function(req, res) {
sequelize.models.Item.findAll({where: {subcategoryId: req.query.id}, attributes: ['id', 'name', 'counts', 'visible', 'subcategoryId'], order: [['name', 'DESC'], ['visible', 'DESC']]}).then(function(values) {
res.json(values);
});
});
app.get('/admin/getMeasures', isLoggedIn, function(req, res) {
sequelize.models.Measure.findAll({attributes: ['id', 'name', "image", 'postfix', 'visible'], order: [['name', 'DESC'], ['visible', 'DESC']]}).then(function(values) {
res.json(values);
});
});
app.get('/admin/getVenues', isLoggedIn, function(req, res) {
sequelize.models.Venue.findAll({attributes: ['id', 'name', 'visible'], order: [['name', 'DESC'], ['visible', 'DESC']]}).then(function(values) {
res.json(values);
});
});
app.get('/admin/toggleVenueVisibility', isLoggedIn, function(req, res) {
sequelize.models.Venue.find({where: {id: req.query.id}, attributes: ['id', 'name', 'visible']}).then(function(venue) {
if(venue) {
venue.visible = venue.visible ? false : true;
venue.save().then(function() {
res.json({visible: venue.visible});
}).catch(function(error) {
res.json({error: error});
});
}
else {
res.json({error: "Can't find the venue!"});
}
});
});
};
// route middleware to make sure a user is logged in
function isLoggedIn(req, res, next) {
if(req.isAuthenticated()) return next();
//Redirect if the user isn't logged in.
res.redirect('/admin/login');
}