Globe-Ingest: Neuer Endpoint POST /api/public/globe-ingest
Nimmt externe Ereignisse (EONET, USGS) als Artikel in eine Lage auf. Duplikat-Check per Headline. Locations direkt mit Koordinaten.
Dieser Commit ist enthalten in:
@@ -162,6 +162,73 @@ async def get_lagebild(db=Depends(db_dependency)):
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@router.post("/globe-ingest", dependencies=[Depends(verify_api_key)])
|
||||
async def globe_ingest(
|
||||
request: Request,
|
||||
db=Depends(db_dependency),
|
||||
):
|
||||
"""Nimmt externe Ereignisse (EONET, USGS) als Artikel in eine Lage auf."""
|
||||
import json as _json
|
||||
body = await request.json()
|
||||
incident_id = body.get("incident_id")
|
||||
events = body.get("events", [])
|
||||
|
||||
if not incident_id or not events:
|
||||
raise HTTPException(status_code=400, detail="incident_id und events erforderlich")
|
||||
|
||||
# Pruefen ob Lage existiert
|
||||
cursor = await db.execute("SELECT id FROM incidents WHERE id = ?", (incident_id,))
|
||||
if not await cursor.fetchone():
|
||||
raise HTTPException(status_code=404, detail="Lage nicht gefunden")
|
||||
|
||||
inserted = 0
|
||||
for evt in events[:50]: # Max 50 pro Call
|
||||
headline = evt.get("title", "")[:500]
|
||||
if not headline:
|
||||
continue
|
||||
|
||||
# Duplikat-Check per Headline + Lage
|
||||
cursor = await db.execute(
|
||||
"SELECT id FROM articles WHERE incident_id = ? AND headline = ? LIMIT 1",
|
||||
(incident_id, headline),
|
||||
)
|
||||
if await cursor.fetchone():
|
||||
continue
|
||||
|
||||
source = evt.get("source", "Globe GEOINT")
|
||||
source_url = evt.get("url", "")
|
||||
content = evt.get("description", "")
|
||||
lat = evt.get("lat")
|
||||
lon = evt.get("lon")
|
||||
category = evt.get("category", "primary")
|
||||
|
||||
await db.execute(
|
||||
"""INSERT INTO articles (incident_id, headline, headline_de, source, source_url,
|
||||
content_original, language, collected_at, verification_status)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 'de', datetime('now'), 'pending')""",
|
||||
(incident_id, headline, headline, source, source_url, content),
|
||||
)
|
||||
article_id = (await db.execute("SELECT last_insert_rowid()")).fetchone()
|
||||
article_id = (await article_id)[0] if article_id else None
|
||||
|
||||
# Location direkt einfuegen wenn Koordinaten vorhanden
|
||||
if article_id and lat and lon:
|
||||
await db.execute(
|
||||
"""INSERT INTO article_locations
|
||||
(article_id, incident_id, location_name, location_name_normalized,
|
||||
latitude, longitude, confidence, category)
|
||||
VALUES (?, ?, ?, ?, ?, ?, 0.9, ?)""",
|
||||
(article_id, incident_id, evt.get("location", headline[:50]),
|
||||
evt.get("location", headline[:50]).lower(), lat, lon, category),
|
||||
)
|
||||
|
||||
inserted += 1
|
||||
|
||||
await db.commit()
|
||||
return {"ok": True, "inserted": inserted, "total_sent": len(events)}
|
||||
|
||||
@router.get("/globe-feed", dependencies=[Depends(verify_api_key)])
|
||||
async def get_globe_feed(
|
||||
incident_id: int = None,
|
||||
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren