diff options
Diffstat (limited to 'backend/app/schemas.py')
| -rw-r--r-- | backend/app/schemas.py | 104 |
1 files changed, 104 insertions, 0 deletions
diff --git a/backend/app/schemas.py b/backend/app/schemas.py new file mode 100644 index 0000000..db0076d --- /dev/null +++ b/backend/app/schemas.py @@ -0,0 +1,104 @@ +"""Pydantic response schemas for the Prism v2 Overview API.""" +from typing import Literal + +from pydantic import BaseModel, Field + + +class SearchResult(BaseModel): + symbol: str + name: str + exchange: str | None = None + + +class MarketIndex(BaseModel): + name: str + price: float | None = None + change_pct: float | None = None + + +class Quote(BaseModel): + price: float | None = None + prev_close: float | None = None + change: float | None = None + change_pct: float | None = None + + +class Signal(BaseModel): + key: str + state: Literal["pos", "warn", "neg", "neu"] + value: str + description: str + + +class OverviewStats(BaseModel): + market_cap: float | None = None + trailing_pe: float | None = None + trailing_eps: float | None = None + volume: float | None = None + average_volume: float | None = None + beta: float | None = None + + +class Range52Week(BaseModel): + low: float | None = None + high: float | None = None + price: float | None = None + + +class ShortInterest(BaseModel): + short_percent_of_float: float | None = None + short_ratio: float | None = None + shares_short: int | None = None + shares_short_prior_month: int | None = None + shares_short_delta_pct: float | None = None + + +class CompanyProfile(BaseModel): + symbol: str + name: str + sector: str | None = None + industry: str | None = None + exchange: str | None = None + website: str | None = None + summary: str | None = None + + +class OverviewMeta(BaseModel): + status: Literal["complete", "partial"] + is_partial: bool = False + field_availability: dict[str, bool] = Field(default_factory=dict) + sources: dict[str, str] = Field(default_factory=dict) + + +class TickerOverview(BaseModel): + profile: CompanyProfile + quote: Quote + signals: list[Signal] = Field(default_factory=list) + stats: OverviewStats + range_52w: Range52Week + short_interest: ShortInterest + meta: OverviewMeta + + +class HistoryPoint(BaseModel): + date: str + open: float | None = None + high: float | None = None + low: float | None = None + close: float | None = None + volume: float | None = None + + +class WatchlistItem(BaseModel): + symbol: str + created_at: str + quote: Quote | None = None + + +class WatchlistResponse(BaseModel): + items: list[WatchlistItem] + limit: int = 10 + + +class ErrorResponse(BaseModel): + detail: str |
