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 except Exception as e: 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))