rebuild(stage-5): establish market data gateway and charts
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from typing import Annotated, Literal
|
||||
|
||||
from fastapi import APIRouter, Path, Query, Request
|
||||
|
||||
from backend.features.accounts.auth import AdminWritePrincipal, AuthenticatedPrincipal
|
||||
from backend.features.market.schemas import (
|
||||
ChartResponse,
|
||||
MarketSummaryResponse,
|
||||
ReferenceSyncResponse,
|
||||
SearchResponse,
|
||||
TradeContextResponse,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/market", tags=["market"])
|
||||
|
||||
|
||||
@router.get("/context", response_model=TradeContextResponse)
|
||||
def context(
|
||||
request: Request,
|
||||
_principal: AuthenticatedPrincipal,
|
||||
requested_date: Annotated[str | None, Query(alias="date")] = None,
|
||||
) -> dict:
|
||||
return request.app.state.container.market.context(requested_date)
|
||||
|
||||
|
||||
@router.get("/summary", response_model=MarketSummaryResponse)
|
||||
def summary(
|
||||
request: Request,
|
||||
_principal: AuthenticatedPrincipal,
|
||||
requested_date: Annotated[str | None, Query(alias="date")] = None,
|
||||
) -> dict:
|
||||
return request.app.state.container.market.summary(requested_date)
|
||||
|
||||
|
||||
@router.get("/search", response_model=SearchResponse)
|
||||
def search(
|
||||
request: Request,
|
||||
_principal: AuthenticatedPrincipal,
|
||||
query: Annotated[str, Query(alias="q", max_length=80)] = "",
|
||||
) -> dict:
|
||||
return request.app.state.container.market.search(query)
|
||||
|
||||
|
||||
@router.get("/entities/{entity_type}/{identifier}/charts/{interval}", response_model=ChartResponse)
|
||||
def chart(
|
||||
request: Request,
|
||||
_principal: AuthenticatedPrincipal,
|
||||
entity_type: Annotated[Literal["stock", "sector", "theme", "index"], Path()],
|
||||
identifier: Annotated[str, Path(min_length=1, max_length=40)],
|
||||
interval: Annotated[Literal["day", "minute"], Path()],
|
||||
) -> dict:
|
||||
return request.app.state.container.market.chart(entity_type, identifier, interval)
|
||||
|
||||
|
||||
@router.post("/reference-sync", response_model=ReferenceSyncResponse)
|
||||
def refresh_reference(request: Request, _principal: AdminWritePrincipal) -> dict[str, int | str]:
|
||||
return request.app.state.container.market.refresh_reference()
|
||||
Reference in New Issue
Block a user