ForcePilot/backend/package/yuxi/channel/extensions/webex/webhook.py

38 lines
1.0 KiB
Python
Raw Normal View History

import json
from fastapi import FastAPI, Request, HTTPException
MAX_WEBHOOK_BODY_BYTES = 1 * 1024 * 1024
DEFAULT_WEBHOOK_PATH = "/api/channel/webex/webhook"
def create_webhook_app(
verify_signature,
handle_webhook,
webhook_path: str = DEFAULT_WEBHOOK_PATH,
) -> FastAPI:
app = FastAPI(title="Cisco Webex Webhook", docs_url=None, redoc_url=None)
@app.post(webhook_path)
async def webhook_endpoint(request: Request):
body = await request.body()
if len(body) > MAX_WEBHOOK_BODY_BYTES:
raise HTTPException(status_code=413, detail="Payload too large")
x_spark_signature = request.headers.get("X-Spark-Signature", "")
if not verify_signature(body, x_spark_signature):
raise HTTPException(status_code=401, detail="Invalid signature")
payload = json.loads(body.decode())
result = await handle_webhook(payload)
return result
@app.get(webhook_path)
async def health_check():
return {"status": "healthy", "channel": "webex"}
return app