Implement map api (ex. /v2/map/init-data)
Migrate registry.primary_groups to pydantic model
This commit is contained in:
parent
e43c88d0ab
commit
7e9e266157
6 changed files with 116 additions and 36 deletions
62
src/gisaf/api/map.py
Normal file
62
src/gisaf/api/map.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
from collections import OrderedDict, defaultdict
|
||||
import logging
|
||||
from pathlib import Path
|
||||
from fastapi import Depends, FastAPI, HTTPException, status, responses
|
||||
from sqlalchemy.orm import selectinload
|
||||
from sqlmodel import select
|
||||
|
||||
from gisaf.config import conf
|
||||
from gisaf.models.map_bases import BaseMap, BaseMapLayer, BaseStyle, MapInitData
|
||||
from gisaf.registry import registry
|
||||
from gisaf.database import db_session
|
||||
from gisaf.models.authentication import User
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
api = FastAPI(
|
||||
default_response_class=responses.ORJSONResponse,
|
||||
)
|
||||
|
||||
async def get_base_styles():
|
||||
async with db_session() as session:
|
||||
query = select(BaseStyle.name)\
|
||||
.where(BaseStyle.enabled==True)\
|
||||
.order_by(BaseStyle.id)
|
||||
data = await session.exec(query)
|
||||
base_styles = data.all()
|
||||
## TODO: tiles_registry
|
||||
logger.warning('TODO: tiles_registry')
|
||||
# base_styles.extend(tiles_registry.mbtiles.values())
|
||||
return [BaseStyle(name=bs) for bs in base_styles]
|
||||
|
||||
async def get_base_maps() -> list[BaseMap]:
|
||||
async with db_session() as session:
|
||||
query1 = select(BaseMap).options(selectinload(BaseMap.layers))
|
||||
data1 = await session.exec(query1)
|
||||
base_maps = data1.all()
|
||||
return base_maps
|
||||
base_map_dict = {bm.id: bm.name for bm in base_maps}
|
||||
query2 = select(BaseMapLayer).options(selectinload(BaseMapLayer.base_map))
|
||||
data2 = await session.exec(query2)
|
||||
base_map_layers = data2.all()
|
||||
bms = defaultdict(list)
|
||||
for bml in base_map_layers:
|
||||
breakpoint()
|
||||
if bml.store:
|
||||
bms[base_map_dict[bml.base_map_id]].append(name=bml.store)
|
||||
return [
|
||||
BaseMap(name=bm, stores=bmls)
|
||||
for bm, bmls in OrderedDict(sorted(bms.items())).items()
|
||||
]
|
||||
|
||||
@api.get('/init-data')
|
||||
async def get_init_data() -> MapInitData:
|
||||
await registry.update_stores_counts()
|
||||
df = registry.stores.reset_index().\
|
||||
drop(columns=['model', 'raw_model', 'base_gis_type'])
|
||||
return MapInitData(
|
||||
baseStyles=await get_base_styles(),
|
||||
baseMaps=await get_base_maps(),
|
||||
groups=registry.primary_groups,
|
||||
stores=df.to_dict(orient='records')
|
||||
)
|
|
@ -29,6 +29,7 @@ from gisaf.models.to_migrate import (
|
|||
)
|
||||
from gisaf.live_utils import get_live_feature_info
|
||||
from gisaf.api.dashboard import api as dashboard_api
|
||||
from gisaf.api.map import api as map_api
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
@ -38,6 +39,7 @@ api = FastAPI(
|
|||
)
|
||||
#api.add_middleware(SessionMiddleware, secret_key=conf.crypto.secret)
|
||||
api.mount('/dashboard', dashboard_api)
|
||||
api.mount('/map', map_api)
|
||||
|
||||
|
||||
@api.get('/bootstrap')
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue