From bef6178a6f7e9531843b345b6bc2beb757f9549b Mon Sep 17 00:00:00 2001
From: Martin Berka <martin.berka@radbuza.net>
Date: Wed, 27 Sep 2023 15:09:36 +0200
Subject: [PATCH] =?UTF-8?q?Generalizace=20=C3=BAlo=C5=BEi=C5=A1t=C4=9B=20p?=
 =?UTF-8?q?ro=20libovoln=C3=A1=20data?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 server/src/service.ts                  |  2 +-
 server/src/storage/StorageInterface.ts | 18 +++++++++---------
 server/src/storage/json.ts             | 13 ++++++-------
 server/src/storage/redis.ts            | 17 ++++++++---------
 4 files changed, 24 insertions(+), 26 deletions(-)

diff --git a/server/src/service.ts b/server/src/service.ts
index 02403f8..ef045e6 100644
--- a/server/src/service.ts
+++ b/server/src/service.ts
@@ -43,7 +43,7 @@ function getEmptyData(date?: Date): ClientData {
  */
 export async function getData(date?: Date): Promise<ClientData> {
     const dateString = formatDate(date ?? getToday());
-    const data = await storage.getData(dateString) || getEmptyData(date);
+    const data: ClientData = await storage.getData(dateString) || getEmptyData(date);
     data.todayWeekIndex = getDayOfWeekIndex(getToday());
     // Dotažení jídel, pokud je ještě nemáme
     if (!data.menus) {
diff --git a/server/src/storage/StorageInterface.ts b/server/src/storage/StorageInterface.ts
index d49d828..cc4d6ec 100644
--- a/server/src/storage/StorageInterface.ts
+++ b/server/src/storage/StorageInterface.ts
@@ -8,21 +8,21 @@ import { ClientData } from "../../../types";
  */
 export interface StorageInterface {
     /**
-     * Vrátí příznak, zda existují data pro předané datum.
-     * @param date datum, pro které zjišťujeme data
+     * Vrátí příznak, zda existují data pro předaný klíč.
+     * @param key klíč, pro který zjišťujeme data (typicky datum)
      */
-    hasData(date: string): Promise<boolean>;
+    hasData(key: string): Promise<boolean>;
 
     /**
-     * Vrátí veškerá data pro předané datum.
-     * @param date datum, pro které vrátit data
+     * Vrátí veškerá data pro předaný klíč.
+     * @param key klíč, pro který vrátit data (typicky datum)
      */
-    getData(date: string): Promise<ClientData>;
+    getData<Type>(key: string): Promise<Type>;
 
     /**
-     * Uloží data pro předané datum.
-     * @param date datum, kterému patří ukládaná data
+     * Uloží data pod předaný klíč.
+     * @param key klíč, pod kterým uložit data (typicky datum)
      * @param data data pro uložení
      */
-    setData(date: string, data: ClientData): Promise<void>;
+    setData<Type>(key: string, data: Type): Promise<void>;
 }
\ No newline at end of file
diff --git a/server/src/storage/json.ts b/server/src/storage/json.ts
index a3758c7..be331b1 100644
--- a/server/src/storage/json.ts
+++ b/server/src/storage/json.ts
@@ -1,5 +1,4 @@
 import JSONdb from 'simple-json-db';
-import { ClientData } from "../../../types";
 import { StorageInterface } from "./StorageInterface";
 
 const db = new JSONdb('./data.json');
@@ -9,16 +8,16 @@ const db = new JSONdb('./data.json');
  */
 export default class JsonStorage implements StorageInterface {
 
-    hasData(date: string): Promise<boolean> {
-        return Promise.resolve(db.has(date));
+    hasData(key: string): Promise<boolean> {
+        return Promise.resolve(db.has(key));
     }
 
-    getData(date: string): Promise<ClientData> {
-        return db.get(date);
+    getData<Type>(key: string): Promise<Type> {
+        return db.get(key);
     }
 
-    setData(date: string, data: ClientData): Promise<void> {
-        db.set(date, data);
+    setData<Type>(key: string, data: Type): Promise<void> {
+        db.set(key, data);
         return Promise.resolve();
     }
 }
\ No newline at end of file
diff --git a/server/src/storage/redis.ts b/server/src/storage/redis.ts
index 188b114..4251223 100644
--- a/server/src/storage/redis.ts
+++ b/server/src/storage/redis.ts
@@ -1,6 +1,5 @@
 import { RedisClientType, createClient } from 'redis';
 import { StorageInterface } from "./StorageInterface";
-import { ClientData } from '../../../types';
 
 let client: RedisClientType;
 
@@ -15,18 +14,18 @@ export default class RedisStorage implements StorageInterface {
         client.connect();
     }
 
-    async hasData(date: string) {
-        const data = await client.json.get(date);
+    async hasData(key: string) {
+        const data = await client.json.get(key);
         return (data ? true : false);
     }
 
-    async getData(date: string) {
-        const data = await client.json.get(date, { path: '.' });
-        return data as unknown as ClientData;
+    async getData<Type>(key: string) {
+        const data = await client.json.get(key, { path: '.' });
+        return data as Type;
     }
 
-    async setData(date: string, data: ClientData) {
-        await client.json.set(date, '.', data as any);
-        const check = await client.json.get(date);
+    async setData<Type>(key: string, data: Type) {
+        await client.json.set(key, '.', data as any);
+        await client.json.get(key);
     }
 }
\ No newline at end of file