diff --git a/internal/sync/sync.go b/internal/sync/sync.go index ce375cf..7b09a4a 100644 --- a/internal/sync/sync.go +++ b/internal/sync/sync.go @@ -17,7 +17,6 @@ func SyncProclamations(database *gorm.DB) ([]db.Proclamation, error) { fullURL := "https://portal.rhemawavetech.com/api/v1/proclamations" logger.Debug("Syncronizing proclamations. URL: %s", fullURL) - // 1. Fetch from API proclamations, err := netreq.GetJSON[db.Proclamation](fullURL) if err != nil { // If we're offline or API is down, we log it but don't crash. @@ -27,17 +26,37 @@ func SyncProclamations(database *gorm.DB) ([]db.Proclamation, error) { } logger.Debug("Request Granted") - // 2. Data Transformation (Cleaning) for i := range proclamations { proclamations[i].Content = htmlRegex.ReplaceAllString(proclamations[i].Content, "") } - // 3. Persist to Database - // Using Transaction ensures we don't end up with partial data if something fails + var storedProclamationSettings []db.Proclamation + database.Select("ID", "Selected").Find(&storedProclamationSettings) + // [ID]Selected + stash := make(map[string]bool) + for _, row := range storedProclamationSettings { + stash[row.ID] = row.Selected + } + + for i := range proclamations { + proclamations[i].Selected = stash[proclamations[i].ID] + } + err = database.Transaction(func(tx *gorm.DB) error { - if err := tx.Omit("selected").Save(&proclamations).Error; err != nil { + // Clear the database + // Where "1 = 1" because batch Delete() requires a condition + // 'Where "1 = 1"' is like saying "while true be true" and tricks GORM into deleting everything + if err := tx.Where("1 = 1").Delete(db.Proclamation{}).Error; err != nil { return err } + // Then re-populate the database + if err := tx.Save(&proclamations).Error; err != nil { + return err + } + // Old sync code + // if err := tx.Omit("selected").Save(&proclamations).Error; err != nil { + // return err + // } return nil }) @@ -59,12 +78,22 @@ func SyncCategories(database *gorm.DB) ([]db.ProclamationCategory, error) { logger.Error("Category sync failed, skipping update: %v", err) return nil, err } + err = database.Transaction(func(tx *gorm.DB) error { + if err := tx.Where("1 = 1").Delete(&db.ProclamationCategory{}).Error; err != nil { + return err + } if err := tx.Save(&categories).Error; err != nil { return err } return nil }) + + if err != nil { + logger.Error("failed to sync proclamation categories: %v", err) + return nil, err + } + logger.Info("Successfully synced proclamation categories: %d", len(categories)) return categories, nil }