PropBot / api_routes.py
zenaight
peronsas new
b7a94e7
Raw
History Blame Contribute Delete
2.79 kB
from fastapi import APIRouter, Request, HTTPException, Query
from fastapi.responses import PlainTextResponse, JSONResponse
from pydantic import BaseModel
from typing import Optional
from datetime import datetime
from config import VERIFY_TOKEN, supabase, OPENAI_API_KEY, WHATSAPP_API_TOKEN
from database import get_user, list_users, update_user_name
from ai_chat import process_message
router = APIRouter()
# --- Webhook Verification ---
@router.get("/webhook")
def verify_webhook(
hub_mode: str = Query(None, alias="hub.mode"),
hub_token: str = Query(None, alias="hub.verify_token"),
hub_challenge: str = Query(None, alias="hub.challenge")
):
if hub_mode == "subscribe" and hub_token == VERIFY_TOKEN:
return PlainTextResponse(hub_challenge)
raise HTTPException(status_code=403, detail="Invalid token")
# --- Optional Direct Chat Endpoint ---
class ChatRequest(BaseModel):
message: str
model: Optional[str] = "gpt-4o-mini"
max_tokens: Optional[int] = 1500
class ChatResponse(BaseModel):
response: str
model: str
tokens_used: Optional[int] = None
@router.post("/chat", response_model=ChatResponse)
async def chat_with_ai(request: ChatRequest):
response = await process_message(request.message)
return ChatResponse(response=response, model=request.model)
# --- Health ---
@router.get("/ping")
def ping():
return {"pong": True}
@router.get("/health")
def health_check():
status = {
"api": "healthy",
"whatsapp": "configured" if WHATSAPP_API_TOKEN else "not configured",
"openai": "configured" if OPENAI_API_KEY else "not configured",
"supabase": "configured" if supabase else "not configured"
}
return status
# --- User Management Endpoints ---
@router.get("/users/{wa_id}")
async def get_user_endpoint(wa_id: str):
"""Get user by WhatsApp ID"""
if not supabase:
raise HTTPException(status_code=503, detail="Database not configured")
user = await get_user(wa_id)
if user:
return user
else:
raise HTTPException(status_code=404, detail="User not found")
@router.get("/users")
async def list_users_endpoint(limit: int = 50, offset: int = 0):
"""List all users with pagination"""
if not supabase:
raise HTTPException(status_code=503, detail="Database not configured")
result = await list_users(limit, offset)
return result
@router.put("/users/{wa_id}")
async def update_user_endpoint(wa_id: str, name: str):
"""Update user name"""
if not supabase:
raise HTTPException(status_code=503, detail="Database not configured")
user = await update_user_name(wa_id, name)
if user:
return user
else:
raise HTTPException(status_code=404, detail="User not found")