50 lines
1.4 KiB
Python
50 lines
1.4 KiB
Python
import json
|
|
from datetime import datetime, timezone
|
|
from typing import Any
|
|
|
|
import redis.asyncio as redis
|
|
|
|
from ..config import settings
|
|
|
|
_redis_client: redis.Redis | None = None
|
|
|
|
|
|
def _session_key(session_token: str) -> str:
|
|
return f"voice:session:{session_token}"
|
|
|
|
|
|
async def get_redis() -> redis.Redis:
|
|
global _redis_client
|
|
if _redis_client is None:
|
|
_redis_client = redis.from_url(settings.redis_url, decode_responses=True)
|
|
return _redis_client
|
|
|
|
|
|
async def save_session(session_token: str, data: dict[str, Any]) -> None:
|
|
client = await get_redis()
|
|
payload = dict(data)
|
|
payload["session_token"] = session_token
|
|
payload.setdefault("created_at", datetime.now(timezone.utc).isoformat())
|
|
await client.set(_session_key(session_token), json.dumps(payload), ex=settings.voice_session_ttl_seconds)
|
|
|
|
|
|
async def get_session(session_token: str) -> dict[str, Any] | None:
|
|
client = await get_redis()
|
|
raw = await client.get(_session_key(session_token))
|
|
if not raw:
|
|
return None
|
|
return json.loads(raw)
|
|
|
|
|
|
async def update_session(session_token: str, **fields: Any) -> dict[str, Any] | None:
|
|
session = await get_session(session_token)
|
|
if not session:
|
|
return None
|
|
session.update(fields)
|
|
await save_session(session_token, session)
|
|
return session
|
|
|
|
|
|
async def delete_session(session_token: str) -> None:
|
|
client = await get_redis()
|
|
await client.delete(_session_key(session_token))
|