| | """ |
| | Schema endpoint - Provides data catalog information to users. |
| | Shows available tables, columns, and data descriptions. |
| | """ |
| |
|
| | from fastapi import APIRouter |
| | from pydantic import BaseModel |
| | from typing import Optional, List, Any |
| | from backend.core.data_catalog import get_data_catalog |
| |
|
| | router = APIRouter() |
| |
|
| |
|
| | class ColumnInfo(BaseModel): |
| | name: str |
| | type: str |
| | description: Optional[str] = None |
| |
|
| |
|
| | class TableInfo(BaseModel): |
| | name: str |
| | description: str |
| | row_count: int |
| | columns: List[ColumnInfo] |
| |
|
| |
|
| | class SchemaResponse(BaseModel): |
| | tables: List[TableInfo] |
| | last_updated: str |
| | data_source: str |
| |
|
| |
|
| | @router.get("/", response_model=SchemaResponse) |
| | async def get_schema(): |
| | """ |
| | Returns the dynamic data catalog with all available tables and their schemas. |
| | """ |
| | catalog = get_data_catalog() |
| | tables = [] |
| | |
| | for table_name, meta in catalog.catalog.items(): |
| | |
| | |
| | cols = [] |
| | raw_cols = meta.get("columns", []) |
| | |
| | |
| | def guess_type(col_name): |
| | if col_name == "geom": return "geometry" |
| | if "id" in col_name: return "integer" |
| | if "name" in col_name: return "text" |
| | return "text" |
| | |
| | for col in raw_cols: |
| | cols.append(ColumnInfo( |
| | name=col, |
| | type=guess_type(col), |
| | description=None |
| | )) |
| | |
| | tables.append(TableInfo( |
| | name=table_name, |
| | description=meta.get("semantic_description") or meta.get("description", ""), |
| | row_count=meta.get("row_count") or 0, |
| | columns=cols |
| | )) |
| | |
| | return SchemaResponse( |
| | tables=tables, |
| | last_updated="Dynamic", |
| | data_source="GeoQuery Data Catalog (OSM, Overture, HDX, INEC)" |
| | ) |
| |
|
| |
|
| | @router.get("/tables") |
| | async def list_tables(): |
| | """ |
| | Returns a simple list of available table names. |
| | """ |
| | catalog = get_data_catalog() |
| | return { |
| | "tables": list(catalog.catalog.keys()), |
| | "count": len(catalog.catalog) |
| | } |
| |
|