import logging import uuid from typing import Annotated, List from injectable import injectable, autowired, Autowired from app.core.queue import EnqueuedProcessor, ProcessQueue, Task, Result from app.model.healthcheck import HealthCheck from app.model.webhook import WebhookEvent from app.services import DockerService, GitService, Passwords logger = logging.getLogger(__name__) @injectable(singleton=True) class WebhookProcessor(EnqueuedProcessor): @autowired def __init__(self, docker: Annotated[DockerService, Autowired], git: Annotated[GitService, Autowired], keepass: Annotated[Passwords, Autowired], queue: Annotated[ProcessQueue, Autowired]): super().__init__(queue) self._docker = docker self._git = git self._keepass = keepass def enqueue(self, event: WebhookEvent): self._enqueue(Task(uuid.UUID(), self, event)) def _process(self, task: Task[WebhookEvent]) -> Result: event: WebhookEvent = task.payload # TODO: persist event data commit_hash = self._git.get_new_commit_hash() if commit_hash != event.commit: logger.warning(f"Commit hash mismatch: {commit_hash} != {event.commit}") return Result(task.id, False, "Commit hash mismatch") # TODO: persist commit data service = self._get_service(event.files) return Result(task.id, True) def _get_service(self, files: List[str]) -> str: pass @property def health(self) -> HealthCheck: return HealthCheck( self._docker is not None and self._git is not None and self._keepass is not None, f"Docker: {self._docker is not None}, Git: {self._git is not None}, KeePass: {self._keepass is not None}" )