from typing import Any, Dict, List, Optional from datetime import datetime, timedelta from fastapi import APIRouter, Depends, HTTPException, Query from sqlalchemy.orm import Session from app import crud from app.api import deps from app.services.worker import worker router = APIRouter() @router.get("/", response_model=Dict[str, Any]) def read_stats( db: Session = Depends(deps.get_db), ) -> Any: """ Get overall analytics statistics. """ # Blocks stats block_count = crud.block.get_count(db) latest_blocks = crud.block.get_latest_blocks(db, limit=1) latest_block_height = latest_blocks[0].block_height if latest_blocks else 0 # Last 24 hours block count now = datetime.utcnow() yesterday = now - timedelta(days=1) blocks_24h = crud.block.get_block_count_by_time_range( db, start_time=yesterday, end_time=now ) # Transactions stats tx_count = crud.transaction.get_count(db) # DEX stats dex_count = crud.dex.get_count(db) # Pool stats pool_count = crud.pool.get_count(db) # Get arbitrage stats arbitrage_stats = crud.arbitrage.get_arbitrage_stats(db) return { "block_stats": { "total_blocks": block_count, "latest_block_height": latest_block_height, "blocks_last_24h": blocks_24h }, "transaction_stats": { "total_transactions": tx_count }, "dex_stats": { "total_dexes": dex_count }, "pool_stats": { "total_pools": pool_count }, "arbitrage_stats": arbitrage_stats } @router.post("/worker/start-fetcher", status_code=200) def start_blockchain_fetcher() -> Dict[str, Any]: """ Start the blockchain fetcher background worker. """ success = worker.start_fetcher() return { "success": success, "message": "Blockchain fetcher started" if success else "Blockchain fetcher already running" } @router.post("/worker/start-detector", status_code=200) def start_arbitrage_detector() -> Dict[str, Any]: """ Start the arbitrage detector background worker. """ success = worker.start_detector() return { "success": success, "message": "Arbitrage detector started" if success else "Arbitrage detector already running" } @router.post("/worker/stop", status_code=200) def stop_workers() -> Dict[str, Any]: """ Stop all background workers. """ success = worker.stop() return { "success": success, "message": "All workers stopped" if success else "No workers were running" }