Files
Krikorios b5e2b02cb8 Reorganize UI for external trading workflow with manual trade logging
- Restructure tabs to analysis-focused workflow:
  * Analysis Hub: AI analysis, risk management, manual trade logger
  * Daily Prep: Market summary, alerts, checklist, news, trading plan
  * Journal & Review: Trading journal, habit tracker, advanced analytics
  * Live Charts: Technical analysis with streaming charts

- Add ManualTradeLogger component for logging trades from MT5/TradingView/cTrader
- Remove execution-focused components (TradeControls, PortfolioTracker)
- Update XAU/USD price to realistic ,084.99
- Add indicator preferences and AI plan service
- Add comprehensive documentation on decision coverage and implementation
2025-11-16 07:50:00 +02:00

175 lines
5.3 KiB
Python

from __future__ import annotations
from fastapi import APIRouter, HTTPException, Depends, status
from typing import Any, Dict, List
from sqlalchemy.orm import Session
from app.services.settings import get_models, update_models, get_exchanges, update_exchanges
from app.db.database import get_db
from app.models.models import UserIndicatorPreferences
from app.schemas.schemas import (
IndicatorPreferenceCreate,
IndicatorPreferenceUpdate,
IndicatorPreferenceResponse,
IndicatorPreferencesListResponse
)
router = APIRouter(prefix="/settings", tags=["Settings"])
@router.get("/models")
async def models_get() -> Dict[str, Any]:
return get_models()
@router.put("/models")
async def models_put(patch: Dict[str, Any]) -> Dict[str, Any]:
return update_models(patch)
@router.get("/exchanges")
async def exchanges_get() -> Dict[str, Any]:
return get_exchanges()
@router.put("/exchanges")
async def exchanges_put(patch: Dict[str, Any]) -> Dict[str, Any]:
return update_exchanges(patch)
# ============================================================================
# INDICATOR PREFERENCES ENDPOINTS
# ============================================================================
@router.get("/indicators/preferences", response_model=IndicatorPreferencesListResponse)
async def get_indicator_preferences(
user_id: str = None,
enabled_only: bool = False,
db: Session = Depends(get_db)
):
"""Get user's indicator preferences"""
query = db.query(UserIndicatorPreferences)
if user_id:
query = query.filter(UserIndicatorPreferences.user_id == user_id)
if enabled_only:
query = query.filter(UserIndicatorPreferences.enabled == True)
preferences = query.order_by(UserIndicatorPreferences.priority.desc()).all()
return {
"preferences": preferences,
"total": len(preferences)
}
@router.post("/indicators/preferences", response_model=IndicatorPreferenceResponse, status_code=status.HTTP_201_CREATED)
async def create_indicator_preference(
preference: IndicatorPreferenceCreate,
user_id: str = None,
db: Session = Depends(get_db)
):
"""Create a new indicator preference"""
# Check if indicator already exists for this user
existing = db.query(UserIndicatorPreferences).filter(
UserIndicatorPreferences.user_id == user_id,
UserIndicatorPreferences.indicator_name == preference.indicator_name
).first()
if existing:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail=f"Preference for indicator '{preference.indicator_name}' already exists"
)
db_preference = UserIndicatorPreferences(
user_id=user_id,
**preference.dict()
)
db.add(db_preference)
db.commit()
db.refresh(db_preference)
return db_preference
@router.put("/indicators/preferences/{preference_id}", response_model=IndicatorPreferenceResponse)
async def update_indicator_preference(
preference_id: int,
preference_update: IndicatorPreferenceUpdate,
db: Session = Depends(get_db)
):
"""Update an indicator preference"""
db_preference = db.query(UserIndicatorPreferences).filter(
UserIndicatorPreferences.id == preference_id
).first()
if not db_preference:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Indicator preference not found"
)
update_data = preference_update.dict(exclude_unset=True)
for key, value in update_data.items():
setattr(db_preference, key, value)
db.commit()
db.refresh(db_preference)
return db_preference
@router.delete("/indicators/preferences/{preference_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_indicator_preference(
preference_id: int,
db: Session = Depends(get_db)
):
"""Delete an indicator preference"""
db_preference = db.query(UserIndicatorPreferences).filter(
UserIndicatorPreferences.id == preference_id
).first()
if not db_preference:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Indicator preference not found"
)
db.delete(db_preference)
db.commit()
@router.post("/indicators/preferences/bulk", response_model=IndicatorPreferencesListResponse)
async def create_bulk_indicator_preferences(
preferences: List[IndicatorPreferenceCreate],
user_id: str = None,
db: Session = Depends(get_db)
):
"""Create multiple indicator preferences at once"""
created_preferences = []
for pref in preferences:
# Skip if already exists
existing = db.query(UserIndicatorPreferences).filter(
UserIndicatorPreferences.user_id == user_id,
UserIndicatorPreferences.indicator_name == pref.indicator_name
).first()
if not existing:
db_preference = UserIndicatorPreferences(
user_id=user_id,
**pref.dict()
)
db.add(db_preference)
created_preferences.append(db_preference)
db.commit()
# Refresh all created preferences
for pref in created_preferences:
db.refresh(pref)
return {
"preferences": created_preferences,
"total": len(created_preferences)
}