Implement map api (ex. /v2/map/init-data)

Migrate registry.primary_groups to pydantic model
This commit is contained in:
phil 2024-01-11 12:55:42 +05:30
parent e43c88d0ab
commit 7e9e266157
6 changed files with 116 additions and 36 deletions

62
src/gisaf/api/map.py Normal file
View 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')
)

View file

@ -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')