Tighten location request validation

This commit is contained in:
2026-04-19 23:18:20 +02:00
parent 1a2f9c75d9
commit d0dc8e893a
5 changed files with 132 additions and 15 deletions
+11 -4
View File
@@ -1,4 +1,5 @@
import json
import logging
from fastapi import APIRouter, Depends, Request
from fastapi.responses import PlainTextResponse, Response
@@ -10,6 +11,8 @@ from app.schemas.location import LocationRecordRequest
from app.services.location import record_location
router = APIRouter(tags=["location"])
logger = logging.getLogger(__name__)
BAD_REQUEST_MESSAGE = "bad request"
@router.post("/location/record")
@@ -18,11 +21,15 @@ async def create_location_record(request: Request, db: Session = Depends(get_db)
raw_payload = await request.body()
data = json.loads(raw_payload)
payload = LocationRecordRequest.model_validate(data)
record_location(db, payload)
except json.JSONDecodeError as exc:
return PlainTextResponse(str(exc), status_code=400)
logger.warning("Rejected location request due to invalid JSON: %s", exc)
return PlainTextResponse(BAD_REQUEST_MESSAGE, status_code=400)
except ValidationError as exc:
return PlainTextResponse(str(exc), status_code=400)
logger.warning("Rejected location request due to payload validation failure: %s", exc)
return PlainTextResponse(BAD_REQUEST_MESSAGE, status_code=400)
except ValueError as exc:
logger.warning("Rejected location request due to invalid numeric input: %s", exc)
return PlainTextResponse(BAD_REQUEST_MESSAGE, status_code=400)
record_location(db, payload)
return Response(status_code=200)