57 lines
1.7 KiB
Python
57 lines
1.7 KiB
Python
"""OHLCV router: endpoints for storing and querying price data."""
|
|
|
|
from datetime import date
|
|
|
|
from fastapi import APIRouter, Depends, Query
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.dependencies import get_db, require_access
|
|
from app.models.user import User
|
|
from app.schemas.common import APIEnvelope
|
|
from app.schemas.ohlcv import OHLCVCreate, OHLCVResponse
|
|
from app.services import price_service
|
|
|
|
router = APIRouter(tags=["ohlcv"])
|
|
|
|
|
|
@router.post("/ohlcv", response_model=APIEnvelope)
|
|
async def create_ohlcv(
|
|
body: OHLCVCreate,
|
|
_user: User = Depends(require_access),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Upsert an OHLCV record for a ticker and date."""
|
|
record = await price_service.upsert_ohlcv(
|
|
db,
|
|
symbol=body.symbol,
|
|
record_date=body.date,
|
|
open_=body.open,
|
|
high=body.high,
|
|
low=body.low,
|
|
close=body.close,
|
|
volume=body.volume,
|
|
)
|
|
return APIEnvelope(
|
|
status="success",
|
|
data=OHLCVResponse.model_validate(record).model_dump(mode="json"),
|
|
)
|
|
|
|
|
|
@router.get("/ohlcv/{symbol}", response_model=APIEnvelope)
|
|
async def get_ohlcv(
|
|
symbol: str,
|
|
start_date: date | None = Query(None, description="Start date (YYYY-MM-DD)"),
|
|
end_date: date | None = Query(None, description="End date (YYYY-MM-DD)"),
|
|
_user: User = Depends(require_access),
|
|
db: AsyncSession = Depends(get_db),
|
|
):
|
|
"""Query OHLCV records for a ticker, optionally filtered by date range."""
|
|
records = await price_service.query_ohlcv(db, symbol, start_date, end_date)
|
|
return APIEnvelope(
|
|
status="success",
|
|
data=[
|
|
OHLCVResponse.model_validate(r).model_dump(mode="json")
|
|
for r in records
|
|
],
|
|
)
|