mirror of
https://github.com/sudoxnym/habitica.git
synced 2026-05-24 22:55:50 +00:00
rewrite: begin the great server-side javascript migration
This commit is contained in:
parent
10b0c9f9a5
commit
ad67cbcc1c
9 changed files with 209 additions and 180 deletions
|
|
@ -41,7 +41,7 @@
|
|||
"npm": "1.2.x"
|
||||
},
|
||||
"scripts": {
|
||||
"start": "nodemon src/server.coffee",
|
||||
"start": "nodemon src/server.js",
|
||||
"test": "mocha test/api.mocha.coffee",
|
||||
"postinstall": "./node_modules/bower/bin/bower install -f"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,20 +0,0 @@
|
|||
# Load nconf and define default configuration values if config.json or ENV vars are not found
|
||||
conf = require("nconf")
|
||||
path = require("path")
|
||||
conf
|
||||
.argv()
|
||||
.env()
|
||||
.file('defaults', path.join(path.resolve __dirname, '../config.json.example'))
|
||||
.file('user', path.join(path.resolve __dirname, '../config.json'))
|
||||
|
||||
#var agent;
|
||||
#if (process.env.NODE_ENV === 'development') {
|
||||
# // Follow these instructions for profiling / debugging leaks
|
||||
# // * https://developers.google.com/chrome-developer-tools/docs/heap-profiling
|
||||
# // * https://developers.google.com/chrome-developer-tools/docs/memory-analysis-101
|
||||
# agent = require('webkit-devtools-agent');
|
||||
# console.log("To debug memory leaks:" +
|
||||
# "\n\t(1) Run `kill -SIGUSR2 " + process.pid + "`" +
|
||||
# "\n\t(2) open http://c4milo.github.com/node-webkit-agent/21.0.1180.57/inspector.html?host=localhost:1337&page=0");
|
||||
#}
|
||||
Error.stackTraceLimit = Infinity if conf.get('NODE_ENV') is "development"
|
||||
28
src/config.js
Normal file
28
src/config.js
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
/* Load nconf and define default configuration values if config.json or ENV vars are not found*/
|
||||
|
||||
|
||||
var conf = require("nconf");
|
||||
var path = require("path");
|
||||
|
||||
conf.argv()
|
||||
.env()
|
||||
.file('defaults', path.join(path.resolve(__dirname, '../config.json.example')))
|
||||
.file('user', path.join(path.resolve(__dirname, '../config.json')));
|
||||
|
||||
/*
|
||||
var agent;
|
||||
if (process.env.NODE_ENV === 'development') {
|
||||
// Follow these instructions for profiling / debugging leaks
|
||||
// * https://developers.google.com/chrome-developer-tools/docs/heap-profiling
|
||||
// * https://developers.google.com/chrome-developer-tools/docs/memory-analysis-101
|
||||
agent = require('webkit-devtools-agent');
|
||||
console.log("To debug memory leaks:" +
|
||||
"\n\t(1) Run `kill -SIGUSR2 " + process.pid + "`" +
|
||||
"\n\t(2) open http://c4milo.github.com/node-webkit-agent/21.0.1180.57/inspector.html?host=localhost:1337&page=0");
|
||||
}
|
||||
*/
|
||||
|
||||
|
||||
if (conf.get('NODE_ENV') === "development") {
|
||||
Error.stackTraceLimit = Infinity;
|
||||
}
|
||||
|
|
@ -1,30 +0,0 @@
|
|||
nconf = require('nconf')
|
||||
|
||||
process.on "uncaughtException", (error) ->
|
||||
sendEmail = (mailData) ->
|
||||
nodemailer = require("derby-auth/node_modules/nodemailer")
|
||||
|
||||
# create reusable transport method (opens pool of SMTP connections)
|
||||
# TODO derby-auth isn't currently configurable here, if you need customizations please send pull request
|
||||
smtpTransport = nodemailer.createTransport("SMTP",
|
||||
service: nconf.get('SMTP_SERVICE')
|
||||
auth:
|
||||
user: nconf.get('SMTP_USER')
|
||||
pass: nconf.get('SMTP_PASS')
|
||||
)
|
||||
|
||||
# send mail with defined transport object
|
||||
smtpTransport.sendMail mailData, (error, response) ->
|
||||
if error
|
||||
console.log error
|
||||
else
|
||||
console.log "Message sent: " + response.message
|
||||
smtpTransport.close() # shut down the connection pool, no more messages
|
||||
|
||||
sendEmail
|
||||
from: "HabitRPG <admin@habitrpg.com>"
|
||||
to: "tylerrenelle@gmail.com"
|
||||
subject: "HabitRPG Error"
|
||||
text: error.stack
|
||||
|
||||
console.log error.stack
|
||||
39
src/errors.js
Normal file
39
src/errors.js
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
var nconf = require('nconf');
|
||||
|
||||
process.on("uncaughtException", function(error) {
|
||||
var sendEmail;
|
||||
sendEmail = function(mailData) {
|
||||
var nodemailer, smtpTransport;
|
||||
nodemailer = require("derby-auth/node_modules/nodemailer");
|
||||
/* create reusable transport method (opens pool of SMTP connections)*/
|
||||
|
||||
/* TODO derby-auth isn't currently configurable here, if you need customizations please send pull request*/
|
||||
|
||||
smtpTransport = nodemailer.createTransport("SMTP", {
|
||||
service: nconf.get('SMTP_SERVICE'),
|
||||
auth: {
|
||||
user: nconf.get('SMTP_USER'),
|
||||
pass: nconf.get('SMTP_PASS')
|
||||
}
|
||||
});
|
||||
/* send mail with defined transport object*/
|
||||
|
||||
return smtpTransport.sendMail(mailData, function(error, response) {
|
||||
if (error) {
|
||||
console.log(error);
|
||||
} else {
|
||||
console.log("Message sent: " + response.message);
|
||||
}
|
||||
/* shut down the connection pool, no more messages*/
|
||||
|
||||
return smtpTransport.close();
|
||||
});
|
||||
};
|
||||
sendEmail({
|
||||
from: "HabitRPG <admin@habitrpg.com>",
|
||||
to: "tylerrenelle@gmail.com",
|
||||
subject: "HabitRPG Error",
|
||||
text: error.stack
|
||||
});
|
||||
return console.log(error.stack);
|
||||
});
|
||||
|
|
@ -1,33 +0,0 @@
|
|||
nconf = require('nconf')
|
||||
_ = require('lodash')
|
||||
|
||||
module.exports = (req, res, next) ->
|
||||
|
||||
# splash = (req, res, next) ->
|
||||
# isStatic = req.url.split('/')[1] is 'static'
|
||||
# unless req.query?.play? or req.getModel().get('_userId') or isStatic
|
||||
# res.redirect('/static/front')
|
||||
# else
|
||||
# next()
|
||||
|
||||
## Set _mobileDevice to true or false so view can exclude portions from mobile device
|
||||
_.defaults (res.locals.habitrpg ?= {}),
|
||||
NODE_ENV: nconf.get('NODE_ENV')
|
||||
IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header 'User-Agent')
|
||||
|
||||
#CORS middleware
|
||||
res.header "Access-Control-Allow-Origin", (req.headers.origin || "*")
|
||||
res.header "Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,HEAD,DELETE"
|
||||
res.header "Access-Control-Allow-Headers", "Content-Type,Accept,Content-Encoding,X-Requested-With,x-api-user,x-api-key"
|
||||
|
||||
# wtf is this for?
|
||||
if req.method is 'OPTIONS'
|
||||
return res.send(200);
|
||||
|
||||
# translate = (req, res, next) ->
|
||||
# model = req.getModel()
|
||||
# # Set locale to bg on dev
|
||||
# #model.set '_i18n.locale', 'bg' if process.env.NODE_ENV is "development"
|
||||
# next()
|
||||
|
||||
next()
|
||||
40
src/middleware.js
Normal file
40
src/middleware.js
Normal file
|
|
@ -0,0 +1,40 @@
|
|||
var nconf = require('nconf');
|
||||
var _ = require('lodash');
|
||||
|
||||
module.exports = function(req, res, next) {
|
||||
/*
|
||||
//splash = (req, res, next) ->
|
||||
// isStatic = req.url.split('/')[1] is 'static'
|
||||
// unless req.query?.play? or req.getModel().get('_userId') or isStatic
|
||||
// res.redirect('/static/front')
|
||||
// else
|
||||
// next()
|
||||
*/
|
||||
|
||||
/* Set _mobileDevice to true or false so view can exclude portions from mobile device*/
|
||||
|
||||
var _base;
|
||||
_.defaults(((_base = res.locals).habitrpg != null ? (_base = res.locals).habitrpg : _base.habitrpg = {}), {
|
||||
NODE_ENV: nconf.get('NODE_ENV'),
|
||||
IS_MOBILE: /Android|webOS|iPhone|iPad|iPod|BlackBerry/i.test(req.header('User-Agent'))
|
||||
});
|
||||
/*CORS middleware*/
|
||||
|
||||
res.header("Access-Control-Allow-Origin", req.headers.origin || "*");
|
||||
res.header("Access-Control-Allow-Methods", "OPTIONS,GET,POST,PUT,HEAD,DELETE");
|
||||
res.header("Access-Control-Allow-Headers", "Content-Type,Accept,Content-Encoding,X-Requested-With,x-api-user,x-api-key");
|
||||
/* wtf is this for?*/
|
||||
|
||||
if (req.method === 'OPTIONS') {
|
||||
return res.send(200);
|
||||
}
|
||||
/*
|
||||
// translate = (req, res, next) ->
|
||||
// model = req.getModel()
|
||||
// # Set locale to bg on dev
|
||||
// #model.set '_i18n.locale', 'bg' if process.env.NODE_ENV is "development"
|
||||
// next()
|
||||
*/
|
||||
|
||||
return next();
|
||||
};
|
||||
|
|
@ -1,96 +0,0 @@
|
|||
express = require("express")
|
||||
http = require("http")
|
||||
path = require("path")
|
||||
app = express()
|
||||
nconf = require('nconf')
|
||||
require('./config') # Setup configurations
|
||||
require('./errors')
|
||||
|
||||
###
|
||||
MongoDB Configuration
|
||||
###
|
||||
|
||||
mongoose = require('mongoose')
|
||||
require('./models/user') # load up the user schema - TODO is this necessary?
|
||||
require('./models/group')
|
||||
module.exports = server
|
||||
|
||||
# Connect using Mongoose too for API purposes, we'll eventually phase out Derby and only use mongoose
|
||||
mongoose.connect nconf.get('NODE_DB_URI'), (err) ->
|
||||
throw err if (err)
|
||||
console.info('Connected with Mongoose')
|
||||
|
||||
###
|
||||
Server Configuration
|
||||
###
|
||||
|
||||
# all environments
|
||||
app.set "port", nconf.get('PORT')
|
||||
app.set "views", __dirname + "/../views"
|
||||
app.set "view engine", "jade"
|
||||
app.use express.favicon()
|
||||
app.use express.logger("dev")
|
||||
app.use express.bodyParser()
|
||||
app.use require('connect-assets')()
|
||||
app.use express.methodOverride()
|
||||
app.use app.router
|
||||
app.use express['static'](path.join(__dirname, "/../public"))
|
||||
|
||||
# development only
|
||||
app.use express.errorHandler() if "development" is app.get("env")
|
||||
|
||||
# Custom Directives
|
||||
app.use(require('./middleware'))
|
||||
app.use(require('./routes/pages').middleware)
|
||||
app.use('/api/v1', require('./routes/api').middleware)
|
||||
app.use(require('./controllers/deprecated').middleware)
|
||||
|
||||
server = http.createServer(app).listen app.get("port"), ->
|
||||
console.log "Express server listening on port " + app.get("port")
|
||||
module.exports = server
|
||||
|
||||
|
||||
|
||||
#ONE_YEAR = 1000 * 60 * 60 * 24 * 365
|
||||
#TWO_WEEKS = 1000 * 60 * 60 * 24 * 14
|
||||
#root = path.dirname path.dirname __dirname
|
||||
#publicPath = path.join root, 'public'
|
||||
#
|
||||
#
|
||||
#expressApp
|
||||
# .use(middleware.allowCrossDomain)
|
||||
# .use(express.favicon("#{publicPath}/favicon.ico"))
|
||||
# # Gzip static files and serve from memory
|
||||
# .use(gzippo.staticGzip(publicPath, maxAge: ONE_YEAR))
|
||||
# # Gzip dynamically rendered content
|
||||
# .use(express.compress())
|
||||
# .use(express.bodyParser())
|
||||
# .use(express.methodOverride())
|
||||
# # Uncomment and supply secret to add Derby session handling
|
||||
# # Derby session middleware creates req.session and socket.io sessions
|
||||
# .use(express.cookieParser())
|
||||
# .use(store.sessionMiddleware
|
||||
# secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE'
|
||||
# cookie: { maxAge: TWO_WEEKS } # defaults to 2 weeks? aka, can delete this line?
|
||||
# store: mongo_store
|
||||
# )
|
||||
# # Adds req.getModel method
|
||||
# .use(store.modelMiddleware())
|
||||
# .use(middleware.translate)
|
||||
# # API should be hit before all other routes
|
||||
|
||||
# # Show splash page for newcomers
|
||||
# .use(middleware.splash)
|
||||
# .use(priv.middleware)
|
||||
# .use(middleware.view)
|
||||
# .use(auth.middleware(strategies, options))
|
||||
# # Creates an express middleware from the app's routes
|
||||
# .use(app.router())
|
||||
# .use(require('./static').middleware)
|
||||
# .use(expressApp.router)
|
||||
# .use(serverError(root))
|
||||
#
|
||||
#
|
||||
## Errors
|
||||
#expressApp.all '*', (req) ->
|
||||
# throw "404: #{req.url}"
|
||||
101
src/server.js
Normal file
101
src/server.js
Normal file
|
|
@ -0,0 +1,101 @@
|
|||
require('coffee-script') // remove this once we've fully converted over
|
||||
|
||||
var express = require("express");
|
||||
var http = require("http");
|
||||
var path = require("path");
|
||||
var app = express();
|
||||
var nconf = require('nconf');
|
||||
var server;
|
||||
|
||||
// Setup configurations
|
||||
require('./config');
|
||||
require('./errors');
|
||||
|
||||
// MongoDB Configuration
|
||||
mongoose = require('mongoose');
|
||||
require('./models/user'); //load up the user schema - TODO is this necessary?
|
||||
require('./models/group');
|
||||
mongoose.connect(nconf.get('NODE_DB_URI'), function(err) {
|
||||
if (err) throw err;
|
||||
console.info('Connected with Mongoose');
|
||||
});
|
||||
|
||||
/*
|
||||
Server Configuration
|
||||
*/
|
||||
|
||||
|
||||
// all environments
|
||||
app.set("port", nconf.get('PORT'));
|
||||
app.set("views", __dirname + "/../views");
|
||||
app.set("view engine", "jade");
|
||||
app.use(express.favicon());
|
||||
app.use(express.logger("dev"));
|
||||
app.use(express.bodyParser());
|
||||
app.use(require('connect-assets')());
|
||||
app.use(express.methodOverride());
|
||||
app.use(app.router);
|
||||
app.use(express['static'](path.join(__dirname, "/../public")));
|
||||
|
||||
// development only
|
||||
if ("development" === app.get("env")) {
|
||||
app.use(express.errorHandler());
|
||||
}
|
||||
|
||||
// Custom Directives
|
||||
app.use(require('./middleware'));
|
||||
app.use(require('./routes/pages').middleware);
|
||||
app.use('/api/v1', require('./routes/api').middleware);
|
||||
app.use(require('./controllers/deprecated').middleware);
|
||||
server = http.createServer(app).listen(app.get("port"), function() {
|
||||
return console.log("Express server listening on port " + app.get("port"));
|
||||
});
|
||||
|
||||
module.exports = server;
|
||||
|
||||
/*
|
||||
#ONE_YEAR = 1000 * 60 * 60 * 24 * 365
|
||||
#TWO_WEEKS = 1000 * 60 * 60 * 24 * 14
|
||||
#root = path.dirname path.dirname __dirname
|
||||
#publicPath = path.join root, 'public'
|
||||
#
|
||||
#
|
||||
#expressApp
|
||||
# .use(middleware.allowCrossDomain)
|
||||
# .use(express.favicon("#{publicPath}/favicon.ico"))
|
||||
# # Gzip static files and serve from memory
|
||||
# .use(gzippo.staticGzip(publicPath, maxAge: ONE_YEAR))
|
||||
# # Gzip dynamically rendered content
|
||||
# .use(express.compress())
|
||||
# .use(express.bodyParser())
|
||||
# .use(express.methodOverride())
|
||||
# # Uncomment and supply secret to add Derby session handling
|
||||
# # Derby session middleware creates req.session and socket.io sessions
|
||||
# .use(express.cookieParser())
|
||||
# .use(store.sessionMiddleware
|
||||
# secret: process.env.SESSION_SECRET || 'YOUR SECRET HERE'
|
||||
# cookie: { maxAge: TWO_WEEKS } # defaults to 2 weeks? aka, can delete this line?
|
||||
# store: mongo_store
|
||||
# )
|
||||
# # Adds req.getModel method
|
||||
# .use(store.modelMiddleware())
|
||||
# .use(middleware.translate)
|
||||
# # API should be hit before all other routes
|
||||
|
||||
# # Show splash page for newcomers
|
||||
# .use(middleware.splash)
|
||||
# .use(priv.middleware)
|
||||
# .use(middleware.view)
|
||||
# .use(auth.middleware(strategies, options))
|
||||
# # Creates an express middleware from the app's routes
|
||||
# .use(app.router())
|
||||
# .use(require('./static').middleware)
|
||||
# .use(expressApp.router)
|
||||
# .use(serverError(root))
|
||||
#
|
||||
#
|
||||
## Errors
|
||||
#expressApp.all '*', (req) ->
|
||||
# throw "404: #{req.url}"
|
||||
*/
|
||||
|
||||
Loading…
Reference in a new issue