| from fastapi import APIRouter, Depends, HTTPException |
| from sqlalchemy.orm import Session |
| from sqlalchemy import func |
| from app.database import get_db |
| from app.models.tender import TenderModel |
| from app.models.oc import OCModel |
| from app.models.analysis import AnalysisHistoryModel |
| from app.services.sync import sync_tenders_to_db, sync_purchase_orders_to_db |
| from datetime import datetime |
|
|
| router = APIRouter() |
|
|
| @router.get("/admin/db-stats") |
| def get_detailed_stats(db: Session = Depends(get_db)): |
| try: |
| tenders_count = db.query(TenderModel).count() |
| ocs_count = db.query(OCModel).count() |
| analysis_count = db.query(AnalysisHistoryModel).count() |
| |
| |
| top_buyers = db.query( |
| TenderModel.buyer, |
| func.count(TenderModel.code).label("count") |
| ).group_by(TenderModel.buyer).order_by(func.count(TenderModel.code).desc()).limit(5).all() |
| |
| top_buyers_list = [{"name": b[0], "count": b[1]} for b in top_buyers] |
| |
| |
| last_tender = db.query(func.max(TenderModel.last_updated)).scalar() |
| |
| return { |
| "total_records": tenders_count, |
| "total_ocs": ocs_count, |
| "total_analysis": analysis_count, |
| "top_buyers": top_buyers_list, |
| "last_sync": last_tender.isoformat() if last_tender else None, |
| "status": "Healthy" |
| } |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
| @router.delete("/admin/db-clear") |
| def clear_database(db: Session = Depends(get_db)): |
| try: |
| num_tenders = db.query(TenderModel).delete() |
| num_ocs = db.query(OCModel).delete() |
| db.commit() |
| return { |
| "message": "Database cleared successfully", |
| "deleted": { |
| "tenders": num_tenders, |
| "purchase_orders": num_ocs |
| } |
| } |
| except Exception as e: |
| db.rollback() |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|
| @router.post("/admin/sync-all") |
| async def sync_all_data(db: Session = Depends(get_db)): |
| try: |
| tender_results = await sync_tenders_to_db(db) |
| oc_results = await sync_purchase_orders_to_db(db) |
| return { |
| "tenders": tender_results, |
| "purchase_orders": oc_results, |
| "timestamp": datetime.utcnow().isoformat() |
| } |
| except Exception as e: |
| raise HTTPException(status_code=500, detail=str(e)) |
|
|