This commit is contained in:
Piotr Dec 2025-10-22 23:58:15 +02:00
parent 569aefeccb
commit 3845cc7ecf
Signed by: stawros
GPG key ID: 74B18A3F0F1E99C0
3 changed files with 62 additions and 5 deletions

View file

@ -30,5 +30,5 @@ class APIv1:
@router.post("/ci", summary="CI Webhook")
async def ci(self, request: Request):
self.webhook_service.process_ci_event(mapper.map(request))
self.webhook_service.enqueue(mapper.map(request))
return Response(status_code=201)

View file

@ -1,23 +1,30 @@
import uuid
from typing import Annotated
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
@injectable
class WebhookProcessor:
@injectable(singleton=True)
class WebhookProcessor(EnqueuedProcessor):
@autowired
def __init__(self, docker: Annotated[DockerService, Autowired],
git: Annotated[GitService, Autowired],
keepass: Annotated[Passwords, Autowired]):
keepass: Annotated[Passwords, Autowired],
queue: Annotated[ProcessQueue, Autowired]):
super().__init__(queue)
self._docker = docker
self._git = git
self._keepass = keepass
def process_ci_event(self, event: WebhookEvent):
def enqueue(self, event: WebhookEvent):
self._enqueue(Task(uuid.UUID(), self, event))
def _process(self, task: Task) -> Result:
pass
@property

50
app/core/queue.py Normal file
View file

@ -0,0 +1,50 @@
import time
import uuid
from abc import ABC, abstractmethod
from dataclasses import dataclass
from multiprocessing import Queue, Process
from injectable import injectable
@dataclass
class Task:
_id: uuid.UUID
processor: 'EnqueuedProcessor'
payload: object
@dataclass
class Result:
_id: uuid.UUID
success: bool
error: str | None = None
@injectable(singleton=True)
class ProcessQueue:
def __init__(self):
self._q = Queue()
self._process_thread = Process(target=self._run, args=(self._q,))
self._process_thread.start()
def put(self, task: Task):
self._q.put(task)
def _run(self, queue: Queue):
while True:
if queue.empty():
time.sleep(10)
continue
task = queue.get()
task.processor._process(task.payload)
class EnqueuedProcessor(ABC):
def __init__(self, queue: ProcessQueue):
self._queue = queue
def _enqueue(self, task: Task):
self._queue.put(task)
@abstractmethod
def _process(self, task: Task) -> Result:
pass