diff --git a/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py b/TheCodeLabs_BaseUtils/TheCodeLabs_BaseUtils/MultiCacheKeyService.py new file mode 100644 index 0000000000000000000000000000000000000000..0228b8d22bbeb6e9534ffcd3fa729cb0b2f1762a --- /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