diff --git a/app/config/cache.js b/app/config/cache.js new file mode 100644 index 0000000..bd5c2a1 --- /dev/null +++ b/app/config/cache.js @@ -0,0 +1,37 @@ +var redis = require('redis'); + +// create a new redis client and connect to our local redis instance +var client = redis.createClient({ + host: 'redis' +}); + +// if an error occurs, print it to the console +client.on('error', function (err) { + console.log("Error " + err); +}); + +client.flushdb( function (err, succeeded) { + console.log(succeeded); // will be true if successfull +}); + +function cacheFilter(key) { + return function(key, req, res, next) { + client.get(key, function(error, result) { + if (result) { + console.log('>> source - cache'); + res.json(JSON.parse(result)); + } else { + next(); + } + }); + }.bind(null, key); +} + +function cache(key, value) { + // Cache last 10 hours + client.set(key, JSON.stringify(value), 'EX', 36000); +} + +module.exports = { + cacheFilter, cache +}; diff --git a/app/routes/attendance.js b/app/routes/attendance.js index 335bf64..9b41a72 100644 --- a/app/routes/attendance.js +++ b/app/routes/attendance.js @@ -1,6 +1,7 @@ var express = require('express'); var router = express.Router(); var models = require('../models'); +var cache = require('../config/cache'); /* Path: /legislature/LXIII/attendance => attendance.js /api/legislature/LXIII/attendance/avg @@ -10,21 +11,22 @@ var models = require('../models'); */ /* /api/legislature/LXIII/attendance */ -router.get('/', function(req, res, next) { - let queryString = - 'select * from attendance_list order by entries desc'; +router.get('/', cache.cacheFilter('LXIII-attendance'), function(req, res, next) { + let queryString = + 'select * from attendance_list order by entries desc'; - models.sequelize - .query(queryString, { - type: models.sequelize.QueryTypes.SELECT - }) - .then(function(result) { - res.json(result); + models.sequelize + .query(queryString, { + type: models.sequelize.QueryTypes.SELECT + }) + .then(function(result) { + cache.cache('LXIII-attendance', result); + res.json(result); + }); }); -}); /* /api/legislature/LXIII/attendance/avg */ -router.get('/avg', function(req, res, next) { +router.get('/avg', cache.cacheFilter('LXIII-attendance-avg'), function(req, res, next) { let queryString = 'select avg(quantity) as average, max(quantity) as max, min(quantity) as min from seat_attendance'; @@ -33,12 +35,13 @@ router.get('/avg', function(req, res, next) { type: models.sequelize.QueryTypes.SELECT }) .then(function(result) { + cache.cache('LXIII-attendance-avg', result[0]); res.json(result[0]); }); }); /* /api/legislature/LXIII/attendance/frequency */ -router.get('/frequency', function(req, res, next) { +router.get('/frequency', cache.cacheFilter('LXIII-attendance-frequency'), function(req, res, next) { let queryString = 'select st2.quantity, st2.frequency, @running_total := @running_total + st2.frequency AS cumulative_frequency from attendance_frequency st2 join (select @running_total := 0) r' @@ -47,12 +50,13 @@ router.get('/frequency', function(req, res, next) { type: models.sequelize.QueryTypes.SELECT }) .then(function(result) { + cache.cache('LXIII-attendance-frequency', result); res.json(result); }); }); /* /api/legislature/LXIII/attendance/by_party */ -router.get('/by_party', function(req, res, next) { +router.get('/by_party', cache.cacheFilter('LXIII-attendance-by-party'), function(req, res, next) { let queryString = 'select party, round(avg(quantity), 2) as average, max(quantity) as max, min(quantity) as min, round(avg(quantity) + stddev(quantity)/2, 2) as max_std, round(avg(quantity) - stddev(quantity)/2,2) as min_std, count(1) as deputies from seat_attendance group by party order by average'; @@ -61,12 +65,13 @@ router.get('/by_party', function(req, res, next) { type: models.sequelize.QueryTypes.SELECT }) .then(function(result) { + cache.cache('LXIII-attendance-by-party', result); res.json(result); }); }); /* /api/legislature/LXIII/attendance/by_state */ -router.get('/by_state', function(req, res, next) { +router.get('/by_state', cache.cacheFilter('LXIII-attendance-by-state'), function(req, res, next) { let queryString = 'select state, round(avg(entries), 2) as average, max(entries) as max, min(entries) as min, round(avg(entries) + stddev(entries)/2, 2) as max_std, round(avg(entries) - stddev(entries)/2,2) as min_std, count(1) as deputies from attendance_list group by state order by average'; @@ -75,12 +80,13 @@ router.get('/by_state', function(req, res, next) { type: models.sequelize.QueryTypes.SELECT }) .then(function(result) { + cache.cache('LXIII-attendance-by-state', result); res.json(result); }); }); /* /api/legislature/LXIII/attendance/by_deputy_type */ -router.get('/by_deputy_type', function(req, res, next) { +router.get('/by_deputy_type', cache.cacheFilter('LXIII-attendance-by-deputy-type'), function(req, res, next) { let queryString = 'select type, party, avg(quantity) as average, count(1) as deputies from seat_attendance group by type, party order by party, type'; @@ -89,6 +95,7 @@ router.get('/by_deputy_type', function(req, res, next) { type: models.sequelize.QueryTypes.SELECT }) .then(function(result) { + cache.cache('LXIII-attendance-by-deputy-type', result); res.json(result); }); });