diff --git a/fastapi_book_server/app/services/common.py b/fastapi_book_server/app/services/common.py index 7449639..945721d 100644 --- a/fastapi_book_server/app/services/common.py +++ b/fastapi_book_server/app/services/common.py @@ -1,6 +1,7 @@ import abc import asyncio from concurrent.futures import ThreadPoolExecutor +import hashlib from random import choice from typing import Generic, Optional, TypedDict, TypeVar, Union @@ -8,10 +9,12 @@ from databases import Database from fastapi_pagination.api import resolve_params from fastapi_pagination.bases import AbstractParams, RawParams import meilisearch +import orjson from ormar import Model, QuerySet from redis import asyncio as aioredis from sqlalchemy import Table +from app.utils.orjson_default import default as orjson_default from app.utils.pagination import CustomPage, Page from core.config import env_config @@ -47,8 +50,9 @@ class BaseService(Generic[MODEL, QUERY], abc.ABC): return cls.CUSTOM_MODEL_CACHE_NAME or cls.model.Meta.tablename @staticmethod - def _get_query_hash(query: QUERY) -> int: - return hash(frozenset(query.items())) + def _get_query_hash(query: QUERY) -> str: + json_value = orjson.dumps(query, orjson_default, option=orjson.OPT_SORT_KEYS) + return hashlib.md5(json_value).hexdigest() @classmethod def get_cache_key(cls, query: QUERY) -> str: diff --git a/fastapi_book_server/app/utils/orjson_default.py b/fastapi_book_server/app/utils/orjson_default.py new file mode 100644 index 0000000..2fc3efe --- /dev/null +++ b/fastapi_book_server/app/utils/orjson_default.py @@ -0,0 +1,9 @@ +from typing import Any + + +def default(value: Any): + if isinstance(value, frozenset): + list_value = list(value) + return "-".join(sorted(list_value)) + + return value