70 lines
1.6 KiB
Python
70 lines
1.6 KiB
Python
"""API models for backend scheduled actions."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Literal
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class SchedulerStatus(BaseModel):
|
|
service_id: str
|
|
action_key: str
|
|
worker_running: bool
|
|
enabled: bool
|
|
running: bool = False
|
|
poll_interval_seconds: int = Field(ge=5, le=300)
|
|
sample_retention_seconds: int = Field(ge=60, le=86_400)
|
|
sample_max_rows: int = Field(ge=60, le=1_200)
|
|
next_run_at: int | None = None
|
|
last_attempt_at: int | None = None
|
|
last_success_at: int | None = None
|
|
last_error: str = ""
|
|
consecutive_failures: int = 0
|
|
backoff_until: int | None = None
|
|
is_stale: bool = False
|
|
|
|
|
|
class SchedulerRun(BaseModel):
|
|
id: str
|
|
service_id: str
|
|
action_key: str
|
|
trigger: Literal["schedule", "manual"]
|
|
started_at: int
|
|
finished_at: int | None = None
|
|
status: Literal["running", "success", "failure", "cancelled"]
|
|
attempt: int = 0
|
|
duration_ms: int | None = None
|
|
error: str = ""
|
|
created_at: int
|
|
|
|
|
|
class SchedulerRunsResponse(BaseModel):
|
|
items: list[SchedulerRun]
|
|
total: int
|
|
limit: int
|
|
offset: int
|
|
|
|
|
|
class SchedulerSample(BaseModel):
|
|
ts: int
|
|
dl_speed: int
|
|
up_speed: int
|
|
|
|
|
|
class SchedulerSamplesResponse(BaseModel):
|
|
service_id: str
|
|
window_seconds: int
|
|
samples: list[SchedulerSample]
|
|
|
|
|
|
class SchedulerManualRunResponse(BaseModel):
|
|
run: SchedulerRun
|
|
status: SchedulerStatus
|
|
|
|
|
|
class SchedulerActionResult(BaseModel):
|
|
"""Internal-friendly result payload exposed for diagnostics/tests."""
|
|
|
|
data: dict[str, Any] = Field(default_factory=dict)
|