from typing import Union
from fastapi import HTTPException, Request
import json
from fastapi import APIRouter, Depends
import redis.asyncio as redis
import httpx
from lib.redis import redis_client
post_route = APIRouter()
async def get_redis():
return redis_client
@post_route.get("/")
async def postroot():
return { "status" : 1 , "message" : "Đây là post index"}
@post_route.post("/{key}")
async def set_cache(key: str, request: Request, r = Depends(get_redis)):
# Ưu tiên dữ liệu JSON
value = None
content_type = request.headers.get("content-type", "")
if "application/json" in content_type:
try:
body = await request.json()
value = body.get("value")
except Exception:
raise HTTPException(status_code=400, detail="Invalid JSON")
elif "application/x-www-form-urlencoded" in content_type or "multipart/form-data" in content_type:
form = await request.form()
value = form.get("value")
else:
raise HTTPException(status_code=415, detail="Unsupported Content-Type")
if value is None:
raise HTTPException(status_code=422, detail="Missing 'value'")
await r.set(key, value)
return {"message": "Key stored", "key": key, "value": value}
@post_route.get("/{key}")
async def get_cache(key: str, r = Depends(get_redis)):
value = await r.get(key)
if value is None:
async with httpx.AsyncClient() as client:
res = await client.get('https://dummyjson.com/products/1')
if res.status_code != 200:
raise HTTPException(status_code=500, detail="Failed to fetch data")
data = res.json()
await r.set(key, json.dumps(data), ex=3600) # TTL: 1 giờ
return {"key": key, "value": data}
return {"key": key, "value": json.loads(value)}