Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.
 
 
 
 

79 řádky
1.8 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/config"
  9. "github.com/AFASystems/presence/internal/pkg/controller"
  10. "github.com/AFASystems/presence/internal/pkg/model"
  11. "github.com/segmentio/kafka-go"
  12. "gorm.io/gorm"
  13. "gorm.io/gorm/clause"
  14. )
  15. func UpdateDB(db *gorm.DB, ctx context.Context, cfg *config.Config, writer *kafka.Writer) error {
  16. tr := &http.Transport{
  17. TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
  18. }
  19. client := &http.Client{Transport: tr}
  20. token, err := GetToken(ctx, cfg, client)
  21. if err != nil {
  22. return err
  23. }
  24. if trackers, err := GetTrackers(token, client); err == nil {
  25. syncTable(db, trackers)
  26. if err := controller.SendKafkaMessage(writer, &model.ApiUpdate{Method: "DELETE", MAC: "all"}, ctx); err != nil {
  27. fmt.Printf("Error in sending delete all from lookup message: %v", err)
  28. }
  29. for _, v := range trackers {
  30. apiUpdate := model.ApiUpdate{
  31. Method: "POST",
  32. ID: v.ID,
  33. MAC: v.MAC,
  34. }
  35. if err := controller.SendKafkaMessage(writer, &apiUpdate, ctx); err != nil {
  36. fmt.Printf("Error in sending POST kafka message: %v", err)
  37. }
  38. }
  39. }
  40. if gateways, err := GetGateways(token, client); err == nil {
  41. syncTable(db, gateways)
  42. }
  43. if zones, err := GetZones(token, client); err == nil {
  44. syncTable(db, zones)
  45. }
  46. if trackerZones, err := GetTrackerZones(token, client); err == nil {
  47. syncTable(db, trackerZones)
  48. }
  49. return nil
  50. }
  51. func syncTable[T any](db *gorm.DB, data []T) {
  52. if len(data) == 0 {
  53. return
  54. }
  55. var ids []string
  56. for _, item := range data {
  57. v := reflect.ValueOf(item).FieldByName("ID").String()
  58. ids = append(ids, v)
  59. }
  60. db.Transaction(func(tx *gorm.DB) error {
  61. tx.Where("id NOT IN ?", ids).Delete(new(T))
  62. return tx.Clauses(clause.OnConflict{UpdateAll: true}).Create(&data).Error
  63. })
  64. }