Initial commit: Waste Collection API
This commit is contained in:
65
app/routes/sources.py
Normal file
65
app/routes/sources.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import json
|
||||
from pathlib import Path
|
||||
|
||||
from fastapi import APIRouter, HTTPException
|
||||
from fastapi.responses import FileResponse
|
||||
|
||||
from ..schemas import (
|
||||
SourceListResponse,
|
||||
SourceDetailResponse,
|
||||
SourceParam,
|
||||
)
|
||||
from ..core.scheduler import SOURCE_DEFS
|
||||
|
||||
router = APIRouter(prefix="/sources", tags=["sources"])
|
||||
|
||||
SOURCES_JSON = (
|
||||
Path(__file__).resolve().parent.parent.parent.parent
|
||||
/ "waste_lib"
|
||||
/ "custom_components"
|
||||
/ "waste_collection_schedule"
|
||||
/ "sources.json"
|
||||
)
|
||||
|
||||
|
||||
@router.get("", response_model=SourceListResponse)
|
||||
def list_sources():
|
||||
return SourceListResponse(
|
||||
count=len(SOURCE_DEFS),
|
||||
sources=[{"id": k, "name": v["name"]} for k, v in SOURCE_DEFS.items()],
|
||||
)
|
||||
|
||||
|
||||
@router.get("/germany")
|
||||
def list_germany_sources():
|
||||
"""
|
||||
Return all 727 German municipalities from sources.json.
|
||||
Includes title, module type, and default_params (if any).
|
||||
"""
|
||||
with open(SOURCES_JSON) as f:
|
||||
data = json.load(f)
|
||||
return {"country": "Germany", "count": len(data["Germany"]), "sources": data["Germany"]}
|
||||
|
||||
|
||||
@router.get("/germany/search")
|
||||
def search_germany_sources(q: str):
|
||||
"""
|
||||
Search Germany municipalities by name (case-insensitive).
|
||||
"""
|
||||
with open(SOURCES_JSON) as f:
|
||||
data = json.load(f)
|
||||
q = q.lower()
|
||||
results = [s for s in data["Germany"] if q in s["title"].lower()]
|
||||
return {"query": q, "count": len(results), "sources": results[:20]}
|
||||
|
||||
|
||||
@router.get("/{source_id}", response_model=SourceDetailResponse)
|
||||
def get_source(source_id: str):
|
||||
if source_id not in SOURCE_DEFS:
|
||||
raise HTTPException(status_code=404, detail=f"Source '{source_id}' not found")
|
||||
s = SOURCE_DEFS[source_id]
|
||||
return SourceDetailResponse(
|
||||
id=source_id,
|
||||
name=s["name"],
|
||||
params=[SourceParam(**p) for p in s["params"]],
|
||||
)
|
||||
Reference in New Issue
Block a user