Skip to content

Commit f5e7bfa

Browse files
committed
refactored route to use dev/convert/field-site and required paramters in & out
1 parent cfef5c1 commit f5e7bfa

File tree

2 files changed

+33
-12
lines changed

2 files changed

+33
-12
lines changed

services/api-v3/api/routes/dev.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
from fastapi import APIRouter
2-
from api.routes.dev_routes.interchange_data import interchange_router
2+
from api.routes.dev_routes.convert import convert_router
33

44
dev_router = APIRouter(prefix="/dev", tags=["dev"])
5-
dev_router.include_router(interchange_router)
5+
dev_router.include_router(convert_router)

services/api-v3/api/routes/dev_routes/interchange_data.py renamed to services/api-v3/api/routes/dev_routes/convert.py

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from fastapi import Request, Body
1+
from fastapi import Request, Body, Query
22
from typing import Any, Iterable, Union, List
33
import httpx
44
import dotenv
@@ -21,9 +21,9 @@
2121
from api.models.field_site import FieldSite, Location, Photo, PlanarOrientation, Observation, BeddingFacing
2222
from typing import Optional
2323

24-
interchange_router = APIRouter(
25-
prefix="/interchange-data",
26-
tags=["interchange-data"],
24+
convert_router = APIRouter(
25+
prefix="/convert",
26+
tags=["convert"],
2727
responses={404: {"description": "Not found"}},
2828
)
2929

@@ -154,11 +154,10 @@ def spot_to_fieldsite(feat) -> FieldSite:
154154
observations=observations,
155155
)
156156

157-
@interchange_router.post("/spot-to-fieldsite")
158157
def multiple_spot_to_fieldsite(feat: Union[dict, List[dict]] = Body(...)) -> List[FieldSite]:
159158
"""
160159
Accept a single FeatureCollection or a list of FeatureCollections and
161-
return a FieldSite for each qualifying Point feature (non-image-basemap).
160+
return a FieldSite for each qualifying Point feature.
162161
"""
163162
out: list[FieldSite] = []
164163

@@ -203,25 +202,47 @@ def fieldsite_to_checkin(fs: FieldSite) -> dict:
203202
return d
204203

205204

206-
@interchange_router.post("/fieldsite-to-checkin")
207205
def multiple_fieldsite_to_checkin(fieldsites: list[FieldSite] = Body(...)) -> list[dict]:
208206
out: list[dict] = []
209207
for fs in fieldsites:
210208
try:
209+
if not isinstance(fs, FieldSite):
210+
fs = FieldSite(**fs)
211211
out.append(fieldsite_to_checkin(fs))
212212
except Exception:
213213
continue
214214
return out
215215

216-
@interchange_router.post("/spot-to-checkin")
217-
async def spot_to_checkin(request: Request, spot: Union[dict, List[dict]] = Body(...)) -> list[dict]:
216+
def spot_to_checkin(spot: Union[dict, List[dict]] = Body(...)) -> list[dict]:
218217
"""Pipeline: Spot JSON (FeatureCollection[s]) or FieldSite list -> Checkin list."""
219218
# If it's already a list of FieldSite-like dicts (has 'location'), skip the first hop
220219
if isinstance(spot, list) and spot and isinstance(spot[0], dict) and "location" in spot[0]:
221220
fieldsites: List[FieldSite] = spot # already FieldSite-shaped
222221
else:
223222
# Convert FeatureCollection (or list of them) -> FieldSite list
224223
fieldsites = multiple_spot_to_fieldsite(spot)
225-
226224
# Convert FieldSite list -> Checkin list
227225
return multiple_fieldsite_to_checkin(fieldsites)
226+
227+
228+
229+
@convert_router.post("/field-site")
230+
async def convert_field_site(
231+
payload: Union[dict, List[dict]] = Body(...),
232+
in_: str = Query(..., alias="in"),
233+
out: str = Query(..., alias="out"),
234+
) -> Any:
235+
"""
236+
Unified converter:
237+
- ?in=spot&out=fieldsite -> spot FeatureCollection(s) -> FieldSite
238+
- ?in=fieldsite&out=checkin -> FieldSite -> Checkin
239+
- ?in=spot&out=checkin -> spot FeatureCollection(s) -> FieldSite -> Checkin
240+
"""
241+
key = (in_.lower(), out.lower())
242+
if key == ("spot", "fieldsite"):
243+
return multiple_spot_to_fieldsite(payload)
244+
if key == ("fieldsite", "checkin"):
245+
return multiple_fieldsite_to_checkin(payload)
246+
if key == ("spot", "checkin"):
247+
return spot_to_checkin(payload)
248+
raise HTTPException(status_code=400, detail="Unsupported conversion. Use in=[spot|fieldsite], out=[fieldsite|checkin].")

0 commit comments

Comments
 (0)