|
|
|
|
|
|
|
|
""" |
|
|
Pydantic models for request/response validation. |
|
|
""" |
|
|
from pydantic import BaseModel, HttpUrl, Field |
|
|
from typing import Optional, Dict, Any, List |
|
|
|
|
|
class PageSpeedRequest(BaseModel): |
|
|
"""Request model for fetching PageSpeed data.""" |
|
|
url: HttpUrl = Field( |
|
|
..., |
|
|
description="The URL to analyze for PageSpeed insights", |
|
|
example="https://www.example.com" |
|
|
) |
|
|
|
|
|
class Config: |
|
|
json_schema_extra = { |
|
|
"example": { |
|
|
"url": "https://www.ocoya.com/" |
|
|
} |
|
|
} |
|
|
|
|
|
class PageSpeedDataResponse(BaseModel): |
|
|
"""Response model that returns only the raw PageSpeed data.""" |
|
|
success: bool = Field( |
|
|
..., |
|
|
description="Whether the PageSpeed fetch was successful" |
|
|
) |
|
|
url: str = Field( |
|
|
..., |
|
|
description="The analyzed URL" |
|
|
) |
|
|
pagespeed_data: Optional[Dict[Any, Any]] = Field( |
|
|
None, |
|
|
description="Raw PageSpeed Insights data" |
|
|
) |
|
|
error: Optional[str] = Field( |
|
|
None, |
|
|
description="Error message if fetching failed" |
|
|
) |
|
|
|
|
|
class ReportRequest(BaseModel): |
|
|
""" |
|
|
Request model for generating a Gemini report. |
|
|
Expects the entire raw PageSpeed JSON payload in the body. |
|
|
""" |
|
|
pagespeed_data: Dict[Any, Any] = Field( |
|
|
..., |
|
|
description="Raw PageSpeed Insights data (JSON) previously fetched", |
|
|
) |
|
|
|
|
|
class Config: |
|
|
schema_extra = { |
|
|
"example": { |
|
|
"pagespeed_data": { |
|
|
|
|
|
|
|
|
"lighthouseResult": { |
|
|
"audits": { |
|
|
"first-contentful-paint": {"numericValue": 1234}, |
|
|
"largest-contentful-paint": {"numericValue": 2345} |
|
|
} |
|
|
}, |
|
|
"loadingExperience": { |
|
|
"metrics": { |
|
|
"FIRST_CONTENTFUL_PAINT_MS": {"percentile": 1200, "category": "FAST"} |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
class ReportResponse(BaseModel): |
|
|
"""Response model that returns only the Gemini-generated report.""" |
|
|
success: bool = Field( |
|
|
..., |
|
|
description="Whether report generation was successful" |
|
|
) |
|
|
report: Optional[str] = Field( |
|
|
None, |
|
|
description="Gemini-generated performance optimization report" |
|
|
) |
|
|
error: Optional[str] = Field( |
|
|
None, |
|
|
description="Error message if report generation failed" |
|
|
) |
|
|
|
|
|
class HealthResponse(BaseModel): |
|
|
"""Health check response model.""" |
|
|
status: str = Field( |
|
|
..., |
|
|
description="Health status of the API" |
|
|
) |
|
|
version: str = Field( |
|
|
..., |
|
|
description="API version" |
|
|
) |
|
|
uptime: str = Field( |
|
|
..., |
|
|
description="API uptime" |
|
|
) |
|
|
|
|
|
class PriorityRequest(BaseModel): |
|
|
report: str |
|
|
|
|
|
|
|
|
class PriorityResponse(BaseModel): |
|
|
success: bool |
|
|
priorities: Optional[Dict[str, List[str]]] = None |
|
|
error: Optional[str] = None |
|
|
|
|
|
class AnalyzeRequest(BaseModel): |
|
|
url: HttpUrl |
|
|
|
|
|
class AnalyzeResponse(BaseModel): |
|
|
success: bool |
|
|
url: HttpUrl |
|
|
report: str | None |
|
|
priorities: dict | None |
|
|
error: str | None |