Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- var express = require("express");
- var sassMiddleware = require("node-sass-middleware");
- var mongo = require("mongodb");
- var MongoClient = mongo.MongoClient;
- var bodyParser = require('body-parser');
- var app = express();
- var https = require("https");
- var nodemailer = require("nodemailer");
- var urlParse = require("url");
- app.listen( 80 );
- app.locals.debug = true;
- app.locals.compileDebug = false;
- app.locals.dbUrl = "mongodb://localhost:27017/website";
- //Sass middleware
- app.use(sassMiddleware({
- src: __dirname + '/sass',
- dest: __dirname + '/public/styles/',
- debug: app.locals.compileDebug,
- prefix: '/styles'
- }));
- app.use(bodyParser.json());
- app.use(bodyParser.urlencoded({ extended: true }));
- app.use(express.static(__dirname + '/public'));
- app.set('view engine', 'jade');
- //Jade templating
- var templates = [];
- function Template( template, urls, regex, error, nav ) {
- this.urls = urls;
- this.template = template;
- this.error = error || false;
- this.regex = regex || false;
- this.nav = nav || false;
- this.currentUrl = null
- this.canUse = function( url ){
- if( urls.indexOf( url ) != -1 )
- return true;
- var matched = false;
- if( this.regex )
- {
- urls.forEach( function( el ){
- if( url.match( el ) )
- matched = true;
- });
- }
- return matched;
- }
- }
- Template.prototype.onMethod = function( method, body, callback ){ callback() };
- Template.prototype.requestData = function( callback, nav, template ) {
- var thisTemplate = this;
- nav = nav || true;
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- console.error( err );
- callback( null );
- return;
- }
- //Get all templates
- db.collection("templates").find(nav ? {} : { "template" : template ? template : thisTemplate.template }, function( err, templates ) {
- if( err )
- {
- console.error( err );
- callback( null );
- db.close();
- return;
- }
- if( nav )
- {
- var result = {};
- result.nav = [];
- templates.each( function( err, item ){
- if( err )
- {
- console.error( err );
- callback( null );
- db.close();
- return;
- }
- if( item )
- {
- //Is this template
- if( item.template == (template ? template : thisTemplate.template ) )
- {
- //Copy all properties over
- for ( var k in item )
- result[k] = item[k];
- }
- //Add to nav
- for ( var k in item )
- {
- //Ignore everything but name and href
- if( k != "name" && k != "href" )
- k = null;
- }
- result.nav.push( item );
- }else{
- //Finished
- callback( result );
- db.close();
- }
- });
- }else{
- //Finished
- callback( templates );
- db.close();
- }
- });
- });
- };
- //Add templates
- templates.push( new Template( "index", ["/", "/index"] ) );
- templates.push( new Template( "projects", ["/projects"] ) );
- templates.push( new Template( "project", ["/projects/."], true ) );
- templates.push( new Template( "error", [""], false, true ) );
- //CMS templates
- var consoleTemplate = new Template( "./admin/index", ["/admin/index", "/admin/"] );
- consoleTemplate.onMethod = function( method, body, callback ){
- if( method == "POST" )
- {
- //Reset
- consoleTemplate.result = null;
- consoleTemplate.message = "";
- consoleTemplate.success = false;
- consoleTemplate.command = "";
- if( body.tab == "console")
- {
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- consoleTemplate.message = "Database connection failed";
- console.error( err );
- callback( null );
- return;
- }
- try
- {
- var json = JSON.parse( body.command );
- //Execute command
- db.command( json, function( err, result ) {
- if( err )
- {
- consoleTemplate.message = "Command failed: "+err.message;
- console.error( err );
- callback( null );
- return;
- }
- consoleTemplate.message = "Command successful";
- consoleTemplate.success = true;
- callback( null );
- //Command result
- consoleTemplate.result = result;
- consoleTemplate.command = json;
- });
- }catch(e){
- consoleTemplate.message = "JSON parser error: "+e;
- console.error( e );
- callback( null );
- }
- });
- }else if ( body.tab == "add" ){
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- consoleTemplate.message = "Database connection failed";
- console.error( err );
- callback( null );
- return;
- }
- db.collection("templates").insertOne( { "name": body.name, "href": body.href, "template": body.template }, function( err ){
- if( err )
- {
- consoleTemplate.message = "Template insert failed";
- console.error( err );
- callback( null );
- return;
- }
- consoleTemplate.message = "Template added";
- consoleTemplate.success = true;
- callback( null );
- });
- });
- }else if(body.tab == "remove"){
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- consoleTemplate.message = "Database connection failed";
- console.error( err );
- callback( null );
- return;
- }
- db.collection("templates").deleteOne( { "_id": new mongo.ObjectID(body.template) }, function( err, result ){
- if( err )
- {
- consoleTemplate.message = "Template removal failed";
- console.error( err );
- callback( null );
- return;
- }
- if( result.result.ok )
- {
- consoleTemplate.message = "Template removed successfully";
- consoleTemplate.success = true;
- }else
- consoleTemplate.message = "Template removed failed";
- callback( null );
- });
- });
- }else
- callback( null );
- }else
- callback( null );
- };
- //Return message and result
- consoleTemplate.requestData = function( callback, nav, template ){
- Template.prototype.requestData( function( result ) {
- if( !result ) result = {};
- result.message = consoleTemplate.message;
- result.success = consoleTemplate.success;
- //Command result
- result.commandResult = consoleTemplate.result;
- result.command = consoleTemplate.command;
- callback( result );
- });
- };
- templates.push( consoleTemplate );
- //Action template
- var action = new Template( "./admin/action", ["/admin/(.*?)/action"], true );
- action.onMethod = function( method, body, callback ){
- if( method == "POST" )
- {
- var template = urlParse.parse( action.currentUrl ).pathname.split('/')[2];
- //Reset
- action.message = "";
- action.success = false;
- if( body.action == "add_slide")
- {
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- action.message = "Database connection failed";
- console.error( err );
- callback( null );
- return;
- }
- db.collection("templates").updateOne( { "template": template }, { $push: { sliders: { title: body.name, description: body.description} } }, function( err, result ){
- if( err )
- {
- action.message = "Slide addition failed"
- console.error( err );
- callback( null );
- return;
- }
- if( result.result.ok )
- {
- action.message = "Slide successfully added";
- action.success = true;
- }else
- action.message = "Slide addition failed";
- callback( null );
- });
- });
- }else if(body.action == "remove_slide"){
- //Connect to db
- MongoClient.connect( app.locals.dbUrl, function( err, db ){
- if( err )
- {
- action.message = "Database connection failed";
- console.error( err );
- callback( null );
- return;
- }
- db.collection("templates").updateOne( { "template": template }, { "$pull": { "sliders": { "title": body.slide } } }, function( err, result ){
- if( err )
- {
- action.message = "Slide removal failed";
- console.error( err );
- callback( null );
- return;
- }
- if( result.result.ok )
- {
- action.message = "Slide removed successfully";
- action.success = true;
- }else
- action.message = "Slide removed failed";
- callback( null );
- });
- });
- }else
- callback( null );
- }else
- callback(null);
- };
- //Return template info for action
- action.requestData = function( callback, nav, template ){
- var paths = urlParse.parse( action.currentUrl ).pathname.split('/');
- Template.prototype.requestData( function( result ) {
- if( !result ) result = {};
- result.message = action.message;
- result.success = action.success;
- callback( result );
- }, false, paths[2]);
- };
- templates.push( action );
- //Contact template with post handler
- var contact = new Template( "contact", ["/contact"] );
- contact.onMethod = function( method, body, callback ){
- if( method == "POST" )
- {
- this.message = "";
- //Check body values
- if( body["g-recaptcha-response"] == "" )
- {
- this.message = "You must verify the captcha";
- callback( null );
- return;
- }else if( body["email"] == "" ){
- this.message = "You must enter an email";
- callback( null );
- return;
- }else if( body["message"] == "" ){
- this.message = "You must enter a message";
- callback( null );
- return;
- }
- var url = "https://www.google.com/recaptcha/api/siteverify?secret=6LeDOBYTAAAAAKuAV5AFSkuBalIfSZ24eekan8kg&response=" + body["g-recaptcha-response"];
- https.get( url, function(res) {
- var data = "";
- res.on("data", function(chunk) {
- data += chunk.toString();
- });
- res.on("end", function(){
- var json = JSON.parse( data );
- if( json.success )
- {
- //Setup smtp
- var transporter = nodemailer.createTransport({
- service: "Zoho",
- auth: {
- user: "info@tingtom.co.uk",
- pass: "cd7jjhjmec1f"
- }
- });
- //Send email
- var mail = {
- from: "website@tingtom.co.uk",
- to: "info@tingtom.co.uk",
- subject: "Contact form message",
- html: "Email: "+body.email+"<br>Message: "+ body.message
- };
- transporter.sendMail( mail, function( err, info ){
- if( err )
- {
- callback( err );
- return;
- }
- contact.message = "Email sent successfully";
- callback( null );
- });
- }else{
- contact.message = "Captcha failed, please try again";
- callback( "Captcha failed" );
- }
- });
- }).on( "error", function( error ) {
- contact.message = "Captcha communication error";
- callback( error );
- });
- }else
- callback( null );
- };
- //Add the post result message to the data
- contact.requestData = function( callback, nav, template ){
- Template.prototype.requestData( function( result ) {
- if( !result ) result = {};
- result.message = contact.message;
- callback( result );
- });
- };
- templates.push(contact);
- //Middleware
- app.use( function(req, res, next) {
- //Debug
- if( app.locals.debug )
- console.log( "Request: "+req.url+" "+req.method );
- //Check templates
- var rendered = false;
- templates.every( function( template ){
- if( template.canUse( req.url ) )
- {
- //Debug
- if( app.locals.debug )
- console.log( "Template: "+template.template );
- template.currentUrl = req.url;
- //Call method
- template.onMethod( req.method, req.body, function( err ) {
- if( err && app.locals.debug )
- {
- console.error( err );
- return;
- }
- //Get data then render using it
- template.requestData( function( result ){
- try
- {
- result = result || {}
- result.debug = app.locals.compileDebug;
- result.compileDebug = app.locals.compileDebug;
- res.render( template.template, result );
- } catch( e ) {
- console.error( e );
- }
- next();
- }, true, null);
- });
- rendered = true;
- return false;
- }
- return true;
- });
- if( !rendered )
- {
- console.log( "Sending error page" );
- templates.forEach( function( template ){
- if( template.error )
- {
- res.render( template.template, { errorCode: "404", errorMessage: "Not found or whatever", debug: app.locals.compileDebug, compileDebug: app.locals.compileDebug } );
- next();
- }
- });
- }
- });
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement