package store import ( "context" "fmt" ) // bridgeNamespace — служебный namespace строки бриджа в iot_devices. // EMQX (postgres auth/ACL) узнаёт бридж по условию // namespace = '__bridge' AND username = device_id. const bridgeNamespace = "__bridge" // EnsureBridgeDevice создаёт (или обновляет) служебную строку бриджа в // iot_devices. EMQX авторизует MQTT-подключение бриджа по этой строке, // поэтому device_id = MQTT username (iot-bridge), пароль = MQTT_PASSWORD. // // Нужно для PG-auth EMQX (хвост 3): EMQX зависит только от PostgreSQL, // монолит при старте гарантирует наличие строки бриджа. func (s *DeviceStore) EnsureBridgeDevice(ctx context.Context, username, password string) error { _, err := s.db.ExecContext(ctx, ` INSERT INTO iot_devices (namespace, name, device_id, enabled, mqtt_password, metadata, phase) VALUES ($1, $2, $3, true, $4, '{}'::jsonb, 'Active') ON CONFLICT (namespace, name) DO UPDATE SET device_id = EXCLUDED.device_id, enabled = true, mqtt_password = EXCLUDED.mqtt_password`, bridgeNamespace, "iot-bridge", username, password) if err != nil { return fmt.Errorf("store: ensure bridge device: %w", err) } return nil }