feat(fleet): edit apparatus name independently of onboard availability
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user