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.
 
 
 
 

92 rindas
2.2 KiB

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