diff options
| author | Adam Soltys <[email protected]> | 2014-07-31 21:06:23 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2014-07-31 21:06:23 -0700 |
| commit | 7c5dfc8d51efe4df4e67f86f33c489a320fcb8f9 (patch) | |
| tree | f387c3d4e3ce9ed0c464659a787b99d8c6e90fb9 | |
| parent | de1cdd2e3f9d9f36ce3d8e97335341cc3237e829 (diff) | |
| download | coinos-server-7c5dfc8d51efe4df4e67f86f33c489a320fcb8f9.tar.gz coinos-server-7c5dfc8d51efe4df4e67f86f33c489a320fcb8f9.zip | |
Move coffee files to src/ folder
| -rw-r--r-- | Gruntfile.coffee | 2 | ||||
| -rw-r--r-- | Gruntfile.js | 47 | ||||
| -rw-r--r-- | src/app.coffee (renamed from app.coffee) | 0 | ||||
| -rw-r--r-- | src/app.js | 128 | ||||
| -rw-r--r-- | src/install.coffee (renamed from install.coffee) | 0 | ||||
| -rw-r--r-- | src/install.js | 23 | ||||
| -rw-r--r-- | src/passport.coffee (renamed from passport.coffee) | 0 | ||||
| -rw-r--r-- | src/passport.js | 45 | ||||
| -rw-r--r-- | src/redis.coffee (renamed from redis.coffee) | 0 | ||||
| -rw-r--r-- | src/redis.js | 11 | ||||
| -rw-r--r-- | src/routes/calculator.coffee (renamed from routes/calculator.coffee) | 0 | ||||
| -rw-r--r-- | src/routes/calculator.js | 42 | ||||
| -rw-r--r-- | src/routes/sessions.coffee (renamed from routes/sessions.coffee) | 0 | ||||
| -rw-r--r-- | src/routes/sessions.js | 34 | ||||
| -rw-r--r-- | src/routes/transactions.coffee (renamed from routes/transactions.coffee) | 0 | ||||
| -rw-r--r-- | src/routes/transactions.js | 48 | ||||
| -rw-r--r-- | src/routes/users.coffee (renamed from routes/users.coffee) | 0 | ||||
| -rw-r--r-- | src/routes/users.js | 130 | ||||
| -rw-r--r-- | src/socket_test.coffee (renamed from socket_test.coffee) | 0 | ||||
| -rw-r--r-- | src/socket_test.js | 64 |
20 files changed, 526 insertions, 48 deletions
diff --git a/Gruntfile.coffee b/Gruntfile.coffee index 71538115..df462b62 100644 --- a/Gruntfile.coffee +++ b/Gruntfile.coffee @@ -16,7 +16,7 @@ module.exports = (grunt) -> glob_to_multiple: expand: true cwd: '.' - src: '**/*.coffee' + src: 'src/**/*.coffee' dest: '.' ext: '.js' watch: diff --git a/Gruntfile.js b/Gruntfile.js deleted file mode 100644 index a7a54128..00000000 --- a/Gruntfile.js +++ /dev/null @@ -1,47 +0,0 @@ -(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); diff --git a/app.coffee b/src/app.coffee index e0930713..e0930713 100644 --- a/app.coffee +++ b/src/app.coffee diff --git a/src/app.js b/src/app.js new file mode 100644 index 00000000..05452d81 --- /dev/null +++ b/src/app.js @@ -0,0 +1,128 @@ +(function() { + var RedisStore, app, authorize, bodyParser, calculator, cookieParser, engines, express, passport, path, session, sessionStore, sessions, transactions, users; + + express = require('express'); + + bodyParser = require('body-parser'); + + cookieParser = require('cookie-parser'); + + 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); + + session = require('express-session'); + + RedisStore = require('connect-redis')(session); + + 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(bodyParser.urlencoded({ + extended: true + })); + + app.use(bodyParser.json()); + + app.use(bodyParser.json({ + type: 'application/vnd.api+json' + })); + + app.use(cookieParser('weareallmadeofstars')); + + app.use(session({ + resave: true, + saveUninitialized: true, + secret: 'weareallmadeofstars', + store: sessionStore, + cookie: { + maxAge: 25920000000 + }, + key: 'vanbtc.sid' + })); + + app.use(passport.initialize()); + + app.use(passport.session()); + + 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.coffee b/src/install.coffee index 38e32b6f..38e32b6f 100644 --- a/install.coffee +++ b/src/install.coffee diff --git a/src/install.js b/src/install.js new file mode 100644 index 00000000..088d593e --- /dev/null +++ b/src/install.js @@ -0,0 +1,23 @@ +(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() { + console.log("Created admin user with password 'admin'"); + return process.exit(); + }); + }); + } + }); + +}).call(this); diff --git a/passport.coffee b/src/passport.coffee index 12913424..12913424 100644 --- a/passport.coffee +++ b/src/passport.coffee diff --git a/src/passport.js b/src/passport.js new file mode 100644 index 00000000..aa11d658 --- /dev/null +++ b/src/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.coffee b/src/redis.coffee index 38524595..38524595 100644 --- a/redis.coffee +++ b/src/redis.coffee diff --git a/src/redis.js b/src/redis.js new file mode 100644 index 00000000..85312c4e --- /dev/null +++ b/src/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.coffee b/src/routes/calculator.coffee index 891fdce8..891fdce8 100644 --- a/routes/calculator.coffee +++ b/src/routes/calculator.coffee diff --git a/src/routes/calculator.js b/src/routes/calculator.js new file mode 100644 index 00000000..3e067df6 --- /dev/null +++ b/src/routes/calculator.js @@ -0,0 +1,42 @@ +(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', + x: 'meow' + }); + }; + + 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.coffee b/src/routes/sessions.coffee index 775c52ac..775c52ac 100644 --- a/routes/sessions.coffee +++ b/src/routes/sessions.coffee diff --git a/src/routes/sessions.js b/src/routes/sessions.js new file mode 100644 index 00000000..f038b484 --- /dev/null +++ b/src/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.coffee b/src/routes/transactions.coffee index 0bdaeed6..0bdaeed6 100644 --- a/routes/transactions.coffee +++ b/src/routes/transactions.coffee diff --git a/src/routes/transactions.js b/src/routes/transactions.js new file mode 100644 index 00000000..97fc5659 --- /dev/null +++ b/src/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.coffee b/src/routes/users.coffee index db4dde03..db4dde03 100644 --- a/routes/users.coffee +++ b/src/routes/users.coffee diff --git a/src/routes/users.js b/src/routes/users.js new file mode 100644 index 00000000..137d5bb9 --- /dev/null +++ b/src/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/socket_test.coffee b/src/socket_test.coffee index 315be3a3..315be3a3 100644 --- a/socket_test.coffee +++ b/src/socket_test.coffee diff --git a/src/socket_test.js b/src/socket_test.js new file mode 100644 index 00000000..a029c016 --- /dev/null +++ b/src/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); |
