|
1 | 1 | from fastapi import APIRouter, Depends, HTTPException, Query |
2 | 2 | from sqlalchemy.orm import Session |
| 3 | +from sqlalchemy import desc |
3 | 4 | from typing import List, Optional |
| 5 | +from datetime import datetime, timezone |
4 | 6 | from ..core.database import get_db |
5 | 7 | from ..services.event_service import EventService |
6 | 8 | from ..services.announcement_service import AnnouncementService |
|
10 | 12 | from ..schemas.announcement import AnnouncementResponse, AnnouncementListResponse |
11 | 13 | from ..schemas.suggestion import SuggestionCreate, SuggestionResponse |
12 | 14 | from ..schemas.event_request import EventRequestCreate, EventRequestResponse |
| 15 | +from ..models.scraper_log import ScraperLog |
| 16 | +from ..models.event import Event |
13 | 17 |
|
14 | 18 | router = APIRouter() |
15 | 19 |
|
@@ -86,6 +90,45 @@ async def get_event(event_id: int, db: Session = Depends(get_db)): |
86 | 90 | return event |
87 | 91 |
|
88 | 92 |
|
| 93 | +@router.get("/status") |
| 94 | +async def get_status(db: Session = Depends(get_db)): |
| 95 | + """Platform sağlık durumu — scraper kayıtları, aktif etkinlik sayısı.""" |
| 96 | + try: |
| 97 | + active_count = db.query(Event).filter(Event.is_active == True).count() |
| 98 | + total_count = db.query(Event).count() |
| 99 | + |
| 100 | + sources = db.query(ScraperLog.source).distinct().all() |
| 101 | + scrapers = [] |
| 102 | + for (source,) in sources: |
| 103 | + latest: Optional[ScraperLog] = ( |
| 104 | + db.query(ScraperLog) |
| 105 | + .filter(ScraperLog.source == source) |
| 106 | + .order_by(desc(ScraperLog.created_at)) |
| 107 | + .first() |
| 108 | + ) |
| 109 | + if latest: |
| 110 | + scrapers.append({ |
| 111 | + "source": latest.source, |
| 112 | + "status": latest.status, |
| 113 | + "events_found": latest.events_found, |
| 114 | + "new_events": latest.new_events, |
| 115 | + "duration_seconds": round(latest.duration_seconds or 0, 1), |
| 116 | + "last_run": latest.created_at.isoformat() if latest.created_at else None, |
| 117 | + "error": (latest.error_message[:120] if latest.error_message else None), |
| 118 | + }) |
| 119 | + |
| 120 | + scrapers.sort(key=lambda s: s["last_run"] or "", reverse=True) |
| 121 | + |
| 122 | + return { |
| 123 | + "active_events": active_count, |
| 124 | + "total_events": total_count, |
| 125 | + "scrapers": scrapers, |
| 126 | + "generated_at": datetime.now(timezone.utc).isoformat(), |
| 127 | + } |
| 128 | + except Exception as e: |
| 129 | + raise HTTPException(status_code=500, detail=f"Status check failed: {str(e)}") |
| 130 | + |
| 131 | + |
89 | 132 | @router.post("/suggestions", response_model=SuggestionResponse) |
90 | 133 | async def submit_suggestion( |
91 | 134 | suggestion: SuggestionCreate, db: Session = Depends(get_db) |
|
0 commit comments