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")