first commit
This commit is contained in:
79
app/routers/stocks.py
Normal file
79
app/routers/stocks.py
Normal file
@@ -0,0 +1,79 @@
|
||||
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
|
||||
Reference in New Issue
Block a user