umami/lib/redis.js
2022-08-28 20:20:54 -07:00

66 lines
1.4 KiB
JavaScript

import { createClient } from 'redis';
import { startOfMonth } from 'date-fns';
import debug from 'debug';
import { getSessions, getAllWebsites } from 'queries';
import { REDIS } from 'lib/db';
const log = debug('umami:redis');
const INITIALIZED = 'redis:initialized';
async function getClient() {
const redis = new createClient({
url: process.env.REDIS_URL,
});
await redis.connect();
if (process.env.LOG_QUERY) {
redis.on('error', err => log(err));
}
if (process.env.NODE_ENV !== 'production') {
global[REDIS] = redis;
}
return redis;
}
async function stageData() {
const sessions = await getSessions([], startOfMonth(new Date()).toUTCString());
const websites = await getAllWebsites();
const sessionUuids = sessions.map(a => {
return { key: `session:${a.session_uuid}`, value: '' };
});
const websiteIds = websites.map(a => {
return { key: `website:${a.website_uuid}`, value: Number(a.website_id) };
});
await addRedis(sessionUuids);
await addRedis(websiteIds);
await redis.set(INITIALIZED, 1);
}
async function addRedis(ids) {
for (let i = 0; i < ids.length; i++) {
const { key, value } = ids[i];
await redis.set(key, value);
}
}
// Initialization
let redis = null;
(async () => {
redis = process.env.REDIS_URL && (global[REDIS] || (await getClient()));
if (redis) {
if (!(await redis.get(INITIALIZED))) {
await stageData();
}
}
})();
export default redis;