Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

52 rindas
1.6 KiB

  1. package server
  2. import (
  3. "context"
  4. "encoding/json"
  5. "log/slog"
  6. "time"
  7. "github.com/AFASystems/presence/internal/pkg/config"
  8. "github.com/AFASystems/presence/internal/pkg/model"
  9. "github.com/AFASystems/presence/internal/pkg/service"
  10. "github.com/segmentio/kafka-go"
  11. )
  12. // RunEventLoop runs the server event loop until ctx is cancelled.
  13. // Handles: location events -> LocationToBeaconService, alert events -> update tracker in DB, ticker -> publish trackers to mqtt.
  14. func RunEventLoop(ctx context.Context, a *ServerApp) {
  15. beaconTicker := time.NewTicker(config.MEDIUM_TICKER_INTERVAL)
  16. defer beaconTicker.Stop()
  17. for {
  18. select {
  19. case <-ctx.Done():
  20. return
  21. case msg := <-a.ChLoc:
  22. service.LocationToBeaconService(msg, a.DB, a.KafkaManager.GetWriter("alert"), ctx)
  23. case msg := <-a.ChEvents:
  24. slog.Info("decoder event", "event", msg)
  25. id := msg.ID
  26. if err := a.DB.First(&model.Tracker{}, "id = ?", id).Error; err != nil {
  27. slog.Error("decoder event for untracked beacon", "id", id)
  28. continue
  29. }
  30. if err := a.DB.Updates(&model.Tracker{ID: id, Battery: msg.Battery, Temperature: msg.Temperature}).Error; err != nil {
  31. slog.Error("saving decoder event for beacon", "id", id, "err", err)
  32. continue
  33. }
  34. case <-beaconTicker.C:
  35. var list []model.Tracker
  36. a.DB.Find(&list)
  37. eMsg, err := json.Marshal(list)
  38. if err != nil {
  39. slog.Error("marshaling trackers list", "err", err)
  40. continue
  41. }
  42. if err := a.KafkaManager.GetWriter("mqtt").WriteMessages(ctx, kafka.Message{Value: eMsg}); err != nil {
  43. slog.Error("writing trackers to mqtt topic", "err", err)
  44. }
  45. }
  46. }
  47. }