diff options
| author | Adam Soltys <[email protected]> | 2014-07-20 11:24:09 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2014-07-20 11:40:36 -0700 |
| commit | 51daca704f27e59462c6d8b1731867007c8fd273 (patch) | |
| tree | e573e97c4704710ff1fd8dbd5ff033504847890a | |
| parent | 9b8d66d8a7c9417132358ac2b0f0dbfa4fcd9fcd (diff) | |
| download | coinos-server-51daca704f27e59462c6d8b1731867007c8fd273.tar.gz coinos-server-51daca704f27e59462c6d8b1731867007c8fd273.zip | |
Precompile all coffeescript
| -rw-r--r-- | Gruntfile.coffee | 6 | ||||
| -rw-r--r-- | Gruntfile.js | 47 | ||||
| -rw-r--r-- | app.coffee | 2 | ||||
| -rw-r--r-- | app.js | 114 | ||||
| -rw-r--r-- | install.js | 40 | ||||
| -rw-r--r-- | passport.js | 45 | ||||
| -rw-r--r-- | redis.js | 11 | ||||
| -rw-r--r-- | routes/calculator.js | 41 | ||||
| -rw-r--r-- | routes/sessions.js | 34 | ||||
| -rw-r--r-- | routes/transactions.js | 48 | ||||
| -rw-r--r-- | routes/users.js | 130 | ||||
| -rw-r--r-- | sequelize.js | 10 | ||||
| -rw-r--r-- | socket_test.js | 64 |
13 files changed, 588 insertions, 4 deletions
diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 530fdb6a..71538115 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -15,16 +15,16 @@ module.exports = (grunt) -> coffee: glob_to_multiple: expand: true - cwd: 'public/js' + cwd: '.' src: '**/*.coffee' - dest: 'public/js' + dest: '.' ext: '.js' watch: less: files: ['public/css/**/*.less'] tasks: ['less'] coffee: - files: ['public/js/**/*.coffee'] + files: ['**/*.coffee'] tasks: ['coffee'] ) diff --git a/Gruntfile.js b/Gruntfile.js new file mode 100644 index 00000000..a7a54128 --- /dev/null +++ b/Gruntfile.js @@ -0,0 +1,47 @@ +(function() { + module.exports = function(grunt) { + grunt.initConfig({ + pkg: grunt.file.readJSON('package.json'), + less: { + css: { + options: { + paths: ["public/css"] + }, + files: [ + { + expand: true, + cwd: 'public/css', + src: ['*.less'], + dest: 'public/css', + ext: '.css' + } + ] + } + }, + coffee: { + glob_to_multiple: { + expand: true, + cwd: '.', + src: '**/*.coffee', + dest: '.', + ext: '.js' + } + }, + watch: { + less: { + files: ['public/css/**/*.less'], + tasks: ['less'] + }, + coffee: { + files: ['**/*.coffee'], + tasks: ['coffee'] + } + } + }); + grunt.loadNpmTasks('grunt-contrib-coffee'); + grunt.loadNpmTasks('grunt-contrib-less'); + grunt.loadNpmTasks('grunt-contrib-watch'); + return grunt.registerTask('default', ['less', 'coffee']); + }; + +}).call(this); @@ -64,4 +64,4 @@ app.use((err, req, res, next) -> res.end() ) -app.listen(3001) +app.listen(3000) @@ -0,0 +1,114 @@ +(function() { + var RedisStore, app, authorize, calculator, engines, express, passport, path, sessionStore, sessions, transactions, users; + + express = require('express'); + + path = require('path'); + + engines = require('consolidate'); + + passport = require('./passport'); + + calculator = require("./routes/calculator"); + + sessions = require("./routes/sessions")(passport); + + transactions = require("./routes/transactions"); + + users = require("./routes/users")(sessions); + + RedisStore = require('connect-redis')(express); + + sessionStore = new RedisStore(require('./redis').host, { + ttl: 172800 + }); + + app = express(); + + app.enable('trust proxy'); + + app.engine('html', require('hogan-express')); + + app.set('view engine', 'html'); + + app.set('views', __dirname + '/views'); + + app.use(express["static"](__dirname + '/public')); + + app.use(require('connect-assets')({ + src: 'public' + })); + + app.use(express.bodyParser()); + + app.use(express.cookieParser()); + + app.use(express.session({ + secret: 'weareallmadeofstars', + store: sessionStore, + cookie: { + maxAge: 25920000000 + }, + key: 'vanbtc.sid' + })); + + app.use(passport.initialize()); + + app.use(passport.session()); + + app.use(app.router); + + authorize = function(req, res, next) { + var _ref, _ref1, _ref2; + if (req.params.user === ((_ref = req.user) != null ? _ref.username : void 0) || ((_ref1 = req.user) != null ? _ref1.username : void 0) === 'admin' || ((_ref2 = req.user) != null ? _ref2.username : void 0) === 'ben') { + return next(); + } + return res.redirect('/login'); + }; + + app.get('/', sessions["new"]); + + app.get('/register', users["new"]); + + app.get('/ticker', calculator.ticker); + + app.get('/sweep', calculator.sweep); + + app.get('/login', sessions["new"]); + + app.post('/login', sessions.create); + + app.get('/logout', sessions.destroy); + + app.get('/:user/exists', users.exists); + + app.get('/:user.json', users.json); + + app.get('/users', users.index); + + app.get('/users/new', users["new"]); + + app.post('/users', users.create); + + app.get('/:user/edit', authorize, users.edit); + + app.post('/:user/update', authorize, users.update); + + app.get('/:user/transactions.json', authorize, transactions.json); + + app.post('/:user/transactions', transactions.create); + + app.get('/:user/report', authorize, transactions.index); + + app.get('/:user', users.show); + + app.use(function(err, req, res, next) { + res.status(500); + res.send('An error occurred'); + console.log(err); + return res.end(); + }); + + app.listen(3000); + +}).call(this); diff --git a/install.js b/install.js new file mode 100644 index 00000000..0e6256df --- /dev/null +++ b/install.js @@ -0,0 +1,40 @@ +(function() { + var bcrypt, db; + + db = require("./redis"); + + bcrypt = require('bcrypt'); + + db.get("user:admin", function(err, res) { + if (!res) { + return bcrypt.hash('admin', 12, function(err, hash) { + db.sadd("users", "user:admin"); + return db.hmset("user:admin", { + username: 'admin', + password: hash + }, function() { + return console.log("Created admin user with password 'admin'"); + }); + }); + } + }); + + db.sismember("mts", "mt:rest", function(err, res) { + if (!res) { + db.hmset("mt:rest", { + code: "rest", + label: "Restaurant/Bar" + }, function() { + return db.sadd("mts", "mt:rest"); + }); + db.hmset("mt:coff", { + code: "rest", + label: "Coffee Shop" + }, function() { + return db.sadd("mts", "mt:coff"); + }); + return console.log("Added merchant types"); + } + }); + +}).call(this); diff --git a/passport.js b/passport.js new file mode 100644 index 00000000..aa11d658 --- /dev/null +++ b/passport.js @@ -0,0 +1,45 @@ +(function() { + var LocalStrategy, bcrypt, db, passport; + + db = require("redis").createClient(); + + bcrypt = require('bcrypt'); + + passport = require('passport'); + + LocalStrategy = require('passport-local').Strategy; + + passport.serializeUser(function(user, done) { + return done(null, user.username); + }); + + passport.deserializeUser(function(username, done) { + return db.hgetall("user:" + username, function(err, user) { + return done(null, user); + }); + }); + + passport.use(new LocalStrategy(function(username, password, done) { + return db.hget("user:" + username, 'password', function(err, hash) { + if (err) { + return done(err); + } + if (hash) { + return bcrypt.compare(password, hash, function(err, match) { + if (match) { + return db.hgetall("user:" + username, function(err, user) { + return done(null, user); + }); + } else { + return done(null, false); + } + }); + } else { + return done(null, false); + } + }); + })); + + module.exports = passport; + +}).call(this); diff --git a/redis.js b/redis.js new file mode 100644 index 00000000..85312c4e --- /dev/null +++ b/redis.js @@ -0,0 +1,11 @@ +(function() { + var settings; + + settings = { + port: 6379, + host: '127.0.0.1' + }; + + module.exports = require('redis').createClient(settings.port, settings.host); + +}).call(this); diff --git a/routes/calculator.js b/routes/calculator.js new file mode 100644 index 00000000..834d9bbc --- /dev/null +++ b/routes/calculator.js @@ -0,0 +1,41 @@ +(function() { + exports["new"] = function(req, res) { + return res.render('calculator/setup'); + }; + + exports.sweep = function(req, res) { + return res.render('calculator/sweep', { + layout: 'layout' + }); + }; + + exports.show = function(req, res) { + return res.render('calculator/show', { + layout: 'layout' + }); + }; + + exports.ticker = function(req, res) { + var fs; + fs = require('fs'); + return fs.readFile("./public/js/rates.json", function(err, data) { + var e, exchange, _base, _base1, _base2; + (_base = req.query).currency || (_base.currency = 'CAD'); + (_base1 = req.query).symbol || (_base1.symbol = 'quadrigacx'); + (_base2 = req.query).type || (_base2.type = 'bid'); + try { + exchange = JSON.parse(data)[req.query.currency][req.query.symbol]['rates'][req.query.type].toString(); + } catch (_error) { + e = _error; + exchange = "0"; + } + res.writeHead(200, { + 'Content-Length': exchange.length, + 'Content-Type': 'text/plain' + }); + res.write(exchange); + return res.end(); + }); + }; + +}).call(this); diff --git a/routes/sessions.js b/routes/sessions.js new file mode 100644 index 00000000..f038b484 --- /dev/null +++ b/routes/sessions.js @@ -0,0 +1,34 @@ +(function() { + module.exports = function(passport) { + return { + "new": function(req, res) { + return res.render('sessions/new'); + }, + create: function(req, res, next) { + return passport.authenticate('local', function(err, user, info) { + if (err) { + return next(err); + } + if (!user) { + return res.render('sessions/new', { + badpw: true + }); + } + return req.login(user, function(err) { + var url; + if (err) { + return next(err); + } + url = "/" + user.username + "/edit"; + return res.redirect(url); + }); + })(req, res, next); + }, + destroy: function(req, res) { + req.logout(); + return res.redirect('/login'); + } + }; + }; + +}).call(this); diff --git a/routes/transactions.js b/routes/transactions.js new file mode 100644 index 00000000..97fc5659 --- /dev/null +++ b/routes/transactions.js @@ -0,0 +1,48 @@ +(function() { + var db; + + db = require('../redis'); + + module.exports = { + json: function(req, res) { + var r, user; + user = req.params.user; + r = { + 'transactions': [] + }; + return db.lrange("" + user + ":transactions", 0, -1, function(err, transactions) { + var i, process; + process = function(err, t) { + r.transactions.push(t); + if (i >= transactions.length) { + res.write(JSON.stringify(r)); + return res.end(); + } else { + return db.hgetall("" + user + ":transactions:" + transactions[i++], process); + } + }; + i = 0; + return db.hgetall("" + user + ":transactions:" + transactions[i++], process); + }); + }, + create: function(req, res) { + var user; + user = req.params.user; + return db.incr('transactions', function(err, id) { + return db.hmset("" + user + ":transactions:" + id, req.body, function() { + return db.rpush("" + user + ":transactions", id, function() { + res.write(JSON.stringify(req.body)); + return res.end(); + }); + }); + }); + }, + index: function(req, res) { + return res.render('transactions/index', { + user: req.params.user, + layout: 'layout' + }); + } + }; + +}).call(this); diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 00000000..137d5bb9 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,130 @@ +(function() { + var bcrypt, db; + + db = require("../redis"); + + bcrypt = require('bcrypt'); + + module.exports = function(sessions) { + return { + exists: function(req, res) { + return db.hgetall("user:" + req.params.user, function(err, obj) { + if (obj != null) { + res.write('true'); + } else { + res.write('false'); + } + return res.end(); + }); + }, + json: function(req, res) { + return db.hgetall("user:" + req.params.user, function(err, obj) { + delete obj['password']; + res.writeHead(200, { + "Content-Type": "application/json" + }); + res.write(JSON.stringify(obj)); + return res.end(); + }); + }, + index: function(req, res) { + return; + return db.keys('*', function(err, obj) { + res.write(JSON.stringify(obj)); + return res.end(); + }); + }, + list: function(req, res) { + return res.render('users/index', { + layout: 'layout' + }); + }, + show: function(req, res) { + return db.hgetall("user:" + req.params.user, function(err, obj) { + if (obj) { + return res.render('calculator/show', { + user: req.params.user, + layout: 'layout' + }); + } else { + return res.render('sessions/new', { + notice: true + }); + } + }); + }, + "new": function(req, res) { + return res.render('users/new', { + js: (function() { + return global.js; + }), + css: (function() { + return global.css; + }) + }); + }, + create: function(req, res) { + var errormsg, userkey; + errormsg = ""; + userkey = "user:" + req.body.username; + return db.hgetall(userkey, function(err, obj) { + if (obj) { + return res.redirect(req.body.username); + } else { + if (req.body.confirm !== req.body.password) { + errormsg += "Passwords must match"; + return res.render('users/new', { + js: (function() { + return global.js; + }), + css: (function() { + return global.css; + }), + error: errormsg + }); + } + return bcrypt.hash(req.body.password, 12, function(err, hash) { + db.sadd("users", userkey); + return db.hmset(userkey, { + username: req.body.username, + password: hash, + email: req.body.email + }, function() { + req.headers['referer'] = "/" + req.body.username + "/edit"; + return sessions.create(req, res); + }); + }); + } + }); + }, + edit: function(req, res) { + return res.render('calculator/setup', { + user: req.params.user, + layout: 'layout' + }); + }, + update: function(req, res) { + if (!(req.params.user === req.user.username || req.user.username === 'admin' || req.user.username === 'ben')) { + return; + } + if (req.body.password === '') { + delete req.body.password; + } + return db.hmset("user:" + req.params.user, req.body, function() { + if (req.body.password == null) { + return res.redirect("/" + req.params.user); + } else { + return bcrypt.hash(req.body.password, 12, function(err, hash) { + return db.hmset("user:" + req.params.user, { + password: hash + }, function() { + return res.redirect("/" + req.params.user); + }); + }); + } + }); + } + }; + }; + +}).call(this); diff --git a/sequelize.js b/sequelize.js new file mode 100644 index 00000000..e14d543d --- /dev/null +++ b/sequelize.js @@ -0,0 +1,10 @@ +(function() { + var Sequelize; + + Sequelize = require('sequelize'); + + module.exports = new Sequelize('pos', 'adam', 'MPJzfq97', { + dialect: 'postgres' + }); + +}).call(this); diff --git a/socket_test.js b/socket_test.js new file mode 100644 index 00000000..a029c016 --- /dev/null +++ b/socket_test.js @@ -0,0 +1,64 @@ +(function() { + var socket, transaction; + + transaction = { + "hash": {}, + "version": 1, + "lock_time": 0, + "ins": [ + { + "s": {}, + "q": 4294967295, + "o": {} + } + ], + "outs": [ + { + "v": {}, + "s": {} + }, { + "v": {}, + "s": {} + } + ], + "_buffer": {}, + "txid": "8500a0893a2d83a17819673884ade21bbef07d8c92bfe51682e45873cc2d3720", + "vin": [ + { + "n": 0, + "txid": "1549415465c84fb519ffb92339ef80461427502c90d5d3ac5d01f27d824feabd", + "vout": 1 + } + ], + "vout": [ + { + "valueSat": 10000, + "scriptPubKey": { + "addresses": ["1VAnbtCAnYccECnjaMCPnWwt81EHCVgNr"] + }, + "n": 0 + }, { + "valueSat": 3966838180, + "scriptPubKey": { + "addresses": ["1Ao8Swc6vSosrjednQkNZeXEXVu1ZcxYZE"] + }, + "n": 1 + } + ], + "time": 1405573125 + }; + + $('body').append(transaction.vout[0].valueSat); + + socket = io('ws://insight.bitpay.com'); + + socket.on('connect', function() { + $('body').append('connected'); + return this.emit('subscribe', '1VAnbtCAnYccECnjaMCPnWwt81EHCVgNr'); + }); + + socket.on('1VAnbtCAnYccECnjaMCPnWwt81EHCVgNr', function(data) { + return $('body').append(JSON.stringify(data)); + }); + +}).call(this); |
