Skip to content

Commit d05e805

Browse files
committed
Add redis and endpoint that uses it
1 parent 4c1b7bf commit d05e805

10 files changed

Lines changed: 111 additions & 1 deletion

File tree

Gruntfile.js

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,6 @@ module.exports = function(grunt) {
9393
],
9494
},
9595
src: [
96-
'Gruntfile.js',
9796
'src/**/*.js',
9897
'test/**/*.js',
9998
'config/**/*.js',

config/env/development.js.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
module.exports = {
22
env: 'development',
3+
redis_db: 1,
34
};

config/env/production.js.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,5 @@ module.exports = {
22
env: 'production',
33
ip: process.env.IP || '0.0.0.0',
44
port: process.env.PORT || 8080,
5+
redis_db: 3,
56
};

config/env/test.js.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
module.exports = {
22
env: 'test',
3+
redis_db: 2,
34
};

package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,15 @@
2929
"should": "^4.0.4"
3030
},
3131
"dependencies": {
32+
"async": "^0.9.0",
3233
"body-parser": "^1.8.2",
3334
"express": "^4.9.3",
3435
"grunt-env": "^0.4.1",
3536
"grunt-express-server": "^0.4.19",
37+
"hiredis": "^0.1.17",
3638
"lodash": "^2.4.1",
3739
"node-strict": "^1.0.0",
40+
"redis": "^0.12.1",
3841
"request": "^2.44.0",
3942
"winston": "^0.8.0"
4043
}

src/controllers/request-counter.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
module.exports = RequestCounter;
2+
3+
var redis = require('../resources/redis'),
4+
ApiResponder = require('../resources/api-responder');
5+
6+
var NUM_REQS_KEY = 'NUM_REQS';
7+
8+
RequestCounter.get = function(req, res) {
9+
redis.incr(NUM_REQS_KEY, function(err, newVal) {
10+
var apiResponder = new ApiResponder(res);
11+
if (err) {
12+
apiResponder.sendError(err);
13+
} else {
14+
var data = { num_reqs: newVal };
15+
apiResponder.sendSuccess(data);
16+
}
17+
});
18+
};
19+
20+
function RequestCounter() {}

src/resources/api-responder.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
module.exports = ApiResponder;
2+
3+
var _ = require('lodash');
4+
5+
function ApiResponder(res) {
6+
this.res = res;
7+
this.sendSuccess = function(data) {
8+
this.res.status(200).send(data);
9+
};
10+
11+
this.sendError = function(err) {
12+
this.res.status(500).send(err);
13+
};
14+
}
15+

src/resources/redis.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
var redis = require('redis');
2+
var config = require('../../config/config');
3+
4+
var client = client || redis.createClient(),
5+
initialized = initialized || false,
6+
initializing = initializing || false;
7+
8+
if (shouldInitialize()) {
9+
signalInitStart();
10+
client.select(config.redis_db,
11+
signalInitEnd);
12+
}
13+
14+
function shouldInitialize() {
15+
return !initialized && !initializing;
16+
}
17+
18+
function signalInitStart() {
19+
initializing = true;
20+
}
21+
22+
function signalInitEnd(err) {
23+
initializing = false;
24+
initialized = !err;
25+
if (err) throw err;
26+
}
27+
28+
29+
module.exports = client;

src/routes.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
var requestCounterController = require('./controllers/request-counter');
2+
13
module.exports = function(app) {
4+
app.get('/requestcounter', requestCounterController.get);
5+
26
app.get('/', function(req, res) {
37
res
48
.status(200)

test/request-counter.js

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
var should = require('should'),
2+
request = require('request'),
3+
async = require('async');
4+
5+
var config = require('../config/config');
6+
7+
var redis = require('../src/resources/redis');
8+
9+
before(function(done) {
10+
redis.flushdb(done);
11+
});
12+
13+
after(function(done) {
14+
redis.flushdb(done);
15+
});
16+
17+
it('should count the number of requests sent', function(done) {
18+
var url = 'http://' + config.ip + ':' + config.port + '/requestcounter';
19+
20+
async.times(5, function(n, next) {
21+
request(url, function(err, resp, body) {
22+
if (err) next(err);
23+
24+
try {
25+
body = JSON.parse(body);
26+
var found = parseInt(body.num_reqs),
27+
expected = n + 1;
28+
found.should.equal(expected);
29+
next();
30+
} catch(e) {
31+
next(e);
32+
}
33+
});
34+
},
35+
done);
36+
});
37+

0 commit comments

Comments
 (0)