From f02b46d60453d40feb8f5e34f828899bb9d2f22c Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Sat, 10 Oct 2020 15:06:58 +0200
Subject: [PATCH] BaseUtils: added MultiCacheKeyService.py

---
 .../MultiCacheKeyService.py                   | 40 +++++++++++++++++++
 1 file changed, 40 insertions(+)
 create mode 100644 TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py

diff --git a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py
new file mode 100644
index 0000000..0228b8d
--- /dev/null
+++ b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py
@@ -0,0 +1,40 @@
+import abc
+from abc import ABC
+from dataclasses import dataclass
+from datetime import datetime
+from typing import Dict
+
+
+@dataclass
+class CacheEntry:
+    key: str
+    lastFetchTimestamp: float
+    settings: Dict
+    cachedData: Dict
+
+
+class MultiCacheKeyService(ABC):
+    def __init__(self, fetchThresholdInSeconds: int):
+        self._fetchThresholdInSeconds = fetchThresholdInSeconds
+        self._cache = {}
+
+    def get_data(self, cacheKey: str, settings: Dict) -> Dict:
+        if cacheKey not in self._cache:
+            self._cache[cacheKey] = CacheEntry(cacheKey, datetime.now().timestamp(), settings, {})
+
+        cacheEntry = self._cache[cacheKey]
+        if self.__is_data_obsolete(cacheEntry):
+            cacheEntry.cachedData = self._fetch_data(cacheEntry.settings)
+        return cacheEntry.cachedData
+
+    def __is_data_obsolete(self, cacheEntry: CacheEntry) -> bool:
+        now = datetime.now().timestamp()
+        if (now - cacheEntry.lastFetchTimestamp) > self._fetchThresholdInSeconds:
+            cacheEntry.lastFetchTimestamp = now
+            return True
+
+        return False
+
+    @abc.abstractmethod
+    def _fetch_data(self, settings: Dict) -> Dict:
+        pass
-- 
GitLab