summaryrefslogtreecommitdiff
path: root/services/api/src
diff options
context:
space:
mode:
Diffstat (limited to 'services/api/src')
-rw-r--r--services/api/src/trading_api/routers/orders.py11
-rw-r--r--services/api/src/trading_api/routers/portfolio.py11
-rw-r--r--services/api/src/trading_api/routers/strategies.py5
3 files changed, 22 insertions, 5 deletions
diff --git a/services/api/src/trading_api/routers/orders.py b/services/api/src/trading_api/routers/orders.py
index c69dc10..a29ae2f 100644
--- a/services/api/src/trading_api/routers/orders.py
+++ b/services/api/src/trading_api/routers/orders.py
@@ -5,6 +5,7 @@ import logging
from fastapi import APIRouter, HTTPException, Request
from shared.sa_models import OrderRow, SignalRow
from sqlalchemy import select
+from sqlalchemy.exc import OperationalError
logger = logging.getLogger(__name__)
@@ -35,8 +36,11 @@ async def get_orders(request: Request, limit: int = 50):
}
for r in rows
]
+ except OperationalError as exc:
+ logger.error("Database error fetching orders: %s", exc)
+ raise HTTPException(status_code=503, detail="Database unavailable")
except Exception as exc:
- logger.error("Failed to get orders: %s", exc)
+ logger.error("Failed to get orders: %s", exc, exc_info=True)
raise HTTPException(status_code=500, detail="Failed to retrieve orders")
@@ -62,6 +66,9 @@ async def get_signals(request: Request, limit: int = 50):
}
for r in rows
]
+ except OperationalError as exc:
+ logger.error("Database error fetching signals: %s", exc)
+ raise HTTPException(status_code=503, detail="Database unavailable")
except Exception as exc:
- logger.error("Failed to get signals: %s", exc)
+ logger.error("Failed to get signals: %s", exc, exc_info=True)
raise HTTPException(status_code=500, detail="Failed to retrieve signals")
diff --git a/services/api/src/trading_api/routers/portfolio.py b/services/api/src/trading_api/routers/portfolio.py
index d76d85d..3907a86 100644
--- a/services/api/src/trading_api/routers/portfolio.py
+++ b/services/api/src/trading_api/routers/portfolio.py
@@ -5,6 +5,7 @@ import logging
from fastapi import APIRouter, HTTPException, Request
from shared.sa_models import PositionRow
from sqlalchemy import select
+from sqlalchemy.exc import OperationalError
logger = logging.getLogger(__name__)
@@ -29,8 +30,11 @@ async def get_positions(request: Request):
}
for r in rows
]
+ except OperationalError as exc:
+ logger.error("Database error fetching positions: %s", exc)
+ raise HTTPException(status_code=503, detail="Database unavailable")
except Exception as exc:
- logger.error("Failed to get positions: %s", exc)
+ logger.error("Failed to get positions: %s", exc, exc_info=True)
raise HTTPException(status_code=500, detail="Failed to retrieve positions")
@@ -49,6 +53,9 @@ async def get_snapshots(request: Request, days: int = 30):
}
for s in snapshots
]
+ except OperationalError as exc:
+ logger.error("Database error fetching snapshots: %s", exc)
+ raise HTTPException(status_code=503, detail="Database unavailable")
except Exception as exc:
- logger.error("Failed to get snapshots: %s", exc)
+ logger.error("Failed to get snapshots: %s", exc, exc_info=True)
raise HTTPException(status_code=500, detail="Failed to retrieve snapshots")
diff --git a/services/api/src/trading_api/routers/strategies.py b/services/api/src/trading_api/routers/strategies.py
index 7ddd54e..5db7320 100644
--- a/services/api/src/trading_api/routers/strategies.py
+++ b/services/api/src/trading_api/routers/strategies.py
@@ -42,6 +42,9 @@ async def list_strategies():
}
for s in strategies
]
+ except (ImportError, FileNotFoundError) as exc:
+ logger.error("Strategy loading error: %s", exc)
+ raise HTTPException(status_code=503, detail="Strategy engine unavailable")
except Exception as exc:
- logger.error("Failed to list strategies: %s", exc)
+ logger.error("Failed to list strategies: %s", exc, exc_info=True)
raise HTTPException(status_code=500, detail="Failed to list strategies")