119 lines
2.7 KiB
Go
119 lines
2.7 KiB
Go
package api
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/leandrofars/oktopus/internal/bridge"
|
|
"github.com/leandrofars/oktopus/internal/entity"
|
|
local "github.com/leandrofars/oktopus/internal/nats"
|
|
"github.com/leandrofars/oktopus/internal/utils"
|
|
"github.com/nats-io/nats.go"
|
|
)
|
|
|
|
var errInvalidMtp = errors.New("Invalid MTP, valid options are: mqtt, ws, stomp")
|
|
|
|
func deviceStateOK(w http.ResponseWriter, nc *nats.Conn, sn string) (string, bool) {
|
|
|
|
device, err := getDeviceInfo(w, sn, nc)
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
|
|
if !isDeviceOnline(w, device.Status) {
|
|
return "", false
|
|
}
|
|
|
|
if device.Mqtt == entity.Online {
|
|
return entity.Mqtt, true
|
|
}
|
|
|
|
if device.Websockets == entity.Online {
|
|
return entity.Websockets, true
|
|
}
|
|
|
|
if device.Stomp == entity.Online {
|
|
return entity.Stomp, true
|
|
}
|
|
|
|
return "", false
|
|
}
|
|
|
|
func getSerialNumberFromRequest(r *http.Request) string {
|
|
vars := mux.Vars(r)
|
|
return vars["sn"]
|
|
}
|
|
|
|
func getMtpFromRequest(r *http.Request, w http.ResponseWriter) (string, error) {
|
|
vars := mux.Vars(r)
|
|
switch vars["mtp"] {
|
|
case entity.Mqtt:
|
|
return entity.Mqtt, nil
|
|
case entity.Websockets:
|
|
return entity.Websockets, nil
|
|
case entity.Stomp:
|
|
return entity.Stomp, nil
|
|
case "any":
|
|
return "", nil
|
|
case ":mtp":
|
|
return "", nil
|
|
default:
|
|
w.WriteHeader(http.StatusBadRequest)
|
|
w.Write(utils.Marshall("Invalid MTP, valid options are: " + entity.Mqtt + ", " + entity.Websockets + ", " + entity.Stomp))
|
|
return "", errInvalidMtp
|
|
}
|
|
}
|
|
|
|
func isDeviceOnline(w http.ResponseWriter, deviceStatus entity.Status) bool {
|
|
if deviceStatus != entity.Online {
|
|
w.WriteHeader(http.StatusServiceUnavailable)
|
|
switch deviceStatus {
|
|
case entity.Offline:
|
|
w.Write(utils.Marshall("Device is offline"))
|
|
case entity.Associating:
|
|
w.Write(utils.Marshall("Device status is associating"))
|
|
default:
|
|
w.Write(utils.Marshall("Unknown device status"))
|
|
}
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
func getDeviceInfo(w http.ResponseWriter, sn string, nc *nats.Conn) (device *entity.Device, err error) {
|
|
msg, err := bridge.NatsReq[entity.Device](
|
|
local.NATS_ADAPTER_SUBJECT+sn+".device",
|
|
[]byte(""),
|
|
w,
|
|
nc,
|
|
)
|
|
if msg != nil {
|
|
return &msg.Msg, err
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
func getDeviceCount(w http.ResponseWriter, nc *nats.Conn) (int64, error) {
|
|
msg, err := bridge.NatsReq[int64](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.count",
|
|
[]byte(""),
|
|
w,
|
|
nc,
|
|
)
|
|
return msg.Msg, err
|
|
}
|
|
|
|
func getDevices(w http.ResponseWriter, filter map[string]interface{}, nc *nats.Conn) (*entity.DevicesList, error) {
|
|
msg, err := bridge.NatsReq[entity.DevicesList](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.retrieve",
|
|
utils.Marshall(filter),
|
|
w,
|
|
nc,
|
|
)
|
|
if msg != nil {
|
|
return &msg.Msg, err
|
|
}
|
|
return nil, err
|
|
}
|