first commit
This commit is contained in:
59
app/routers/watchlist.py
Normal file
59
app/routers/watchlist.py
Normal file
@@ -0,0 +1,59 @@
|
||||
"""Watchlist router — manage user's curated watchlist."""
|
||||
|
||||
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.watchlist import WatchlistEntryResponse
|
||||
from app.services.watchlist_service import (
|
||||
add_manual_entry,
|
||||
get_watchlist,
|
||||
remove_entry,
|
||||
)
|
||||
|
||||
router = APIRouter(tags=["watchlist"])
|
||||
|
||||
|
||||
@router.get("/watchlist", response_model=APIEnvelope)
|
||||
async def list_watchlist(
|
||||
sort_by: str = Query(
|
||||
"composite",
|
||||
description=(
|
||||
"Sort by: composite, rr, or a dimension name "
|
||||
"(technical, sr_quality, sentiment, fundamental, momentum)"
|
||||
),
|
||||
),
|
||||
user: User = Depends(require_access),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
) -> APIEnvelope:
|
||||
"""Get current user's watchlist with enriched data."""
|
||||
rows = await get_watchlist(db, user.id, sort_by=sort_by)
|
||||
data = [WatchlistEntryResponse(**r).model_dump(mode="json") for r in rows]
|
||||
return APIEnvelope(status="success", data=data)
|
||||
|
||||
|
||||
@router.post("/watchlist/{symbol}", response_model=APIEnvelope)
|
||||
async def add_to_watchlist(
|
||||
symbol: str,
|
||||
user: User = Depends(require_access),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
) -> APIEnvelope:
|
||||
"""Add a manual entry to the watchlist."""
|
||||
entry = await add_manual_entry(db, user.id, symbol)
|
||||
return APIEnvelope(
|
||||
status="success",
|
||||
data={"symbol": symbol.strip().upper(), "entry_type": entry.entry_type},
|
||||
)
|
||||
|
||||
|
||||
@router.delete("/watchlist/{symbol}", response_model=APIEnvelope)
|
||||
async def remove_from_watchlist(
|
||||
symbol: str,
|
||||
user: User = Depends(require_access),
|
||||
db: AsyncSession = Depends(get_db),
|
||||
) -> APIEnvelope:
|
||||
"""Remove an entry from the watchlist."""
|
||||
await remove_entry(db, user.id, symbol)
|
||||
return APIEnvelope(status="success", data=None)
|
||||
Reference in New Issue
Block a user