from datetime import datetime from typing import Optional, Dict, Any, List from pydantic import BaseModel, HttpUrl from app.models.scrape_job import JobStatus class ScrapeJobBase(BaseModel): """ Base schema for scrape job data. """ url: HttpUrl selector: Optional[str] = None user_agent: Optional[str] = None timeout: Optional[int] = None class ScrapeJobCreate(ScrapeJobBase): """ Schema for creating a new scrape job. """ pass class ScrapeJobUpdate(BaseModel): """ Schema for updating a scrape job. """ url: Optional[HttpUrl] = None status: Optional[JobStatus] = None selector: Optional[str] = None error: Optional[str] = None result: Optional[Dict[str, Any]] = None user_agent: Optional[str] = None timeout: Optional[int] = None class ScrapeJobInDBBase(ScrapeJobBase): """ Base schema for scrape job in database. """ id: int status: JobStatus created_at: datetime updated_at: datetime started_at: Optional[datetime] = None completed_at: Optional[datetime] = None error: Optional[str] = None result: Optional[Dict[str, Any]] = None class Config: orm_mode = True class ScrapeJob(ScrapeJobInDBBase): """ Schema for returned scrape job. """ pass class ScrapeJobList(BaseModel): """ Schema for a list of scrape jobs. """ jobs: List[ScrapeJob] total: int