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.
		
			
				
	
	
		
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const { promisify } = require("util"); // from node
 | |
| 
 | |
| let client;
 | |
| let llenAsync;
 | |
| let lrangeAsync;
 | |
| try {
 | |
|   const redis = require("redis");
 | |
|   console.log("Trying to connect with redis..");
 | |
|   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.quit();
 | |
|     console.error("Unable to connect to redis, setting up redis-mock.");
 | |
| 
 | |
|     client = {
 | |
|       zcount: function() {
 | |
|         console.log("redis-dummy zcount", arguments);
 | |
|         return Promise.resolve()
 | |
|       },
 | |
|       zadd: function() {
 | |
|         console.log("redis-dummy zadd", arguments);
 | |
|         return Promise.resolve();
 | |
|       },
 | |
|       zrevrange: function() {
 | |
|         console.log("redis-dummy zrevrange", arguments);
 | |
|         return Promise.resolve(null);
 | |
|       },
 | |
|       del: function() {
 | |
|         console.log("redis-dummy del", arguments);
 | |
|         return Promise.resolve();
 | |
|       }
 | |
|     };
 | |
|   });
 | |
| } catch (e) {}
 | |
| 
 | |
| const addMessage = message => {
 | |
|   const json = JSON.stringify(message);
 | |
|   return client.zadd("messages", message.timestamp, json)
 | |
|     .then(position => {
 | |
|       return {
 | |
|         success: true
 | |
|       }
 | |
|     })
 | |
| };
 | |
| 
 | |
| const history = (page=1, limit=10) => {
 | |
|   const start = (page - 1) * limit;
 | |
|   const stop = (limit * page) - 1;
 | |
| 
 | |
|   const getTotalCount = client.zcount("messages", '-inf', '+inf');
 | |
|   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 = () => {
 | |
|   return client.del("messages")
 | |
|     .then(success => {
 | |
|       return {
 | |
|         success: success == 1 ? true : false
 | |
|       }
 | |
|     })
 | |
| };
 | |
| 
 | |
| module.exports = {
 | |
|   addMessage,
 | |
|   history,
 | |
|   clearHistory
 | |
| };
 |