Now saves messages as redis sorted list.
Moved from Redis lists to sorted lists by timestamp for better pagination. Now we have better interfacing w/ page & limit. History now also returns the total record count.
This commit is contained in:
		
							
								
								
									
										92
									
								
								api/redis.js
									
									
									
									
									
								
							
							
						
						
									
										92
									
								
								api/redis.js
									
									
									
									
									
								
							| @@ -1,30 +1,40 @@ | |||||||
|  | const { promisify } = require("util"); // from node | ||||||
|  |  | ||||||
| let client; | let client; | ||||||
|  | let llenAsync; | ||||||
|  | let lrangeAsync; | ||||||
| try { | try { | ||||||
|   const redis = require("redis"); |   const redis = require("redis"); | ||||||
|   console.log("Trying to establish connection with redis."); |   console.log("Trying to connect with redis.."); | ||||||
|   client = redis.createClient(); |   client = redis.createClient(); | ||||||
|  |  | ||||||
|  |   client.zcount = promisify(client.zcount).bind(client); | ||||||
|  |   client.zadd = promisify(client.zadd).bind(client); | ||||||
|  |   client.zrevrange = promisify(client.zrevrange).bind(client); | ||||||
|  |   client.del = promisify(client.del).bind(client); | ||||||
|  |  | ||||||
|  |   client.on("connect", () => console.log("Redis connection established!")); | ||||||
|  |  | ||||||
|   client.on("error", function(err) { |   client.on("error", function(err) { | ||||||
|     client.quit(); |     client.quit(); | ||||||
|     console.error("Missing redis-configurations.."); |     console.error("Unable to connect to redis, setting up redis-mock."); | ||||||
|  |  | ||||||
|     client = { |     client = { | ||||||
|       rpush: function() { |       zcount: function() { | ||||||
|         console.log("redis-dummy lpush", arguments); |         console.log("redis-dummy zcount", arguments); | ||||||
|         if (typeof arguments[arguments.length - 1] == "function") { |         return Promise.resolve() | ||||||
|           arguments[arguments.length - 1](null); |  | ||||||
|         } |  | ||||||
|       }, |       }, | ||||||
|       lrange: function() { |       zadd: function() { | ||||||
|         console.log("redis-dummy lrange", arguments); |         console.log("redis-dummy zadd", arguments); | ||||||
|         if (typeof arguments[arguments.length - 1] == "function") { |         return Promise.resolve(); | ||||||
|           arguments[arguments.length - 1](null); |       }, | ||||||
|         } |       zrevrange: function() { | ||||||
|  |         console.log("redis-dummy zrevrange", arguments); | ||||||
|  |         return Promise.resolve(null); | ||||||
|       }, |       }, | ||||||
|       del: function() { |       del: function() { | ||||||
|         console.log("redis-dummy del", arguments); |         console.log("redis-dummy del", arguments); | ||||||
|         if (typeof arguments[arguments.length - 1] == "function") { |         return Promise.resolve(); | ||||||
|           arguments[arguments.length - 1](null); |  | ||||||
|         } |  | ||||||
|       } |       } | ||||||
|     }; |     }; | ||||||
|   }); |   }); | ||||||
| @@ -32,36 +42,46 @@ try { | |||||||
|  |  | ||||||
| const addMessage = message => { | const addMessage = message => { | ||||||
|   const json = JSON.stringify(message); |   const json = JSON.stringify(message); | ||||||
|   client.rpush("messages", json); |   return client.zadd("messages", message.timestamp, json) | ||||||
|  |     .then(position => { | ||||||
|   return message; |       return { | ||||||
|  |         success: true | ||||||
|  |       } | ||||||
|  |     }) | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const history = (skip = 0, take = 20) => { | const history = (page=1, limit=10) => { | ||||||
|   skip = (1 + skip) * -1; // negate to get FIFO |   const start = (page - 1) * limit; | ||||||
|   return new Promise((resolve, reject) => |   const stop = (limit * page) - 1; | ||||||
|     client.lrange("messages", skip * take, skip, (err, data) => { |  | ||||||
|       if (err) { |  | ||||||
|         console.log(err); |  | ||||||
|         reject(err); |  | ||||||
|       } |  | ||||||
|  |  | ||||||
|       data = data.map(data => JSON.parse(data)); |   const getTotalCount = client.zcount("messages", '-inf', '+inf'); | ||||||
|       resolve(data); |   const getMessages = client.zrevrange("messages", start, stop); | ||||||
|  |  | ||||||
|  |   return Promise.all([getTotalCount, getMessages]) | ||||||
|  |     .then(([totalCount, messages]) => { | ||||||
|  |       if (messages) { | ||||||
|  |         return { | ||||||
|  |           messages: messages.map(entry => JSON.parse(entry)).reverse(), | ||||||
|  |           count: messages.length, | ||||||
|  |           total: totalCount | ||||||
|  |         } | ||||||
|  |       } else { | ||||||
|  |         return { | ||||||
|  |           messages: [], | ||||||
|  |           count: 0, | ||||||
|  |           total: 0 | ||||||
|  |         } | ||||||
|  |       } | ||||||
|     }) |     }) | ||||||
|   ); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| const clearHistory = () => { | const clearHistory = () => { | ||||||
|   return new Promise((resolve, reject) => |   return client.del("messages") | ||||||
|     client.del("messages", (err, success) => { |     .then(success => { | ||||||
|       if (err) { |       return { | ||||||
|         console.log(err); |         success: success == 1 ? true : false | ||||||
|         reject(err); |  | ||||||
|       } |       } | ||||||
|       resolve(success == 1 ? true : false); |  | ||||||
|     }) |     }) | ||||||
|   ); |  | ||||||
| }; | }; | ||||||
|  |  | ||||||
| module.exports = { | module.exports = { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user