mirror of
https://github.com/aljazceru/nutshell.git
synced 2025-12-22 11:24:19 +01:00
* settings * fix name settings * management rpc * hook up the RPC server * working * format * update build script fix import error * remove accidental commit of vscode extension data * working ✔ * \n * add get mint quote get melt quote * gRPC cli update quotes commands * update mint melt quotes from cli * comment under get cli command group * keyset rotation not yet implemented * try fix * change back contact info default to be empty list * fix import * add server mTLS * ll * script for generating certificates * rename settings * move generation script * do not save TTL expiry into Cache object, rather always load from settings. * update lightning fees * update auth limits * auth rate limit cli * optional arguemnts * better error messages * tests for db update mint/melt quotes * start mint rpc tests * add tos_url field to get-info grpc response * format checks * add types to click groups where it's needed * tests on updating quotes * fix tests * skip updating mint quote state if on regtest * test edge case * unified test_add_remove_contact * mark pytest-asyncio * fix missing db argument * hopefully no more silly errors * fix test_db_update_mint_quote_state * pass in the quote id string. * add keyset rotation * test for keyset rotation through gRPC command * fix logger warning * remove rotation test because it breaks other tests * use different bolt11 invoices * assert returned melt quote has quote * is_postgres * try different things * skip if deprecated api * format checks * update .gitignore * default location for certificates
70 lines
2.3 KiB
Python
70 lines
2.3 KiB
Python
import asyncio
|
|
import functools
|
|
import json
|
|
|
|
from fastapi import Request
|
|
from loguru import logger
|
|
from pydantic import BaseModel
|
|
from redis.asyncio import from_url
|
|
from redis.exceptions import ConnectionError
|
|
|
|
from ..core.errors import CashuError
|
|
from ..core.settings import settings
|
|
|
|
|
|
class RedisCache:
|
|
initialized = False
|
|
|
|
def __init__(self):
|
|
if settings.mint_redis_cache_enabled:
|
|
if settings.mint_redis_cache_url is None:
|
|
raise CashuError("Redis cache url not provided")
|
|
self.redis = from_url(settings.mint_redis_cache_url)
|
|
asyncio.create_task(self.test_connection())
|
|
|
|
async def test_connection(self):
|
|
# PING
|
|
try:
|
|
await self.redis.ping()
|
|
logger.success("Connected to Redis caching server.")
|
|
self.initialized = True
|
|
except ConnectionError as e:
|
|
logger.error("Redis connection error.")
|
|
raise e
|
|
|
|
def cache(self):
|
|
def passthrough(func):
|
|
@functools.wraps(func)
|
|
async def wrapper(*args, **kwargs):
|
|
logger.trace(f"cache wrapper on route {func.__name__}")
|
|
result = await func(*args, **kwargs)
|
|
return result
|
|
|
|
return wrapper
|
|
|
|
def decorator(func):
|
|
@functools.wraps(func)
|
|
async def wrapper(request: Request, payload: BaseModel):
|
|
logger.trace(f"cache wrapper on route {func.__name__}")
|
|
key = request.url.path + payload.json()
|
|
logger.trace(f"KEY: {key}")
|
|
# Check if we have a value under this key
|
|
if await self.redis.exists(key):
|
|
logger.trace("Returning a cached response...")
|
|
resp = await self.redis.get(key)
|
|
if resp:
|
|
return json.loads(resp)
|
|
else:
|
|
raise Exception(f"Found no cached response for key {key}")
|
|
result = await func(request, payload)
|
|
await self.redis.set(name=key, value=result.json(), ex=settings.mint_redis_cache_ttl)
|
|
return result
|
|
|
|
return wrapper
|
|
|
|
return passthrough if not settings.mint_redis_cache_enabled else decorator
|
|
|
|
async def disconnect(self):
|
|
if self.initialized:
|
|
await self.redis.close()
|