Files
stockautomtion/app/routers/stocks.py
2026-07-16 23:55:16 +09:00

80 lines
2.4 KiB
Python

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