from __future__ import annotations from fastapi import APIRouter, Depends, HTTPException from pydantic import BaseModel from sqlalchemy.orm import Session from app.core.database import get_db from app.models.stock import Stock from app.services.market_data import market_data_service router = APIRouter(prefix="/api/stocks", tags=["stocks"]) class StockCreate(BaseModel): code: str name: str market: str = "KRX" class StockUpdate(BaseModel): name: str | None = None is_active: bool | None = None @router.get("/") def list_stocks(db: Session = Depends(get_db)) -> list[dict]: stocks = db.query(Stock).all() return [ { "code": s.code, "name": s.name, "market": s.market, "is_active": s.is_active, "created_at": s.created_at.isoformat() if s.created_at else None, } for s in stocks ] @router.post("/") def add_stock(data: StockCreate, db: Session = Depends(get_db)) -> dict: existing = db.query(Stock).filter(Stock.code == data.code).first() if existing: raise HTTPException(status_code=409, detail="이미 존재하는 종목입니다") stock = Stock(code=data.code, name=data.name, market=data.market) db.add(stock) db.commit() db.refresh(stock) return {"code": stock.code, "name": stock.name, "market": stock.market, "is_active": stock.is_active} @router.delete("/{stock_code}") def remove_stock(stock_code: str, db: Session = Depends(get_db)) -> dict: stock = db.query(Stock).filter(Stock.code == stock_code).first() if not stock: raise HTTPException(status_code=404, detail="종목을 찾을 수 없습니다") stock.is_active = False db.commit() return {"message": "종목이 비활성화되었습니다", "code": stock_code} @router.get("/{stock_code}/price") async def get_price(stock_code: str) -> dict: price = await market_data_service.get_current_price(stock_code) if not price: raise HTTPException(status_code=404, detail="시세 조회 실패") return price @router.get("/{stock_code}/chart") async def get_chart(stock_code: str, days: int = 30) -> list[dict]: from datetime import datetime, timedelta end = datetime.now().strftime("%Y%m%d") start = (datetime.now() - timedelta(days=days)).strftime("%Y%m%d") chart = await market_data_service.get_daily_chart(stock_code, start, end, days) return chart