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)