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
|
|
};
|