from fastapi import FastAPI, Request, Depends, Header from contextlib import asynccontextmanager import niquests import logging import handlers from dependencies import ( get_request_client, validate_source_ip, validate_webhook_secret, ) logger = logging.getLogger(__name__) @asynccontextmanager async def lifespan(app: FastAPI): app.state.request_client = niquests.AsyncSession() yield await app.state.request_client.close() app = FastAPI(lifespan=lifespan) @app.post( "/github/{repo_name}", dependencies=[ Depends(validate_source_ip), Depends(validate_webhook_secret), ], ) async def github_webhook( repo_name: str, request: Request, client: niquests.AsyncSession = Depends(get_request_client), x_real_ip: str = Header(...), x_github_event: str = Header(...), x_hub_signature: str = Header(...), ): payload = await request.json() match x_github_event: case "ping": return {"message": "pong"} case "issues": await handlers.issues(payload, client) case _: logger.debug(f"unhandled event {x_github_event}") return { "message": f"received webhook for {repo_name}: {x_github_event}", "status": "success", }