3 Commitit

13 muutettua tiedostoa jossa 51 lisäystä ja 15 poistoa
  1. +5
    -0
      .gitignore
  2. BIN
      bridge
  3. BIN
      decoder
  4. +5
    -1
      internal/app/bridge/app.go
  5. +9
    -1
      internal/pkg/apiclient/data.go
  6. +5
    -1
      internal/pkg/bridge/mqtt.go
  7. +2
    -1
      internal/pkg/common/appcontext/health.go
  8. +8
    -4
      internal/pkg/controller/alerts_controller.go
  9. +8
    -5
      internal/pkg/model/alerts.go
  10. +1
    -0
      internal/pkg/model/gateway.go
  11. +8
    -2
      internal/pkg/service/alert_service.go
  12. BIN
      location
  13. BIN
      server

+ 5
- 0
.gitignore Näytä tiedosto

@@ -26,6 +26,11 @@ vendor/
volumes/node-red/
main

bridge
decoder
server
location

**/*.log

ROADMAP.md

BIN
bridge Näytä tiedosto


BIN
decoder Näytä tiedosto


+ 5
- 1
internal/app/bridge/app.go Näytä tiedosto

@@ -52,7 +52,11 @@ func New(cfg *config.Config) (*BridgeApp, error) {
cleanup()
return nil, err
}
mqttClient.Subscribe()

if err := mqttClient.Subscribe(); err != nil {
cleanup()
return nil, err
}

return &BridgeApp{
Cfg: cfg,


+ 9
- 1
internal/pkg/apiclient/data.go Näytä tiedosto

@@ -1,8 +1,10 @@
package apiclient

import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"

"github.com/AFASystems/presence/internal/pkg/config"
@@ -30,8 +32,14 @@ func GetGateways(token string, client *http.Client, cfg *config.Config) ([]model
return []model.Gateway{}, err
}

body, err := io.ReadAll(res.Body)
if err != nil {
return []model.Gateway{}, err
}
fmt.Printf("Gateways raw response: %s\n", body)

var i []model.Gateway
err = json.NewDecoder(res.Body).Decode(&i)
err = json.NewDecoder(bytes.NewReader(body)).Decode(&i)
if err != nil {
return []model.Gateway{}, err
}


+ 5
- 1
internal/pkg/bridge/mqtt.go Näytä tiedosto

@@ -48,10 +48,14 @@ func NewMQTTClient(cfg *config.Config, publishHandler func(mqtt.Message)) (*MQTT
}

// Subscribe subscribes to the default bridge topic.
func (m *MQTTClient) Subscribe() {
func (m *MQTTClient) Subscribe() error {
token := m.Client.Subscribe(subscribeTopic, 1, nil)
token.Wait()
if err := token.Error(); err != nil {
return fmt.Errorf("mqtt subscribe: %w", err)
}
slog.Info("MQTT subscribed", "topic", subscribeTopic)
return nil
}

// Disconnect disconnects the client with quiesce.


+ 2
- 1
internal/pkg/common/appcontext/health.go Näytä tiedosto

@@ -9,7 +9,7 @@ import (

// ServiceStatus represents the health of an external service (e.g. Kafka, database).
type ServiceStatus struct {
Status string `json:"status"` // "up", "down", "unknown"
Status string `json:"status"` // "up", "down", "unknown"
Message string `json:"message,omitempty"`
}

@@ -56,6 +56,7 @@ func (b *BaseHealth) GetActiveWriters(m *kafkaclient.KafkaManager) {

func (b *BaseHealth) GetActiveBeacons(m *AppState) {
beacons := m.GetAllBeacons()
b.ActiveBeacons = []string{}
for beacon := range beacons {
b.ActiveBeacons = append(b.ActiveBeacons, beacon)
}


+ 8
- 4
internal/pkg/controller/alerts_controller.go Näytä tiedosto

@@ -81,9 +81,7 @@ func AlertDeleteController(db *gorm.DB, ctx context.Context) http.HandlerFunc {
func AlertUpdateStatusController(db *gorm.DB, ctx context.Context) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
id := mux.Vars(r)["id"]
var body struct {
Status string `json:"status"`
}
var body service.AlertPatchBody
if err := json.NewDecoder(r.Body).Decode(&body); err != nil {
response.BadRequest(w, "invalid request body")
return
@@ -92,7 +90,13 @@ func AlertUpdateStatusController(db *gorm.DB, ctx context.Context) http.HandlerF
response.BadRequest(w, err.Error())
return
}
if err := service.UpdateAlertStatus(id, body.Status, db, ctx); err != nil {

if err := validation.Var(body.Operator, "required"); err != nil {
response.BadRequest(w, err.Error())
return
}

if err := service.UpdateAlertStatus(id, body, db, ctx); err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
response.NotFound(w, "alert not found")
return


+ 8
- 5
internal/pkg/model/alerts.go Näytä tiedosto

@@ -3,9 +3,12 @@ package model
import "time"

type Alert struct {
ID string `json:"id" gorm:"primaryKey"`
TrackerID string `json:"tracker_id"`
Type string `json:"type"`
Status string `json:"status"`
Timestamp time.Time `json:"timestamp"`
ID string `json:"id" gorm:"primaryKey"`
TrackerID string `json:"tracker_id"`
Type string `json:"type"`
Status string `json:"status"`
Timestamp time.Time `json:"timestamp"`
ResolutionTimestamp time.Time `json:"resolution_timestamp"`
Operator string `json:"operator"`
Zone string `json:"zone"`
}

+ 1
- 0
internal/pkg/model/gateway.go Näytä tiedosto

@@ -13,4 +13,5 @@ type Gateway struct {
Notes string `json:"notes"`
Floor string `json:"floor"`
Building string `json:"building"`
Zone string `json:"zone"`
}

+ 8
- 2
internal/pkg/service/alert_service.go Näytä tiedosto

@@ -2,6 +2,7 @@ package service

import (
"context"
"time"

"github.com/AFASystems/presence/internal/pkg/model"
"gorm.io/gorm"
@@ -38,9 +39,14 @@ func GetAlertById(id string, db *gorm.DB, ctx context.Context) (model.Alert, err
return alert, nil
}

type AlertPatchBody struct {
Status string `json:"status"`
Operator string `json:"operator"`
}

// UpdateAlertStatus updates the status of an alert by id. Returns gorm.ErrRecordNotFound if the alert does not exist.
func UpdateAlertStatus(id string, status string, db *gorm.DB, ctx context.Context) error {
result := db.WithContext(ctx).Model(&model.Alert{}).Where("id = ?", id).Update("status", status)
func UpdateAlertStatus(id string, body AlertPatchBody, db *gorm.DB, ctx context.Context) error {
result := db.WithContext(ctx).Model(&model.Alert{}).Where("id = ?", id).Updates(model.Alert{Status: body.Status, Operator: body.Operator, ResolutionTimestamp: time.Now()})
if result.Error != nil {
return result.Error
}


BIN
location Näytä tiedosto


BIN
server Näytä tiedosto


Ladataan…
Peruuta
Tallenna