scheduler.py 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. from datetime import datetime
  2. from typing import TYPE_CHECKING
  3. from core_domain import ScheduledJobContract, ScheduledJobStatus, ScheduledJobType
  4. from core_shared import JSONValue
  5. from pydantic import BaseModel, Field
  6. if TYPE_CHECKING:
  7. from app.db.models import ScheduledJob
  8. class ScheduledJobCreateRequest(BaseModel):
  9. job_type: ScheduledJobType
  10. name: str
  11. description: str | None = None
  12. target_service: str | None = None
  13. target_url: str | None = None
  14. method: str | None = None
  15. payload_json: dict[str, JSONValue] = Field(default_factory=dict)
  16. schedule_time: datetime
  17. max_attempts: int = Field(default=3, ge=1, le=20)
  18. metadata_json: dict[str, JSONValue] = Field(default_factory=dict)
  19. class ScheduledJobResponse(ScheduledJobContract):
  20. @classmethod
  21. def from_entity(cls, entity: "ScheduledJob") -> "ScheduledJobResponse":
  22. return cls.model_validate(entity, from_attributes=True)
  23. class ScheduledJobListRequest(BaseModel):
  24. status: ScheduledJobStatus | None = None
  25. job_type: ScheduledJobType | None = None
  26. limit: int = Field(default=100, ge=1, le=500)
  27. class ScheduledJobStatusUpdateRequest(BaseModel):
  28. status: ScheduledJobStatus
  29. last_error_message: str | None = None
  30. class ScheduledJobStatusPostRequest(ScheduledJobStatusUpdateRequest):
  31. job_id: str
  32. class DueJobClaimRequest(BaseModel):
  33. worker_key: str
  34. lease_seconds: int = Field(default=300, ge=1, le=86400)
  35. limit: int = Field(default=50, ge=1, le=500)
  36. now_time: datetime | None = None