import uuid from dataclasses import dataclass from typing import Optional from sqlalchemy.engine 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.WorkerJobStatus import WorkerJobStatus from core.domain.worker.WorkerJob import WorkerJob from core.repos.WorkerJobStatusRepo import WorkerJobStatusRepo from core.types.Id import Id @dataclass class WorkerJobStatusSqlRepo(WorkerJobStatusRepo): db: Engine class Table(SQLModel, table=True): __tablename__ = "worker_job_status" id: str = Field(primary_key=True) worker_job_id: str = Field(foreign_key="worker_job.id") ram_taken: float cpu_utilization: float created_at: int def toDomain(self) -> WorkerJobStatus: return WorkerJobStatus( ownerId=Id(value=uuid.UUID(self.worker_job_id)), ramTaken=self.ram_taken, cpuUtilization=self.cpu_utilization, createdAt=self.created_at, id=Id(value=uuid.UUID(self.id)) ) @classmethod def toRow(cls, obj: WorkerJobStatus) -> Self: return cls( worker_job_id=obj.ownerId.value, ram_taken=obj.ramTaken, cpu_utilization=obj.cpuUtilization, created_at=obj.createdAt, id=obj.id.value ) @override def getAll(self) -> list[WorkerJobStatus]: 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[WorkerJobStatus]) -> Optional[WorkerJobStatus]: 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, workerJobId: Id[WorkerJob], ramTaken: float, cpuUtilization: float) -> WorkerJobStatus: obj = WorkerJobStatus(ownerId=workerJobId, ramTaken=ramTaken, cpuUtilization=cpuUtilization) with Session(self.db) as conn: conn.add(self.Table.toRow(obj)) conn.commit() return obj