chore: initialize monorepo with project scaffolding, configs, and CI setup
This commit is contained in:
7
apps/coordinator-api/src/app/domain/__init__.py
Normal file
7
apps/coordinator-api/src/app/domain/__init__.py
Normal file
@@ -0,0 +1,7 @@
|
||||
"""Domain models for the coordinator API."""
|
||||
|
||||
from .job import Job
|
||||
from .miner import Miner
|
||||
from .job_receipt import JobReceipt
|
||||
|
||||
__all__ = ["Job", "Miner", "JobReceipt"]
|
||||
30
apps/coordinator-api/src/app/domain/job.py
Normal file
30
apps/coordinator-api/src/app/domain/job.py
Normal file
@@ -0,0 +1,30 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
from uuid import uuid4
|
||||
|
||||
from sqlalchemy import Column, JSON
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from ..models import JobState
|
||||
|
||||
|
||||
class Job(SQLModel, table=True):
|
||||
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
|
||||
client_id: str = Field(index=True)
|
||||
|
||||
state: JobState = Field(default=JobState.queued, sa_column_kwargs={"nullable": False})
|
||||
payload: dict = Field(sa_column=Column(JSON, nullable=False))
|
||||
constraints: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
|
||||
|
||||
ttl_seconds: int = Field(default=900)
|
||||
requested_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
expires_at: datetime = Field(default_factory=datetime.utcnow)
|
||||
|
||||
assigned_miner_id: Optional[str] = Field(default=None, index=True)
|
||||
|
||||
result: Optional[dict] = Field(default=None, sa_column=Column(JSON, nullable=True))
|
||||
receipt: Optional[dict] = Field(default=None, sa_column=Column(JSON, nullable=True))
|
||||
receipt_id: Optional[str] = Field(default=None, index=True)
|
||||
error: Optional[str] = None
|
||||
15
apps/coordinator-api/src/app/domain/job_receipt.py
Normal file
15
apps/coordinator-api/src/app/domain/job_receipt.py
Normal file
@@ -0,0 +1,15 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from uuid import uuid4
|
||||
|
||||
from sqlalchemy import Column, JSON
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class JobReceipt(SQLModel, table=True):
|
||||
id: str = Field(default_factory=lambda: uuid4().hex, primary_key=True, index=True)
|
||||
job_id: str = Field(index=True, foreign_key="job.id")
|
||||
receipt_id: str = Field(index=True)
|
||||
payload: dict = Field(sa_column=Column(JSON, nullable=False))
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow, index=True)
|
||||
25
apps/coordinator-api/src/app/domain/miner.py
Normal file
25
apps/coordinator-api/src/app/domain/miner.py
Normal file
@@ -0,0 +1,25 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Column, JSON
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class Miner(SQLModel, table=True):
|
||||
id: str = Field(primary_key=True, index=True)
|
||||
region: Optional[str] = Field(default=None, index=True)
|
||||
capabilities: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
|
||||
concurrency: int = Field(default=1)
|
||||
status: str = Field(default="ONLINE", index=True)
|
||||
inflight: int = Field(default=0)
|
||||
extra_metadata: dict = Field(default_factory=dict, sa_column=Column(JSON, nullable=False))
|
||||
last_heartbeat: datetime = Field(default_factory=datetime.utcnow, index=True)
|
||||
session_token: Optional[str] = None
|
||||
last_job_at: Optional[datetime] = Field(default=None, index=True)
|
||||
jobs_completed: int = Field(default=0)
|
||||
jobs_failed: int = Field(default=0)
|
||||
total_job_duration_ms: int = Field(default=0)
|
||||
average_job_duration_ms: float = Field(default=0.0)
|
||||
last_receipt_id: Optional[str] = Field(default=None, index=True)
|
||||
Reference in New Issue
Block a user