Zavedení podpory pro Redis, agnostické úložiště dat
This commit is contained in:
28
server/src/storage/StorageInterface.ts
Normal file
28
server/src/storage/StorageInterface.ts
Normal 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>;
|
||||
}
|
||||
19
server/src/storage/index.ts
Normal file
19
server/src/storage/index.ts
Normal 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;
|
||||
}
|
||||
24
server/src/storage/json.ts
Normal file
24
server/src/storage/json.ts
Normal 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();
|
||||
}
|
||||
}
|
||||
32
server/src/storage/redis.ts
Normal file
32
server/src/storage/redis.ts
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user