25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 
 
 

88 satır
2.0 KiB

  1. package service
  2. import (
  3. "context"
  4. "encoding/json"
  5. "fmt"
  6. "slices"
  7. "strings"
  8. "time"
  9. "github.com/AFASystems/presence/internal/pkg/model"
  10. "github.com/segmentio/kafka-go"
  11. "gorm.io/gorm"
  12. )
  13. func LocationToBeaconService(msg model.HTTPLocation, db *gorm.DB, writer *kafka.Writer, ctx context.Context) {
  14. if msg.ID == "" {
  15. fmt.Println("empty ID")
  16. return
  17. }
  18. var zones []model.TrackerZones
  19. if err := db.Select("zoneList").Where("tracker = ?", msg.ID).Find(&zones).Error; err != nil {
  20. return
  21. }
  22. var tracker model.Tracker
  23. if err := db.Where("id = ?", msg.ID).Find(&tracker).Error; err != nil {
  24. return
  25. }
  26. var allowedZones []string
  27. for _, z := range zones {
  28. allowedZones = append(allowedZones, z.ZoneList...)
  29. }
  30. var gw model.Gateway
  31. mac := formatMac(msg.Location)
  32. if err := db.Select("id").Where("mac = ?", mac).First(&gw).Error; err != nil {
  33. fmt.Printf("Gateway not found for MAC: %s\n", mac)
  34. return
  35. }
  36. if len(allowedZones) != 0 && !slices.Contains(allowedZones, gw.ID) {
  37. alert := model.Alert{
  38. ID: msg.ID,
  39. Type: "Restricted zone",
  40. Value: gw.ID,
  41. }
  42. eMsg, err := json.Marshal(alert)
  43. if err != nil {
  44. fmt.Println("Error in marshaling")
  45. } else {
  46. msg := kafka.Message{
  47. Value: eMsg,
  48. }
  49. writer.WriteMessages(ctx, msg)
  50. }
  51. }
  52. // status, subject, subject name?
  53. if err := db.Create(&model.Tracks{UUID: msg.ID, Timestamp: time.Now(), Gateway: gw.ID, GatewayMac: gw.MAC, Tracker: msg.ID, Floor: gw.Floor, Building: gw.Building, TrackerMac: tracker.MAC, Signal: msg.RSSI}).Error; err != nil {
  54. fmt.Println("Error in saving distance for beacon: ", err)
  55. return
  56. }
  57. if err := db.Updates(&model.Tracker{ID: msg.ID, Location: gw.ID, Distance: msg.Distance, X: gw.X, Y: gw.Y}).Error; err != nil {
  58. fmt.Println("Error in saving distance for beacon: ", err)
  59. return
  60. }
  61. }
  62. func formatMac(MAC string) string {
  63. var res strings.Builder
  64. for i := 0; i < len(MAC); i += 2 {
  65. if i > 0 {
  66. res.WriteByte(':')
  67. }
  68. end := min(i+2, len(MAC))
  69. res.WriteString(MAC[i:end])
  70. }
  71. return res.String()
  72. }