36 lines
1.1 KiB
Python
36 lines
1.1 KiB
Python
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException, Request
|
|
from pydantic import ValidationError
|
|
|
|
from control_backend.schemas.message import Message
|
|
from control_backend.schemas.program import Program
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
|
|
|
|
@router.post("/program", status_code=202)
|
|
async def receive_message(program: Message, request: Request):
|
|
"""
|
|
Receives a BehaviorProgram as a stringified JSON list inside `message`.
|
|
Converts it into real Phase objects.
|
|
"""
|
|
logger.debug("Received raw program: %s", program)
|
|
raw_str = program.message # This is the JSON string
|
|
|
|
# Validate program
|
|
try:
|
|
program = Program.model_validate_json(raw_str)
|
|
except ValidationError as e:
|
|
logger.error("Failed to validate program JSON: %s", e)
|
|
raise HTTPException(status_code=400, detail="Not a valid program") from None
|
|
|
|
# send away
|
|
topic = b"program"
|
|
body = program.model_dump_json().encode()
|
|
pub_socket = request.app.state.endpoints_pub_socket
|
|
await pub_socket.send_multipart([topic, body])
|
|
|
|
return {"status": "Program parsed"}
|