58 lines
1.3 KiB
Go
58 lines
1.3 KiB
Go
/*
|
|
Provide answers to nats request-reply messages, executing queries to the database
|
|
*/
|
|
package reqs
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"log"
|
|
"strings"
|
|
|
|
"github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/db"
|
|
local "github.com/OktopUSP/oktopus/backend/services/mtp/adapter/internal/nats"
|
|
"github.com/nats-io/nats.go"
|
|
"go.mongodb.org/mongo-driver/mongo"
|
|
)
|
|
|
|
type msgAnswer struct {
|
|
Code int
|
|
Msg any
|
|
}
|
|
|
|
func StartRequestsListener(ctx context.Context, nc *nats.Conn, db db.Database) {
|
|
log.Println("Listening for nats requests")
|
|
nc.Subscribe(local.ADAPTER_SUBJECT+"*.device", func(msg *nats.Msg) {
|
|
subject := strings.Split(msg.Subject, ".")
|
|
device := subject[len(subject)-2]
|
|
|
|
deviceInfo, err := db.RetrieveDevice(device)
|
|
if deviceInfo.SN != "" {
|
|
respondMsg(msg.Respond, 200, deviceInfo)
|
|
} else {
|
|
if err != nil {
|
|
if err == mongo.ErrNoDocuments {
|
|
respondMsg(msg.Respond, 404, "Device not found")
|
|
} else {
|
|
respondMsg(msg.Respond, 500, err.Error())
|
|
}
|
|
}
|
|
}
|
|
})
|
|
}
|
|
|
|
func respondMsg(respond func(data []byte) error, code int, msgData any) {
|
|
|
|
msg, err := json.Marshal(msgAnswer{
|
|
Code: code,
|
|
Msg: msgData,
|
|
})
|
|
if err != nil {
|
|
log.Printf("Failed to marshal message: %q", err)
|
|
respond([]byte(err.Error()))
|
|
return
|
|
}
|
|
|
|
respond([]byte(msg))
|
|
}
|