feat(fleet): edit apparatus name independently of onboard availability

This commit is contained in:
DCCONSTRUCTIONS
2026-09-25 22:28:22 +03:00
parent ee7576b7b4
commit aecae4a986
8 changed files with 147 additions and 6 deletions
+15
View File
@@ -273,6 +273,21 @@ class FleetRegistry:
"core_endpoint": row["binding"]["endpoint"],
}
def rename(self, identifier: str, name: str, expected_revision: int) -> dict:
"""Update operator metadata without contacting or re-enrolling the board."""
if (not name.strip() or len(name.strip()) > 80
or any(ord(c) < 32 or 127 <= ord(c) < 160 for c in name)):
raise PairingError("Введите название аппарата от 1 до 80 символов без управляющих знаков.")
with self.lock:
row = self.find(identifier)
if row["name"] == name.strip():
return self.public(row) # Safe retry after a lost response.
if row["revision"] != expected_revision:
raise PairingError("Аппарат изменился. Отмените правку и повторите её по свежим данным.")
row.update(name=name.strip(), revision=row["revision"] + 1)
self.save(row)
return self.public(row)
def listing(self):
with self.lock:
return {
+16
View File
@@ -54,6 +54,12 @@ class AttachBoardRequest(BaseModel):
expected_revision: int = Field(ge=1, strict=True)
class RenameRequest(BaseModel):
model_config = ConfigDict(extra="forbid")
name: str = Field(min_length=1, max_length=80)
expected_revision: int = Field(ge=1, strict=True)
router = APIRouter(prefix="/api/v1/fleet", tags=["fleet"])
@@ -163,6 +169,16 @@ def fleet_add(
raise HTTPException(409, str(error)) from None
@router.patch("/{vehicle_id}")
def fleet_rename(vehicle_id: str, body: RenameRequest, response: Response,
fleet: Annotated[FleetRegistry, Depends(local_operator)]):
response.headers["Cache-Control"] = "no-store"
try:
return fleet.rename(vehicle_id, body.name, body.expected_revision)
except PairingError as error:
raise HTTPException(409, str(error)) from None
@router.delete("/{vehicle_id}")
def fleet_revoke(vehicle_id: str, fleet: Annotated[FleetRegistry, Depends(local_operator)]):
try: