diff --git a/app/usecases/item_usecase.py b/app/usecases/item_usecase.py index 0e03c81..5488fe6 100644 --- a/app/usecases/item_usecase.py +++ b/app/usecases/item_usecase.py @@ -2,12 +2,28 @@ from app.repositories import item_repository from app.schemas import item_schema +import redis +import json +from app.utils.db_utils import AlchemyEncoder def get_items(db: Session, skip: int = 0, limit: int = 100): return item_repository.get_items(db, skip=skip, limit=limit) def get_item(db: Session, item_id: int): - return item_repository.get_item(db, item_id=item_id) + r = redis.Redis() + redis_val = r.hgetall(f"item:{item_id}") + print(len(redis_val)) + if (redis_val is None or len(redis_val) < 1): + print('fetching data from database') + item = item_repository.get_item(db, item_id=item_id) + + itemdetail = {f"data":json.dumps(item, cls=AlchemyEncoder)} + r.hmset(f"item:{item.id}", itemdetail) + return item + else: + print('fetching data from redis') + item = json.loads(r.hget(f"item:{item_id}", "data")) + return item def create_user_item(db: Session, item: item_schema.ItemCreate, user_id: int): return item_repository.create_user_item(db=db, item=item, user_id=user_id) \ No newline at end of file diff --git a/app/utils/__init__.py b/app/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/utils/db_utils.py b/app/utils/db_utils.py new file mode 100644 index 0000000..d313aca --- /dev/null +++ b/app/utils/db_utils.py @@ -0,0 +1,20 @@ +import json +from sqlalchemy.ext.declarative import DeclarativeMeta + +class AlchemyEncoder(json.JSONEncoder): + + def default(self, obj): + if isinstance(obj.__class__, DeclarativeMeta): + # an SQLAlchemy class + fields = {} + for field in [x for x in dir(obj) if not x.startswith('_') and x != 'metadata']: + data = obj.__getattribute__(field) + try: + json.dumps(data) # this will fail on non-encodable values, like other classes + fields[field] = data + except TypeError: + fields[field] = None + # a json-encodable dict + return fields + + return json.JSONEncoder.default(self, obj) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 3e45160..9974ae4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -8,4 +8,5 @@ pymysql pytest pytest-cov uvicorn -faker \ No newline at end of file +faker +redis \ No newline at end of file