import json from typing import Optional, Tuple from service.utils.aws_connectors import run_query from service.utils.encoders import JSONEncoder def update_cache(key, result, query, params, schema) -> Tuple[int, str]: update_query = f"""INSERT INTO {schema}.analytics_cache (key,result, query, params) VALUES (%(key)s, %(result)s, %(query)s, %(params)s) ON CONFLICT (key) DO UPDATE SET result = EXCLUDED.result, stored_time = NOW() RETURNING stored_time;""" update_result = run_query( update_query, {"key": key, "result": result, "query": query, "params": params} ) return update_result[0][0], result def get_cached_result(key, schema) -> Tuple[Optional[int], Optional[str]]: get_query = ( f"SELECT stored_time, result FROM {schema}.analytics_cache WHERE key = %(key)s" ) get_result = run_query(get_query, {"key": key}) if len(get_result) == 1: return get_result[0] else: return None, None def delete_cache(key, schema) -> bool: get_query = f"DELETE FROM {schema}.analytics_cache WHERE key = %(key)s" get_result = run_query(get_query, {"key": key}) return bool(get_result) def update_cache_json(key, result, query, params, schema) -> Tuple[int, str]: ts, res = update_cache( key, json.dumps(result, cls=JSONEncoder), query, json.dumps(params, cls=JSONEncoder), schema, ) return ts, result def get_cached_result_json(key, schema) -> Tuple[Optional[int], Optional[str]]: ts, res = get_cached_result(key, schema) if res: return ts, json.loads(res) else: return ts, res