summaryrefslogtreecommitdiff
path: root/backend/app/schemas.py
diff options
context:
space:
mode:
authorTyler Hoang <tyler@tylerhoang.xyz>2026-05-17 12:46:13 -0700
committerTyler Hoang <tyler@tylerhoang.xyz>2026-05-17 12:46:13 -0700
commit1482422f2f5b236cdcdff4429ae06bb55dca4083 (patch)
tree4653cb4986a8a138f84dbec934effb0d011751d3 /backend/app/schemas.py
Add stack start and stop scripts
Diffstat (limited to 'backend/app/schemas.py')
-rw-r--r--backend/app/schemas.py104
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