import re from fastapi import APIRouter, HTTPException from pydantic import BaseModel, field_validator from services import store router = APIRouter(prefix="/api/drives", tags=["leds"]) class LedRequest(BaseModel): state: str @field_validator("state") @classmethod def validate_state(cls, v: str) -> str: if v not in ("locate", "off"): raise ValueError("state must be 'locate' or 'off'") return v @router.post("/{device}/led") async def set_drive_led(device: str, body: LedRequest): """Queue a locate-LED change. The poller (sole hardware owner) executes it.""" if not re.fullmatch(r"[a-zA-Z0-9]+", device): raise HTTPException(status_code=400, detail=f"Invalid device name: {device}") queued = await store.enqueue_led(device, body.state) if not queued: raise HTTPException(status_code=503, detail="LED queue unavailable (Redis down)") return {"device": device, "state": body.state, "queued": True}