Files
KisStock/backend/app/api/endpoints/kis.py

64 lines
2.0 KiB
Python

from fastapi import APIRouter, Depends, HTTPException, Query
from pydantic import BaseModel
from typing import Literal
from app.services.kis_client import kis_client
import logging
router = APIRouter()
logger = logging.getLogger("KisAPI")
class OrderRequest(BaseModel):
market: Literal["Domestic", "Overseas"]
side: Literal["buy", "sell"]
code: str
quantity: int
price: float = 0 # 0 for Market Price (if supported)
class ModifyOrderRequest(BaseModel):
market: Literal["Domestic", "Overseas"]
order_no: str
code: str
quantity: int
price: float = 0
type: str = "00"
is_cancel: bool = False # True = Cancel, False = Modify
@router.get("/price")
async def get_current_price(market: Literal["Domestic", "Overseas"], code: str):
"""
Get Real-time Price (REST). Prefer WebSocket for streaming.
"""
try:
price = await kis_client.get_current_price(market, code)
return {"code": code, "price": price}
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.get("/balance")
async def get_balance(market: Literal["Domestic", "Overseas"]):
try:
data = await kis_client.get_balance(market)
return data
raise HTTPException(status_code=500, detail=str(e))
@router.put("/order")
async def modify_order(req: ModifyOrderRequest):
logger.info(f"Received Modify/Cancel Request: {req}")
try:
res = await kis_client.modify_order(
req.market, req.order_no, req.code, req.quantity, req.price, req.type, req.is_cancel
)
return res
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))
@router.post("/order")
async def place_order(order: OrderRequest):
logger.info(f"Received Order Request: {order}")
try:
res = await kis_client.place_order(order.market, order.side, order.code, order.quantity, order.price)
return res
except Exception as e:
raise HTTPException(status_code=500, detail=str(e))