110 lines
3.4 KiB
Python
110 lines
3.4 KiB
Python
from __future__ import annotations
|
|
|
|
import uuid
|
|
|
|
from sqlalchemy import Select, select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from cpv3.modules.jobs.models import Job, JobEvent
|
|
from cpv3.modules.jobs.schemas import (
|
|
JobCreate,
|
|
JobEventCreate,
|
|
JobEventUpdate,
|
|
JobUpdate,
|
|
)
|
|
from cpv3.modules.users.models import User
|
|
|
|
|
|
class JobRepository:
|
|
"""Repository for Job database operations."""
|
|
|
|
def __init__(self, session: AsyncSession) -> None:
|
|
self._session = session
|
|
|
|
async def list_all(self, *, requester: User) -> list[Job]:
|
|
stmt: Select[tuple[Job]] = select(Job).where(Job.is_active.is_(True))
|
|
if not requester.is_staff:
|
|
stmt = stmt.where(Job.user_id == requester.id)
|
|
|
|
result = await self._session.execute(stmt.order_by(Job.created_at.desc()))
|
|
return list(result.scalars().all())
|
|
|
|
async def get_by_id(self, job_id: uuid.UUID) -> Job | None:
|
|
result = await self._session.execute(
|
|
select(Job).where(Job.id == job_id).where(Job.is_active.is_(True))
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def create(self, *, requester: User, data: JobCreate) -> Job:
|
|
job = Job(
|
|
user_id=requester.id,
|
|
broker_id=data.broker_id,
|
|
project_id=data.project_id,
|
|
input_data=data.input_data,
|
|
status=data.status,
|
|
job_type=data.job_type,
|
|
)
|
|
|
|
self._session.add(job)
|
|
await self._session.commit()
|
|
await self._session.refresh(job)
|
|
return job
|
|
|
|
async def update(self, job: Job, data: JobUpdate) -> Job:
|
|
for key, value in data.model_dump(exclude_unset=True).items():
|
|
if value is not None:
|
|
setattr(job, key, value)
|
|
|
|
await self._session.commit()
|
|
await self._session.refresh(job)
|
|
return job
|
|
|
|
async def deactivate(self, job: Job) -> None:
|
|
job.is_active = False
|
|
await self._session.commit()
|
|
|
|
|
|
class JobEventRepository:
|
|
"""Repository for JobEvent database operations."""
|
|
|
|
def __init__(self, session: AsyncSession) -> None:
|
|
self._session = session
|
|
|
|
async def list_all(self) -> list[JobEvent]:
|
|
result = await self._session.execute(
|
|
select(JobEvent)
|
|
.where(JobEvent.is_active.is_(True))
|
|
.order_by(JobEvent.created_at.desc())
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
async def get_by_id(self, event_id: uuid.UUID) -> JobEvent | None:
|
|
result = await self._session.execute(
|
|
select(JobEvent)
|
|
.where(JobEvent.id == event_id)
|
|
.where(JobEvent.is_active.is_(True))
|
|
)
|
|
return result.scalar_one_or_none()
|
|
|
|
async def create(self, data: JobEventCreate) -> JobEvent:
|
|
event = JobEvent(
|
|
job_id=data.job_id, event_type=data.event_type, payload=data.payload
|
|
)
|
|
self._session.add(event)
|
|
await self._session.commit()
|
|
await self._session.refresh(event)
|
|
return event
|
|
|
|
async def update(self, event: JobEvent, data: JobEventUpdate) -> JobEvent:
|
|
for key, value in data.model_dump(exclude_unset=True).items():
|
|
if value is not None:
|
|
setattr(event, key, value)
|
|
|
|
await self._session.commit()
|
|
await self._session.refresh(event)
|
|
return event
|
|
|
|
async def deactivate(self, event: JobEvent) -> None:
|
|
event.is_active = False
|
|
await self._session.commit()
|