fix(iot): отдавать MQTT-пароль при создании + писать phase в БД

- handler/devices.go: CreateIoTDevice отдаёт mqtt_password один раз в 201
  (было deviceToResponse(device, "") — пароль терялся, устройство нельзя
  подключить; блокер для Terraform). Заголовок поправлен (GET — без пароля).
- store/devices.go: Create пишет phase явно через phaseOf(enabled) — иначе
  enabled=false лежал в БД как 'Active' (DEFAULT), расходясь с POST/GET.
This commit is contained in:
Repinoid
2026-10-10 18:48:07 +03:00
parent 4290ecfb0a
commit 76f0230f5d
2 changed files with 16 additions and 6 deletions
+9 -3
View File
@@ -2,9 +2,9 @@
//
// Endpoints:
//
// POST /v1/namespaces/{ns}/iot/devices — создать
// POST /v1/namespaces/{ns}/iot/devices — создать (отдаёт mqtt_password ОДИН раз)
// GET /v1/namespaces/{ns}/iot/devices — список (без паролей)
// GET /v1/namespaces/{ns}/iot/devices/{name} — одно (с паролем)
// GET /v1/namespaces/{ns}/iot/devices/{name} — одно (без пароля)
// DELETE /v1/namespaces/{ns}/iot/devices/{name} — удалить
// PATCH /v1/namespaces/{ns}/iot/devices/{name} — enabled
package handler
@@ -149,7 +149,13 @@ func (h *Handler) CreateIoTDevice(w http.ResponseWriter, r *http.Request) {
return
}
writeJSON(w, http.StatusCreated, deviceToResponse(device, ""))
// Пароль отдаётся ТОЛЬКО здесь, один раз в ответе 201. Дальше (GET/PATCH/
// LIST) он не возвращается — иначе пароль утекал бы через чтение и в
// историю/логи. Это блокер для Terraform: без пароля устройство нельзя
// подключить к MQTT, значит ресурс не создать. Именно поэтому пароль
// пробрасывается в deviceToResponse только в этой точке, а не хранится
// в response-структуре навсегда.
writeJSON(w, http.StatusCreated, deviceToResponse(device, password))
}
// ListIoTDevices — GET /v1/namespaces/{ns}/iot/devices (без паролей).