88 lines
2.8 KiB
Python
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"}
|