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

88 lines
2.8 KiB
Python

from fastapi import APIRouter, Depends, HTTPException
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy import select, delete
from typing import List, Optional
from pydantic import BaseModel
from datetime import datetime
from app.db.database import get_db
from app.db.models import AutoTradeRobot
router = APIRouter()
# --- Schema ---
class AutoTradeConfigSchema(BaseModel):
id: str
stockCode: str
stockName: str
groupId: Optional[str] = None
type: str
frequency: str
executionTime: str
market: str
quantity: int
specificDay: Optional[int] = None
trailingPercent: Optional[float] = None
active: bool = True
class Config:
from_attributes = True
# --- Endpoints ---
@router.get("/configs", response_model=List[AutoTradeConfigSchema])
async def get_auto_configs(db: AsyncSession = Depends(get_db)):
stmt = select(AutoTradeRobot)
res = await db.execute(stmt)
return res.scalars().all()
@router.post("/configs")
async def create_auto_config(config: AutoTradeConfigSchema, db: AsyncSession = Depends(get_db)):
# Check exists? Upsert?
# Frontend generates ID usually or we do. Schema has ID.
# We will upsert (merge) or just add.
# Check if exists
stmt = select(AutoTradeRobot).where(AutoTradeRobot.id == config.id)
res = await db.execute(stmt)
existing = res.scalar_one_or_none()
if existing:
# Update
existing.stockCode = config.stockCode
existing.stockName = config.stockName
existing.groupId = config.groupId
existing.type = config.type
existing.frequency = config.frequency
existing.executionTime = config.executionTime
existing.market = config.market
existing.quantity = config.quantity
existing.specificDay = config.specificDay
existing.trailingPercent = config.trailingPercent
existing.active = config.active
else:
# Create
new_obj = AutoTradeRobot(
id=config.id,
stockCode=config.stockCode,
stockName=config.stockName,
groupId=config.groupId,
type=config.type,
frequency=config.frequency,
executionTime=config.executionTime,
market=config.market,
quantity=config.quantity,
specificDay=config.specificDay,
trailingPercent=config.trailingPercent,
active=config.active
)
db.add(new_obj)
await db.commit()
return {"status": "saved", "id": config.id}
@router.delete("/configs/{config_id}")
async def delete_auto_config(config_id: str, db: AsyncSession = Depends(get_db)):
await db.execute(delete(AutoTradeRobot).where(AutoTradeRobot.id == config_id))
await db.commit()
return {"status": "deleted"}