package apiclient import ( "context" "crypto/tls" "fmt" "net/http" "github.com/AFASystems/presence/internal/pkg/config" "github.com/AFASystems/presence/internal/pkg/controller" "github.com/AFASystems/presence/internal/pkg/model" "github.com/segmentio/kafka-go" "gorm.io/gorm" "gorm.io/gorm/clause" ) func UpdateDB(db *gorm.DB, ctx context.Context, cfg *config.Config, writer *kafka.Writer) error { tr := &http.Transport{ TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, } client := &http.Client{Transport: tr} token, err := GetToken(ctx, cfg, client) if err != nil { return err } trackers, err := GetTrackers(token, client) if err != nil { fmt.Printf("Error in getting trackers: %+v\n", err) } else { if err := controller.SendKafkaMessage(writer, &model.ApiUpdate{Method: "DELETE", MAC: "all"}, ctx); err != nil { fmt.Printf("Error in sending delete all from lookup message: %v", err) } for _, v := range trackers { apiUpdate := model.ApiUpdate{ Method: "POST", ID: v.ID, MAC: v.MAC, } if err := controller.SendKafkaMessage(writer, &apiUpdate, ctx); err != nil { fmt.Printf("Error in sending POST kafka message: %v", err) } } var ids []string for _, t := range trackers { ids = append(ids, t.ID) } db.Where("id NOT IN ?", ids).Delete(&model.Tracker{}) } gateways, err := GetGateways(token, client) if err != nil { fmt.Printf("Error in getting gateways: %+v\n", err) } else { var ids []string for _, g := range gateways { ids = append(ids, g.ID) } db.Where("id NOT IN ?", ids).Delete(&model.Gateway{}) } zones, err := GetZones(token, client) if err != nil { fmt.Printf("Error in getting zones: %+v\n", err) } else { var ids []string for _, z := range zones { ids = append(ids, z.ID) } db.Where("id NOT IN ?", ids).Delete(&model.Zone{}) } trackerZones, err := GetTrackerZones(token, client) if err != nil { fmt.Printf("Error in getting tracker zones: %+v\n", err) } else { var ids []string for _, tz := range trackerZones { ids = append(ids, tz.ID) } db.Where("id NOT IN ?", ids).Delete(&model.TrackerZones{}) } db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&trackers) db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&gateways) db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&zones) db.Clauses(clause.OnConflict{ Columns: []clause.Column{{Name: "id"}}, UpdateAll: true, }).Create(&trackerZones) return nil }