You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

99 regels
2.4 KiB

  1. package apiclient
  2. import (
  3. "context"
  4. "crypto/tls"
  5. "fmt"
  6. "log/slog"
  7. "net/http"
  8. "reflect"
  9. "github.com/AFASystems/presence/internal/pkg/common/appcontext"
  10. "github.com/AFASystems/presence/internal/pkg/config"
  11. "github.com/AFASystems/presence/internal/pkg/controller"
  12. "github.com/AFASystems/presence/internal/pkg/model"
  13. "github.com/segmentio/kafka-go"
  14. "gorm.io/gorm"
  15. "gorm.io/gorm/clause"
  16. )
  17. func UpdateDB(db *gorm.DB, ctx context.Context, cfg *config.Config, writer *kafka.Writer, appState *appcontext.AppState) error {
  18. tr := &http.Transport{
  19. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  20. }
  21. client := &http.Client{Transport: tr}
  22. token, err := GetToken(ctx, cfg, client)
  23. if err != nil {
  24. return err
  25. }
  26. if trackers, err := GetTrackers(token, client, cfg); err == nil {
  27. syncTable(db, trackers)
  28. if err := controller.SendKafkaMessage(writer, &model.ApiUpdate{Method: "DELETE", MAC: "all"}, ctx); err != nil {
  29. msg := fmt.Sprintf("Error in sending delete all from lookup message: %v", err)
  30. slog.Error(msg)
  31. }
  32. for _, v := range trackers {
  33. apiUpdate := model.ApiUpdate{
  34. Method: "POST",
  35. ID: v.ID,
  36. MAC: v.MAC,
  37. }
  38. if err := controller.SendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  39. msg := fmt.Sprintf("Error in sending POST kafka message: %v", err)
  40. slog.Error(msg)
  41. }
  42. }
  43. }
  44. if gateways, err := GetGateways(token, client, cfg); err == nil {
  45. syncTable(db, gateways)
  46. }
  47. if zones, err := GetZones(token, client, cfg); err == nil {
  48. syncTable(db, zones)
  49. }
  50. if trackerZones, err := GetTrackerZones(token, client, cfg); err == nil {
  51. syncTable(db, trackerZones)
  52. }
  53. if inferredPosition, err := InferPosition(token, client, cfg); err == nil {
  54. for _, v := range inferredPosition.Items {
  55. mac := convertMac(v.Mac)
  56. fmt.Println(mac)
  57. db.Model(&model.Tracker{}).Where("mac = ?", mac).Update("x", v.X).Update("y", v.Y)
  58. }
  59. }
  60. var settings model.Settings
  61. db.First(&settings)
  62. if settings.ID == 0 {
  63. msg := "settings are empty"
  64. slog.Info(msg)
  65. db.Create(appState.GetSettings())
  66. }
  67. return nil
  68. }
  69. func syncTable[T any](db *gorm.DB, data []T) {
  70. if len(data) == 0 {
  71. return
  72. }
  73. var ids []string
  74. for _, item := range data {
  75. v := reflect.ValueOf(item).FieldByName("ID").String()
  76. ids = append(ids, v)
  77. }
  78. db.Transaction(func(tx *gorm.DB) error {
  79. tx.Where("id NOT IN ?", ids).Delete(new(T))
  80. return tx.Clauses(clause.OnConflict{UpdateAll: true}).Create(&data).Error
  81. })
  82. }