nats-app/internal/domains/sensors/handlers.go
2025-10-09 05:20:06 +02:00

111 lines
2.2 KiB
Go

package sensors
import (
"encoding/json"
"nats-app/internal/iot"
"github.com/nats-io/nats.go"
)
const (
subjectSensorsRegister = "sensors.register"
subjectSensorsUpdate = "sensors.update"
subjectSensorsGet = "sensors.get"
subjectSensorsValuesGet = "sensors.values.get"
subjectSensorsList = "sensors.list"
)
type Handlers struct {
service *Service
*iot.IoTDevice
}
func NewHandlers(service *Service, iot *iot.IoTDevice) *Handlers {
return &Handlers{
service: service,
IoTDevice: iot,
}
}
func handleRequest[Req any, Res any](msg *nats.Msg, handler func(Req) (Res, error)) {
var req Req
if err := json.Unmarshal(msg.Data, &req); err != nil {
msg.Respond([]byte(`{"error":"invalid request"}`))
return
}
result, err := handler(req)
if err != nil {
msg.Respond([]byte(`{"error":"` + err.Error() + `"}`))
return
}
response, _ := json.Marshal(result)
msg.Respond(response)
}
func (h *Handlers) SetupEndpoints() *Handlers {
h.register()
h.update()
h.get()
h.getValues()
h.list()
return h
}
func (h *Handlers) register() {
h.NATS.Subscribe(subjectSensorsRegister, func(msg *nats.Msg) {
handleRequest(msg, func(req Sensor) (Sensor, error) {
// service layer
return req, nil
})
})
}
func (h *Handlers) update() {
h.NATS.Subscribe(subjectSensorsUpdate, func(msg *nats.Msg) {
handleRequest(msg, func(req Sensor) (Sensor, error) {
// service layer
return req, nil
})
})
}
func (h *Handlers) get() {
h.NATS.Subscribe(subjectSensorsGet, func(msg *nats.Msg) {
handleRequest(msg, func(req struct {
SensorID string `json:"sensor_id"`
}) (Sensor, error) {
// service layer
return Sensor{}, nil
})
})
}
func (h *Handlers) getValues() {
h.NATS.Subscribe(subjectSensorsValuesGet, func(msg *nats.Msg) {
handleRequest(msg, func(req struct {
SensorID string `json:"sensor_id"`
From string `json:"from"`
To string `json:"to"`
}) ([]SensorData, error) {
// service layer
return []SensorData{}, nil
})
})
}
func (h *Handlers) list() {
h.NATS.Subscribe(subjectSensorsList, func(msg *nats.Msg) {
handleRequest(msg, func(req struct{}) ([]Sensor, error) {
// service layer
return []Sensor{}, nil
})
})
}