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:
2020-12-04 22:26:40 +01:00
parent 8f844dbf85
commit da8251c733

View File

@@ -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 = {