154 lines
2.9 KiB
Go
154 lines
2.9 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"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"
|
|
)
|
|
|
|
type StatusCount struct {
|
|
Online int
|
|
Offline int
|
|
}
|
|
|
|
type GeneralInfo struct {
|
|
MqttRtt string
|
|
WebsocketsRtt string
|
|
ProductClassCount []entity.ProductClassCount
|
|
StatusCount StatusCount
|
|
VendorsCount []entity.VendorsCount
|
|
}
|
|
|
|
// TODO: fix when mqtt broker is not set don't break api
|
|
func (a *Api) generalInfo(w http.ResponseWriter, r *http.Request) {
|
|
|
|
var result GeneralInfo
|
|
|
|
productclasscount, err := bridge.NatsReq[[]entity.ProductClassCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.class",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
vendorcount, err := bridge.NatsReq[[]entity.VendorsCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.vendors",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
statusCount, err := bridge.NatsReq[[]entity.StatusCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.status",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
for _, v := range statusCount.Msg {
|
|
switch entity.Status(v.Status) {
|
|
case entity.Online:
|
|
result.StatusCount.Online = v.Count
|
|
case entity.Offline:
|
|
result.StatusCount.Offline = v.Count
|
|
}
|
|
}
|
|
|
|
result.VendorsCount = vendorcount.Msg
|
|
result.ProductClassCount = productclasscount.Msg
|
|
|
|
now := time.Now()
|
|
_, err = bridge.NatsReq[time.Duration](
|
|
local.NATS_WS_ADAPTER_SUBJECT_PREFIX+"rtt",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
result.WebsocketsRtt = time.Until(now).String()
|
|
|
|
now = time.Now()
|
|
_, err = bridge.NatsReq[time.Duration](
|
|
local.NATS_MQTT_ADAPTER_SUBJECT_PREFIX+"rtt",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
result.MqttRtt = time.Until(now).String()
|
|
|
|
err = json.NewEncoder(w).Encode(result)
|
|
if err != nil {
|
|
log.Println(err)
|
|
}
|
|
}
|
|
|
|
func (a *Api) vendorsInfo(w http.ResponseWriter, r *http.Request) {
|
|
vendors, err := bridge.NatsReq[[]entity.VendorsCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.vendors",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
utils.MarshallEncoder(vendors.Msg, w)
|
|
}
|
|
|
|
func (a *Api) productClassInfo(w http.ResponseWriter, r *http.Request) {
|
|
vendors, err := bridge.NatsReq[[]entity.ProductClassCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.class",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
utils.MarshallEncoder(vendors.Msg, w)
|
|
}
|
|
|
|
func (a *Api) statusInfo(w http.ResponseWriter, r *http.Request) {
|
|
vendors, err := bridge.NatsReq[[]entity.StatusCount](
|
|
local.NATS_ADAPTER_SUBJECT+"devices.status",
|
|
[]byte(""),
|
|
w,
|
|
a.nc,
|
|
)
|
|
if err != nil {
|
|
return
|
|
}
|
|
|
|
var status StatusCount
|
|
for _, v := range vendors.Msg {
|
|
switch entity.Status(v.Status) {
|
|
case entity.Online:
|
|
status.Online = v.Count
|
|
case entity.Offline:
|
|
status.Offline = v.Count
|
|
}
|
|
}
|
|
|
|
utils.MarshallEncoder(status, w)
|
|
}
|