diff --git a/selfprivacy_api/utils/redis_model_storage.py b/selfprivacy_api/utils/redis_model_storage.py new file mode 100644 index 0000000..51faff7 --- /dev/null +++ b/selfprivacy_api/utils/redis_model_storage.py @@ -0,0 +1,30 @@ +from datetime import datetime +from typing import Optional + + +def store_model_as_hash(redis, redis_key, model): + for key, value in model.dict().items(): + if isinstance(value, datetime): + value = value.isoformat() + redis.hset(redis_key, key, str(value)) + + +def hash_as_model(redis, redis_key: str, model_class): + token_dict = _model_dict_from_hash(redis, redis_key) + if token_dict is not None: + return model_class(**token_dict) + return None + + +def _prepare_model_dict(d: dict): + for key in d.keys(): + if d[key] == "None": + d[key] = None + + +def _model_dict_from_hash(redis, redis_key: str) -> Optional[dict]: + if redis.exists(redis_key): + token_dict = redis.hgetall(redis_key) + _prepare_model_dict(token_dict) + return token_dict + return None diff --git a/tests/test_model_storage.py b/tests/test_model_storage.py new file mode 100644 index 0000000..d26fabb --- /dev/null +++ b/tests/test_model_storage.py @@ -0,0 +1,36 @@ +import pytest + +from pydantic import BaseModel +from datetime import datetime +from typing import Optional + +from selfprivacy_api.utils.redis_model_storage import store_model_as_hash, hash_as_model +from selfprivacy_api.utils.redis_pool import RedisPool + +TEST_KEY = "model_storage" +redis = RedisPool().get_connection() + +@pytest.fixture() +def clean_redis(): + redis.delete(TEST_KEY) + + +class DummyModel(BaseModel): + name: str + date: Optional[datetime] + +def test_store_retrieve(): + model = DummyModel( + name= "test", + date= datetime.now() + ) + store_model_as_hash(redis, TEST_KEY, model) + assert hash_as_model(redis, TEST_KEY, DummyModel) == model + +def test_store_retrieve_none(): + model = DummyModel( + name= "test", + date= None + ) + store_model_as_hash(redis, TEST_KEY, model) + assert hash_as_model(redis, TEST_KEY, DummyModel) == model