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 }) }) }