diff --git a/src/c3nav/routing/newapi/positioning.py b/src/c3nav/routing/newapi/positioning.py index c8176372..9c61b816 100644 --- a/src/c3nav/routing/newapi/positioning.py +++ b/src/c3nav/routing/newapi/positioning.py @@ -1,36 +1,51 @@ -from typing import Annotated +from typing import Annotated, Optional from ninja import Field as APIField -from ninja import Router as APIRouter +from ninja import Router as APIRouter, Schema +from pydantic import NegativeInt from c3nav.api.newauth import auth_responses +from c3nav.api.utils import NonEmptyStr from c3nav.mapdata.models import Source +from c3nav.mapdata.schemas.models import CustomLocationSchema from c3nav.mapdata.schemas.responses import BoundsSchema from c3nav.routing.rangelocator import RangeLocator +BSSIDSchema = Annotated[str, APIField(pattern=r"^[a-z0-9]{2}(:[a-z0-9]{2}){5}$", title="BSSID")] + positioning_api_router = APIRouter(tags=["positioning"]) +class LocateRequestItemSchema(Schema): + ssid: NonEmptyStr + bssid: BSSIDSchema + rssi: NegativeInt + distance: Optional[float] = None + + +class LocateRequestSchema(Schema): + items: list[LocateRequestItemSchema] + + +class PositioningResult(Schema): + location: Optional[CustomLocationSchema] + + @positioning_api_router.post('/locate/', summary="locate based on wifi scans", - response={200: BoundsSchema, **auth_responses}) -def locate(): + response={200: PositioningResult, **auth_responses}) +def locate(locate_data: LocateRequestSchema): # todo: implement - return { - "bounds": Source.max_bounds(), - } + raise NotImplementedError @positioning_api_router.get('/locate-test/', summary="get dummy location for debugging", - response={200: BoundsSchema, **auth_responses}) + response={200: PositioningResult, **auth_responses}) def locate_test(): - # todo: implement - return { - "bounds": Source.max_bounds(), - } + raise NotImplementedError BeaconsXYZ = dict[ - Annotated[str, APIField(pattern=r"^[a-z0-9]{2}(:[a-z0-9]{2}){5}$", title="BSSID")], + BSSIDSchema, Annotated[ tuple[ Annotated[int, APIField(title="X (in cm)")],