Admiral/admiral-worker/app/repos/sql/WorkerJobLogSqlRepo.py
2025-06-24 14:22:50 +02:00

74 lines
2.0 KiB
Python

import uuid
from dataclasses import dataclass
from typing import Optional
from sqlalchemy import Engine
from sqlmodel import SQLModel, Field, Session, select
from typing_extensions import override, Self
from app.repos.sql import dbRetry
from core.domain.worker.WorkerJob import WorkerJob
from core.domain.worker.WorkerLog import WorkerLog
from core.domain.worker.WorkerLogLevel import WorkerLogLevel
from core.repos.WorkerJobLogRepo import WorkerJobLogRepo
from core.types.Id import Id
@dataclass
class WorkerJobLogSqlRepo(WorkerJobLogRepo):
db: Engine
class Table(SQLModel, table=True):
__tablename__ = "worker_job_log"
id: str = Field(primary_key=True)
context: str
data: str
worker_job_id: str = Field(foreign_key="worker_job.id")
created_at: float
level: str
def toDomain(self) -> WorkerLog:
return WorkerLog(
context=self.context,
data=self.data,
ownerId=Id(value=uuid.UUID(self.worker_job_id)),
createdAt=self.created_at,
level=WorkerLogLevel(self.level),
id=Id(value=uuid.UUID(self.id))
)
@classmethod
def toRow(cls, obj: WorkerLog) -> Self:
return cls(
context=obj.context,
data=obj.data,
worker_job_id=obj.ownerId.value,
created_at=obj.createdAt,
level=obj.level.value,
id=obj.id.value,
)
@override
def getAll(self) -> list[WorkerLog]:
with Session(self.db) as conn:
query = select(self.Table)
return [row.toDomain() for row in conn.exec(query).all()]
@override
def get(self, id: Id[WorkerLog]) -> Optional[WorkerLog]:
with Session(self.db) as conn:
query = select(self.Table).filter_by(id=id.value)
row = conn.exec(query).one_or_none()
return row.toDomain() if row is not None else None
@override
@dbRetry
def post(self, context: str, workerJobId: Id[WorkerJob], data: str, level: WorkerLogLevel) -> WorkerLog:
obj = WorkerLog(context=context, data=data, ownerId=workerJobId, level=level)
with Session(self.db) as conn:
conn.add(self.Table.toRow(obj))
conn.commit()
return obj