"백엔드_핵심_로직_구현_프론트엔드_연동_및_도커_배포_최적화_완료"

This commit is contained in:
2026-02-03 00:52:54 +09:00
parent ed8fc0943b
commit eeddc62089
32 changed files with 1287 additions and 318 deletions

View File

@@ -0,0 +1,100 @@
from fastapi import APIRouter, Depends
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select
from typing import List
from pydantic import BaseModel
from datetime import datetime
from app.db.database import get_db
from app.db.models import TradeHistory, AutoTradeRobot, ReservedOrder
router = APIRouter()
# --- Schemas ---
class TradeOrderSchema(BaseModel):
id: str
stockName: str
type: str
quantity: int
price: float
timestamp: datetime
status: str
class Config:
from_attributes = True
class ReservedOrderSchema(BaseModel):
id: str
stockName: str
stockCode: str
monitoringType: str
status: str
class Config:
from_attributes = True
class CreateReservedOrderRequest(BaseModel):
stockCode: str
stockName: str
monitoringType: str # PRICE_TRIGGER
triggerPrice: float
orderType: str # BUY, SELL
quantity: int
price: float = 0 # Limit price (0 = Market)
# Trailing Stop Options
trailingType: str | None = None # AMOUNT, PERCENT
trailingValue: float | None = None
stopLossValue: float | None = None
class ReservedOrderResponse(BaseModel):
id: str
status: str
# --- Endpoints ---
@router.get("/history/orders", response_model=List[TradeOrderSchema])
async def get_trade_history(limit: int = 100, db: AsyncSession = Depends(get_db)):
stmt = select(TradeHistory).order_by(TradeHistory.timestamp.desc()).limit(limit)
result = await db.execute(stmt)
return result.scalars().all()
@router.get("/reserved-orders", response_model=List[ReservedOrderSchema])
async def get_reserved_orders(db: AsyncSession = Depends(get_db)):
stmt = select(ReservedOrder)
result = await db.execute(stmt)
return result.scalars().all()
@router.post("/reserved-orders")
async def create_reserved_order(req: CreateReservedOrderRequest, db: AsyncSession = Depends(get_db)):
import uuid
new_id = str(uuid.uuid4())
order = ReservedOrder(
id=new_id,
stockCode=req.stockCode,
stockName=req.stockName,
monitoringType=req.monitoringType,
triggerPrice=req.triggerPrice,
type=req.orderType, # BUY/SELL
quantity=req.quantity,
price=req.price,
# TS Fields
trailingType=req.trailingType,
trailingValue=req.trailingValue,
stopLossValue=req.stopLossValue,
highestPrice=0, # Init
lowestPrice=99999999, # Init
status="MONITORING",
created_at=datetime.now()
)
db.add(order)
await db.commit()
return {"id": new_id, "status": "MONITORING"}
@router.delete("/reserved-orders/{order_id}")
async def delete_reserved_order(order_id: str, db: AsyncSession = Depends(get_db)):
from sqlalchemy import delete
await db.execute(delete(ReservedOrder).where(ReservedOrder.id == order_id))
await db.commit()
return {"status": "Deleted"}