60 lines
1.8 KiB
Python
60 lines
1.8 KiB
Python
from __future__ import annotations
|
|
|
|
from rest_framework.decorators import api_view
|
|
from rest_framework.response import Response
|
|
|
|
from .services import OmniDaemonError, control_service
|
|
|
|
|
|
@api_view(["GET"])
|
|
def control_status(request):
|
|
try:
|
|
return Response(control_service.get_status())
|
|
except OmniDaemonError as error:
|
|
return Response(
|
|
{
|
|
"connected": False,
|
|
"queue_depth": 0,
|
|
"last_seq_id": None,
|
|
"last_error": str(error),
|
|
"peer_id": "",
|
|
"target_peer": "",
|
|
},
|
|
status=503,
|
|
)
|
|
|
|
|
|
@api_view(["POST"])
|
|
def control_event(request):
|
|
event_code = str(request.data.get("event_code", "")).strip()
|
|
if not event_code:
|
|
return Response({"error": "event_code is required"}, status=400)
|
|
|
|
try:
|
|
drive_value = float(request.data.get("drive_value", 1.0))
|
|
except (TypeError, ValueError):
|
|
return Response({"error": "drive_value must be numeric"}, status=400)
|
|
|
|
raw_client_time_ms = request.data.get("client_time_ms")
|
|
if raw_client_time_ms in (None, ""):
|
|
client_time_ms = None
|
|
else:
|
|
try:
|
|
client_time_ms = int(raw_client_time_ms)
|
|
except (TypeError, ValueError):
|
|
return Response({"error": "client_time_ms must be an integer"}, status=400)
|
|
|
|
source = str(request.data.get("source", "django-api")).strip() or "django-api"
|
|
|
|
try:
|
|
payload = control_service.send_event(
|
|
event_code=event_code,
|
|
drive_value=drive_value,
|
|
source=source,
|
|
client_time_ms=client_time_ms,
|
|
)
|
|
except OmniDaemonError as error:
|
|
return Response({"error": str(error)}, status=503)
|
|
|
|
return Response(payload, status=200 if payload.get("accepted") else 503)
|