from __future__ import annotations from typing import Optional from core.logger import get_logger logger = get_logger("core.webhook_server") class WebhookServer: def __init__(self, app: "OverUB", host: str, port: int) -> None: self.app = app self.host = host self.port = port self._runner = None async def start(self) -> None: try: from aiohttp import web except ImportError: logger.warning("aiohttp not installed, webhook server disabled") return async def handler(request: web.Request) -> web.Response: payload = await request.json() signature = request.headers.get("X-Gitea-Signature", "") try: await self.app.update_service.handle_webhook(payload, signature) except Exception as exc: logger.exception("Webhook handling failed") return web.Response(status=400, text=str(exc)) return web.Response(text="ok") web_app = web.Application() web_app.add_routes([web.post("/webhook/gitea", handler)]) self._runner = web.AppRunner(web_app) await self._runner.setup() site = web.TCPSite(self._runner, self.host, self.port) await site.start() logger.info("Webhook server started on %s:%s", self.host, self.port) async def stop(self) -> None: if self._runner: await self._runner.cleanup() self._runner = None