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"}