diff --git a/app/controllers/index.js b/app/controllers/index.js new file mode 100644 index 00000000..1e34bd93 --- /dev/null +++ b/app/controllers/index.js @@ -0,0 +1,5 @@ +'use strict'; + +exports.render = function(req, res) { + res.render('index'); +}; diff --git a/app/views/404.jade b/app/views/404.jade new file mode 100755 index 00000000..2f0d9e86 --- /dev/null +++ b/app/views/404.jade @@ -0,0 +1,13 @@ +extends layouts/default + +block main + h1 Oops something went wrong + br + span 404 + +block content + #error-message-box + #error-stack-trace + pre + code!= error + diff --git a/app/views/500.jade b/app/views/500.jade new file mode 100755 index 00000000..491b0008 --- /dev/null +++ b/app/views/500.jade @@ -0,0 +1,12 @@ +extends layouts/default + +block main + h1 Oops something went wrong + br + span 500 + +block content + #error-message-box + #error-stack-trace + pre + code!= error diff --git a/app/views/includes/foot.jade b/app/views/includes/foot.jade new file mode 100755 index 00000000..e69de29b diff --git a/app/views/includes/head.jade b/app/views/includes/head.jade new file mode 100755 index 00000000..08e4f44c --- /dev/null +++ b/app/views/includes/head.jade @@ -0,0 +1,12 @@ +head + meta(charset='utf-8') + meta(http-equiv='X-UA-Compatible', content='IE=edge,chrome=1') + meta(name='viewport', content='width=device-width,initial-scale=1') + + title BitPay + meta(http-equiv='Content-type', content='text/html;charset=UTF-8') + meta(name="keywords", content="node.js, express, mongoose, mongodb, angularjs") + meta(name="description", content="Mystery") + + link(href='/img/icons/favicon.ico', rel='shortcut icon', type='image/x-icon') + diff --git a/app/views/index.jade b/app/views/index.jade new file mode 100755 index 00000000..874b0421 --- /dev/null +++ b/app/views/index.jade @@ -0,0 +1,4 @@ +extends layouts/default + +block content + h1 Hello BitPay! diff --git a/app/views/layouts/default.jade b/app/views/layouts/default.jade new file mode 100755 index 00000000..3c47dc27 --- /dev/null +++ b/app/views/layouts/default.jade @@ -0,0 +1,8 @@ +doctype html +html(lang='en', xmlns='http://www.w3.org/1999/xhtml') + include ../includes/head + body + section.content + section.container + block content + include ../includes/foot diff --git a/config/config.js b/config/config.js new file mode 100644 index 00000000..b4b42300 --- /dev/null +++ b/config/config.js @@ -0,0 +1,9 @@ +'use strict'; + +var _ = require('lodash'); + +// Load app configuration + +module.exports = _.extend( + require(__dirname + '/../config/env/all.js'), + require(__dirname + '/../config/env/' + process.env.NODE_ENV + '.js') || {}); diff --git a/config/env/all.js b/config/env/all.js new file mode 100755 index 00000000..22d15f7e --- /dev/null +++ b/config/env/all.js @@ -0,0 +1,10 @@ +'use strict'; + +var path = require('path'), +rootPath = path.normalize(__dirname + '/../..'); + +module.exports = { + root: rootPath, + port: process.env.PORT || 3000, + db: process.env.MONGOHQ_URL +} diff --git a/config/env/development.js b/config/env/development.js new file mode 100755 index 00000000..b0a46656 --- /dev/null +++ b/config/env/development.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = { + db: "mongodb://localhost/mystery-dev", + app: { + name: "Mystery - Development" + } +} \ No newline at end of file diff --git a/config/env/production.js b/config/env/production.js new file mode 100755 index 00000000..9bc30bce --- /dev/null +++ b/config/env/production.js @@ -0,0 +1,8 @@ +'use strict'; + +module.exports = { + db: "mongodb://localhost/mystery", + app: { + name: "Mystery - Production" + } +} \ No newline at end of file diff --git a/config/env/test.js b/config/env/test.js new file mode 100755 index 00000000..7b30a47c --- /dev/null +++ b/config/env/test.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = { + db: "mongodb://localhost/mystery-test", + port: 3001, + app: { + name: "Mystery - Test" + } +} \ No newline at end of file diff --git a/config/express.js b/config/express.js new file mode 100644 index 00000000..08343fe0 --- /dev/null +++ b/config/express.js @@ -0,0 +1,69 @@ +'use strict'; + +/** + * Module dependencies. + */ +var express = require('express'), + config = require('./config'); + +module.exports = function(app, passport, db) { + app.set('showStackError', true); + + //Prettify HTML + app.locals.pretty = true; + + //Should be placed before express.static + app.use(express.compress({ + filter: function(req, res) { + return (/json|text|javascript|css/).test(res.getHeader('Content-Type')); + }, + level: 9 + })); + + //Set views path, template engine and default layout + app.set('views', config.root + '/app/views'); + app.set('view engine', 'jade'); + + //Enable jsonp + app.enable("jsonp callback"); + + app.configure(function() { + //cookieParser should be above session + app.use(express.cookieParser()); + + // request body parsing middleware should be above methodOverride + app.use(express.urlencoded()); + app.use(express.json()); + app.use(express.methodOverride()); + + //routes should be at the last + app.use(app.router); + + //Setting the fav icon and static folder + app.use(express.favicon()); + app.use(express.static(config.root + '/public')); + + //Assume "not found" in the error msgs is a 404. this is somewhat silly, but valid, you can do whatever you like, set properties, use instanceof etc. + app.use(function(err, req, res, next) { + //Treat as 404 + if (~err.message.indexOf('not found')) return next(); + + //Log it + console.error(err.stack); + + //Error page + res.status(500).render('500', { + error: err.stack + }); + }); + + //Assume 404 since no middleware responded + app.use(function(req, res, next) { + res.status(404).render('404', { + url: req.originalUrl, + error: 'Not found' + }); + }); + + }); +}; \ No newline at end of file diff --git a/config/routes.js b/config/routes.js new file mode 100644 index 00000000..9fbf7481 --- /dev/null +++ b/config/routes.js @@ -0,0 +1,9 @@ +'use strict'; + +module.exports = function(app) { + + //Home route + var index = require('../app/controllers/index'); + app.get('/', index.render); + +}; diff --git a/package.json b/package.json index 477fe833..68b82531 100644 --- a/package.json +++ b/package.json @@ -29,5 +29,11 @@ ], "engines": { "node": "*" - } + }, + "dependencies": { + "express": "~3.4.7", + "jade": "~1.0.2", + "mongoose": "~3.8.3", + "lodash": "~2.4.1" + } } diff --git a/server.js b/server.js new file mode 100644 index 00000000..68bb10f7 --- /dev/null +++ b/server.js @@ -0,0 +1,55 @@ +'use strict'; + +/** + * Module dependencies. + */ +var express = require('express'), + fs = require('fs'); + +/** + * Main application entry file. + */ + +//Load configurations +//Set the node enviornment variable if not set before +process.env.NODE_ENV = process.env.NODE_ENV || 'development'; + +//Initializing system variables +var config = require('./config/config'), + mongoose = require('mongoose'); + +//Bootstrap db connection +var db = mongoose.connect(config.db); + +//Bootstrap models +var models_path = __dirname + '/app/models'; +var walk = function(path) { + fs.readdirSync(path).forEach(function(file) { + var newPath = path + '/' + file; + var stat = fs.statSync(newPath); + if (stat.isFile()) { + if (/(.*)\.(js$|coffee$)/.test(file)) { + require(newPath); + } + } else if (stat.isDirectory()) { + walk(newPath); + } + }); +}; +walk(models_path); + +var app = express(); + +//express settings +require('./config/express')(app, db); + +//Bootstrap routes +require('./config/routes')(app); + +//Start the app by listening on +var port = process.env.PORT || config.port; +app.listen(port); +console.log('Express app started on port ' + port); + +//expose app +exports = module.exports = app;