File size: 2,790 Bytes
90f252d b7a94e7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | 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") |