feat: Data Management tab — purge endpoints for all major data stores
Backend — new DELETE /purge-all endpoints:
- /api/logs/purge-all → truncate system_logs (immediate, no 30d wait)
- /api/reports/purge-all → cycle_reports + ai_reports
- /api/portfolio/purge-all → portfolio + trade_entry_prices
- /api/analytics/purge-all → pattern_score_history, regime_clusters,
pattern_embeddings, cycle_runs,
macro_regime_history, geo_alert_history
- /api/var/purge-all → var_snapshots + pnl_snapshots
- /api/pattern-lab/purge-all → backtest_lab_runs
Frontend — Config.tsx: new 'Data Management' tab
- PurgeButton component with inline double-confirm (click Purge → confirm)
- Shows table names affected + row count deleted
- 6 purge actions: Logs, AI Reports, Portfolio, Analytics, VaR, Pattern Lab
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -100,3 +100,20 @@ def trigger_regime_detect(n_clusters: int = Query(default=4, ge=2, le=6)):
|
||||
def pattern_embeddings_summary():
|
||||
"""Liste des patterns avec embedding vectoriel disponible."""
|
||||
return {"embeddings": get_all_pattern_embeddings_summary()}
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_analytics():
|
||||
"""Purge all analytics history: score history, regime clusters, embeddings, cycle runs."""
|
||||
from services.database import get_conn
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM pattern_score_history")
|
||||
conn.execute("DELETE FROM regime_clusters")
|
||||
conn.execute("DELETE FROM pattern_embeddings")
|
||||
conn.execute("DELETE FROM cycle_runs")
|
||||
conn.execute("DELETE FROM macro_regime_history")
|
||||
conn.execute("DELETE FROM geo_alert_history")
|
||||
n = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": n}
|
||||
|
||||
@@ -73,3 +73,15 @@ def clear_old_logs(older_than_days: int = 30):
|
||||
from services.database import clear_system_logs
|
||||
deleted = clear_system_logs(older_than_days)
|
||||
return {"deleted": deleted, "older_than_days": older_than_days}
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_logs():
|
||||
"""Truncate the entire system_logs table."""
|
||||
from services.database import get_conn
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM system_logs")
|
||||
deleted = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": deleted}
|
||||
|
||||
@@ -164,6 +164,17 @@ def get_run(run_id: str):
|
||||
return _row_to_dict(_get_run(run_id))
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_runs():
|
||||
"""Delete all Pattern Lab runs."""
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM backtest_lab_runs")
|
||||
n = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": n}
|
||||
|
||||
|
||||
@router.delete("/runs/{run_id}")
|
||||
def delete_run(run_id: str):
|
||||
conn = get_conn()
|
||||
|
||||
@@ -261,6 +261,19 @@ def close_pos(pos_id: str, req: ClosePositionRequest):
|
||||
return close_position(pos_id, req.close_value)
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_positions():
|
||||
"""Delete ALL portfolio positions (open + closed) and related trade entry prices."""
|
||||
from services.database import get_conn
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM portfolio")
|
||||
conn.execute("DELETE FROM trade_entry_prices")
|
||||
n = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": n}
|
||||
|
||||
|
||||
@router.delete("/{pos_id}")
|
||||
def delete_pos(pos_id: str):
|
||||
from services.database import get_conn
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from services.database import (
|
||||
get_cycle_reports, get_cycle_report, get_latest_cycle_report,
|
||||
get_trade_assessments, get_latest_trade_assessments,
|
||||
get_trade_assessments, get_latest_trade_assessments, get_conn,
|
||||
)
|
||||
|
||||
router = APIRouter(prefix="/api/reports", tags=["reports"])
|
||||
@@ -38,3 +38,15 @@ def assessments_latest(limit: int = 20):
|
||||
def assessments_by_run(run_id: str):
|
||||
"""Options technical assessments for a specific cycle run."""
|
||||
return {"assessments": get_trade_assessments(run_id)}
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_reports():
|
||||
"""Delete all AI cycle reports and trade assessments."""
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM cycle_reports")
|
||||
conn.execute("DELETE FROM ai_reports")
|
||||
n = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": n}
|
||||
|
||||
@@ -109,6 +109,19 @@ class SchedulerConfig(BaseModel):
|
||||
pnl_hours: float | None = None
|
||||
|
||||
|
||||
@router.delete("/purge-all")
|
||||
def purge_all_var():
|
||||
"""Delete all VaR snapshots and PnL snapshots."""
|
||||
from services.database import get_conn
|
||||
conn = get_conn()
|
||||
conn.execute("DELETE FROM var_snapshots")
|
||||
conn.execute("DELETE FROM pnl_snapshots")
|
||||
n = conn.total_changes
|
||||
conn.commit()
|
||||
conn.close()
|
||||
return {"deleted": n}
|
||||
|
||||
|
||||
@router.post("/scheduler/config")
|
||||
def scheduler_config(cfg: SchedulerConfig):
|
||||
if cfg.var_enabled is not None:
|
||||
|
||||
Reference in New Issue
Block a user