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