visual-search-api2 / src /api /system.py
AdarshDRC's picture
Create system.py
0f3549c verified
Raw
History Blame Contribute Delete
2.62 kB
import asyncio
import time
from datetime import datetime, timezone
from fastapi import APIRouter, Form, HTTPException, Request, Depends
from src.core.config import DEFAULT_PINECONE_KEY
from src.core.security import get_verified_keys
from src.services.db_client import cld_ping, ensure_indexes, pinecone_pool
from src.core.logging import log
from src.common.utils import get_ip, is_default_key
router = APIRouter()
@router.get("/")
async def root():
return {"status": "ok"}
@router.get("/api/health")
async def health():
return {"status": "ok", "timestamp": datetime.now(timezone.utc).isoformat()}
@router.post("/api/log")
async def frontend_log(
request: Request,
event: str = Form(...),
user_id: str = Form(""),
page: str = Form(""),
metadata: str = Form("{}"),
):
import json
ip = get_ip(request)
try:
meta = json.loads(metadata) if metadata else {}
except Exception:
meta = {}
log(
"INFO", f"frontend.{event}",
user_id=user_id or "anonymous",
page=page, ip=ip,
ua=request.headers.get("User-Agent", "")[:120],
**meta,
)
return {"ok": True}
@router.post("/api/verify-keys")
async def verify_keys(
request: Request,
user_id: str = Form(""),
keys: dict = Depends(get_verified_keys)
):
ip = get_ip(request)
mode = "guest" if is_default_key(keys["pinecone_key"], DEFAULT_PINECONE_KEY) else "personal"
start = time.perf_counter()
log("INFO", "settings.verify_keys.start", user_id=user_id or "anonymous", mode=mode, ip=ip)
try:
await asyncio.to_thread(cld_ping, keys["cloudinary_creds"])
except Exception as e:
log("ERROR", "settings.verify_keys.cloudinary_fail", user_id=user_id or "anonymous", ip=ip, error=str(e))
raise HTTPException(400, "Invalid Cloudinary Environment URL.")
indexes_created: list[str] = []
try:
pc = pinecone_pool.get(keys["pinecone_key"])
indexes_created = await asyncio.to_thread(ensure_indexes, pc)
except Exception as e:
err = str(e)
clean = "Invalid Pinecone API Key." if "401" in err or "unauthorized" in err.lower() else f"Pinecone Error: {err}"
log("ERROR", "settings.verify_keys.pinecone_fail", user_id=user_id or "anonymous", ip=ip, error=clean)
raise HTTPException(400, clean)
log("INFO", "settings.verify_keys.success", user_id=user_id or "anonymous", mode=mode, ip=ip,
indexes_created=indexes_created, duration_ms=round((time.perf_counter() - start) * 1000))
return {"message": "Keys verified and indexes ready!"}