Zavedení podpory pro Redis, agnostické úložiště dat

This commit is contained in:
2023-08-06 17:46:51 +02:00
parent 8a75c98c9a
commit 37542499a9
11 changed files with 282 additions and 97 deletions

View File

@@ -0,0 +1,28 @@
import { ClientData } from "../../../types";
/**
* Interface pro úložiště dat.
*
* Aktuálně pouze "primitivní" has, get a set odrážející původní JSON DB.
* Postupem času lze předělat pro efektivnější využití Redis.
*/
export interface StorageInterface {
/**
* Vrátí příznak, zda existují data pro předané datum.
* @param date datum, pro které zjišťujeme data
*/
hasData(date: string): Promise<boolean>;
/**
* Vrátí veškerá data pro předané datum.
* @param date datum, pro které vrátit data
*/
getData(date: string): Promise<ClientData>;
/**
* Uloží data pro předané datum.
* @param date datum, kterému patří ukládaná data
* @param data data pro uložení
*/
setData(date: string, data: ClientData): Promise<void>;
}

View File

@@ -0,0 +1,19 @@
import { StorageInterface } from "./StorageInterface";
import JsonStorage from "./json";
import RedisStorage from "./redis";
const JSON_KEY = 'json';
const REDIS_KEY = 'redis';
let storage: StorageInterface;
if (!process.env.STORAGE || process.env.STORAGE?.toLowerCase() === JSON_KEY) {
storage = new JsonStorage();
} else if (process.env.STORAGE?.toLowerCase() === REDIS_KEY) {
storage = new RedisStorage();
} else {
throw Error("Nepodporovaná hodnota proměnné STORAGE: " + process.env.STORAGE + ", podporované jsou 'json' nebo 'redis'");
}
export default function getStorage(): StorageInterface {
return storage;
}

View File

@@ -0,0 +1,24 @@
import JSONdb from 'simple-json-db';
import { ClientData } from "../../../types";
import { StorageInterface } from "./StorageInterface";
const db = new JSONdb('./data.json');
/**
* Implementace úložiště používající JSON soubor.
*/
export default class JsonStorage implements StorageInterface {
hasData(date: string): Promise<boolean> {
return Promise.resolve(db.has(date));
}
getData(date: string): Promise<ClientData> {
return db.get(date);
}
setData(date: string, data: ClientData): Promise<void> {
db.set(date, data);
return Promise.resolve();
}
}

View File

@@ -0,0 +1,32 @@
import { RedisClientType, createClient } from 'redis';
import { StorageInterface } from "./StorageInterface";
import { ClientData } from '../../../types';
let client: RedisClientType;
/**
* Implementace úložiště využívající Redis server.
*/
export default class RedisStorage implements StorageInterface {
constructor() {
const HOST = process.env.REDIS_HOST || 'localhost';
const PORT = process.env.REDIS_PORT || 6379;
client = createClient({ url: `redis://${HOST}:${PORT}` });
client.connect();
}
async hasData(date: string) {
const data = await client.json.get(date);
return (data ? true : false);
}
async getData(date: string) {
const data = await client.json.get(date, { path: '.' });
return data as unknown as ClientData;
}
async setData(date: string, data: ClientData) {
await client.json.set(date, '.', data as any);
const check = await client.json.get(date);
}
}