newDeviceHandler creates a new device by class
(site site.API, authObject auth.Auth)
| 338 | |
| 339 | // newDeviceHandler creates a new device by class |
| 340 | func newDeviceHandler(site site.API, authObject auth.Auth) http.HandlerFunc { |
| 341 | return func(w http.ResponseWriter, r *http.Request) { |
| 342 | vars := mux.Vars(r) |
| 343 | |
| 344 | class, err := templates.ClassString(vars["class"]) |
| 345 | if err != nil { |
| 346 | jsonError(w, http.StatusBadRequest, err) |
| 347 | return |
| 348 | } |
| 349 | |
| 350 | req, err := decodeDeviceConfig(r.Body) |
| 351 | if err != nil { |
| 352 | jsonError(w, http.StatusBadRequest, err) |
| 353 | return |
| 354 | } |
| 355 | |
| 356 | if !requireCriticalConfigAuth(w, r, authObject, req) { |
| 357 | return |
| 358 | } |
| 359 | |
| 360 | var conf *config.Config |
| 361 | ctx, cancel, done := startDeviceTimeout() |
| 362 | |
| 363 | force := r.URL.Query().Get("force") == "true" |
| 364 | |
| 365 | switch class { |
| 366 | case templates.Charger: |
| 367 | conf, err = newDevice(ctx, class, req, charger.NewFromConfig, config.Chargers(), force) |
| 368 | |
| 369 | case templates.Meter: |
| 370 | conf, err = newDevice(ctx, class, req, meter.NewFromConfig, config.Meters(), force) |
| 371 | |
| 372 | case templates.Vehicle: |
| 373 | conf, err = newDevice(ctx, class, req, vehicle.NewFromConfig, config.Vehicles(), force) |
| 374 | |
| 375 | case templates.Circuit: |
| 376 | conf, err = newDevice(ctx, class, req, circuit.NewFromConfig, config.Circuits(), force) |
| 377 | |
| 378 | case templates.Hems: |
| 379 | if existing, _ := config.ConfigurationByClass(templates.Hems); existing != nil { |
| 380 | err = errors.New("hems already configured") |
| 381 | } else { |
| 382 | conf, err = newDevice(ctx, class, req, newHemsFactory(site), config.Hems(), force) |
| 383 | } |
| 384 | |
| 385 | case templates.Tariff: |
| 386 | conf, err = newDevice(ctx, class, req, tariff.NewFromConfig, config.Tariffs(), force) |
| 387 | |
| 388 | case templates.Messenger: |
| 389 | conf, err = newDevice(ctx, class, req, messenger.NewFromConfig, config.Messengers(), force) |
| 390 | } |
| 391 | |
| 392 | if err != nil { |
| 393 | cancel() |
| 394 | jsonError(w, http.StatusBadRequest, err) |
| 395 | return |
| 396 | } |
| 397 |
no test coverage detected