Initial commit
This commit is contained in:
143
backend/app/api/endpoints/trading_rules.py
Normal file
143
backend/app/api/endpoints/trading_rules.py
Normal file
@@ -0,0 +1,143 @@
|
||||
from fastapi import APIRouter, Depends, HTTPException
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
from sqlalchemy import select, update, delete
|
||||
from typing import List
|
||||
from datetime import datetime
|
||||
|
||||
from app.core.database import get_db
|
||||
from app.models.models import TradingRule
|
||||
from pydantic import BaseModel
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
class TradingRuleCreate(BaseModel):
|
||||
name: str
|
||||
description: str = None
|
||||
rule_type: str
|
||||
conditions: dict
|
||||
actions: dict
|
||||
is_active: bool = True
|
||||
priority: int = 0
|
||||
|
||||
|
||||
class TradingRuleUpdate(BaseModel):
|
||||
name: str = None
|
||||
description: str = None
|
||||
rule_type: str = None
|
||||
conditions: dict = None
|
||||
actions: dict = None
|
||||
is_active: bool = None
|
||||
priority: int = None
|
||||
|
||||
|
||||
class TradingRuleResponse(BaseModel):
|
||||
id: int
|
||||
name: str
|
||||
description: str = None
|
||||
rule_type: str
|
||||
conditions: dict
|
||||
actions: dict
|
||||
is_active: bool
|
||||
priority: int
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
@router.get("", response_model=List[TradingRuleResponse])
|
||||
async def get_trading_rules(
|
||||
skip: int = 0,
|
||||
limit: int = 100,
|
||||
is_active: bool = None,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""트레이딩 규칙 목록 조회"""
|
||||
query = select(TradingRule)
|
||||
|
||||
if is_active is not None:
|
||||
query = query.where(TradingRule.is_active == is_active)
|
||||
|
||||
query = query.order_by(TradingRule.priority.desc(), TradingRule.created_at.desc())
|
||||
query = query.offset(skip).limit(limit)
|
||||
|
||||
result = await db.execute(query)
|
||||
rules = result.scalars().all()
|
||||
return rules
|
||||
|
||||
|
||||
@router.get("/{rule_id}", response_model=TradingRuleResponse)
|
||||
async def get_trading_rule(rule_id: int, db: AsyncSession = Depends(get_db)):
|
||||
"""특정 트레이딩 규칙 조회"""
|
||||
result = await db.execute(select(TradingRule).where(TradingRule.id == rule_id))
|
||||
rule = result.scalar_one_or_none()
|
||||
|
||||
if not rule:
|
||||
raise HTTPException(status_code=404, detail="Trading rule not found")
|
||||
|
||||
return rule
|
||||
|
||||
|
||||
@router.post("", response_model=TradingRuleResponse)
|
||||
async def create_trading_rule(rule: TradingRuleCreate, db: AsyncSession = Depends(get_db)):
|
||||
"""새 트레이딩 규칙 생성"""
|
||||
db_rule = TradingRule(**rule.model_dump())
|
||||
db.add(db_rule)
|
||||
await db.commit()
|
||||
await db.refresh(db_rule)
|
||||
return db_rule
|
||||
|
||||
|
||||
@router.put("/{rule_id}", response_model=TradingRuleResponse)
|
||||
async def update_trading_rule(
|
||||
rule_id: int,
|
||||
rule: TradingRuleUpdate,
|
||||
db: AsyncSession = Depends(get_db)
|
||||
):
|
||||
"""트레이딩 규칙 수정"""
|
||||
result = await db.execute(select(TradingRule).where(TradingRule.id == rule_id))
|
||||
db_rule = result.scalar_one_or_none()
|
||||
|
||||
if not db_rule:
|
||||
raise HTTPException(status_code=404, detail="Trading rule not found")
|
||||
|
||||
update_data = rule.model_dump(exclude_unset=True)
|
||||
for field, value in update_data.items():
|
||||
setattr(db_rule, field, value)
|
||||
|
||||
db_rule.updated_at = datetime.utcnow()
|
||||
await db.commit()
|
||||
await db.refresh(db_rule)
|
||||
return db_rule
|
||||
|
||||
|
||||
@router.delete("/{rule_id}")
|
||||
async def delete_trading_rule(rule_id: int, db: AsyncSession = Depends(get_db)):
|
||||
"""트레이딩 규칙 삭제"""
|
||||
result = await db.execute(select(TradingRule).where(TradingRule.id == rule_id))
|
||||
db_rule = result.scalar_one_or_none()
|
||||
|
||||
if not db_rule:
|
||||
raise HTTPException(status_code=404, detail="Trading rule not found")
|
||||
|
||||
await db.delete(db_rule)
|
||||
await db.commit()
|
||||
return {"message": "Trading rule deleted successfully"}
|
||||
|
||||
|
||||
@router.post("/{rule_id}/toggle")
|
||||
async def toggle_trading_rule(rule_id: int, db: AsyncSession = Depends(get_db)):
|
||||
"""트레이딩 규칙 활성화/비활성화 토글"""
|
||||
result = await db.execute(select(TradingRule).where(TradingRule.id == rule_id))
|
||||
db_rule = result.scalar_one_or_none()
|
||||
|
||||
if not db_rule:
|
||||
raise HTTPException(status_code=404, detail="Trading rule not found")
|
||||
|
||||
db_rule.is_active = not db_rule.is_active
|
||||
db_rule.updated_at = datetime.utcnow()
|
||||
await db.commit()
|
||||
await db.refresh(db_rule)
|
||||
return db_rule
|
||||
Reference in New Issue
Block a user