feat(app state): settings are now global and get updated on the fly
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
package settings
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"lst.net/internal/models"
|
||||
"lst.net/pkg/logger"
|
||||
@@ -41,41 +44,80 @@ var seedConfigData = []models.Settings{
|
||||
{Name: "scannerID", Value: `500`, Description: "What scanner id will we be using for the app", AppService: "logistics", Enabled: true},
|
||||
{Name: "scannerPort", Value: `50002`, Description: "What port instance will we be using?", AppService: "logistics", Enabled: true},
|
||||
{Name: "stagingReturnLocations", Value: `30125,31523`, Description: "What are the staging location IDs we will use to select from. seperated by commas", AppService: "logistics", Enabled: true},
|
||||
{Name: "testingApiFunction", Value: `1`, Description: "This is a test to validate if we set to 0 it will actaully not allow the route", AppService: "logistics", Enabled: true},
|
||||
}
|
||||
|
||||
func SeedSettings(db *gorm.DB, log *logger.CustomLogger) error {
|
||||
|
||||
for _, cfg := range seedConfigData {
|
||||
var existing models.Settings
|
||||
// Try to find config by unique Name
|
||||
result := db.Where("Name =?", cfg.Name).First(&existing)
|
||||
if err := db.Unscoped().Where("name = ?", cfg.Name).First(&existing).Error; err == nil {
|
||||
|
||||
if result.Error != nil {
|
||||
if result.Error == gorm.ErrRecordNotFound {
|
||||
// not here lets add it
|
||||
if existing.DeletedAt.Valid {
|
||||
// Undelete by setting DeletedAt to NULL
|
||||
if err := db.Unscoped().Model(&existing).Update("DeletedAt", gorm.DeletedAt{}).Error; err != nil {
|
||||
log.Error("Failed to undelete settings", "settings", map[string]interface{}{
|
||||
"name": cfg.Name,
|
||||
"error": err,
|
||||
})
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
if err := db.Create(&cfg).Error; err != nil {
|
||||
log.Error("Failed to seed settings", "settings", map[string]interface{}{
|
||||
"name": cfg.Name,
|
||||
"error": err,
|
||||
})
|
||||
}
|
||||
//log.Printf("Seeded new config: %s", cfg.Name)
|
||||
} else {
|
||||
// Some other error
|
||||
return result.Error
|
||||
}
|
||||
|
||||
// // Try to find config by unique Name
|
||||
// result := db.Where("Name =?", cfg.Name).First(&existing)
|
||||
|
||||
// if result.Error != nil {
|
||||
// if result.Error == gorm.ErrRecordNotFound && cfg.Enabled {
|
||||
// // not here lets add it
|
||||
|
||||
// if err := db.Create(&cfg).Error; err != nil && !existing.DeletedAt.Valid {
|
||||
// log.Error("Failed to seed settings", "settings", map[string]interface{}{
|
||||
// "name": cfg.Name,
|
||||
// "error": err,
|
||||
// })
|
||||
// }
|
||||
|
||||
// //log.Printf("Seeded new config: %s", cfg.Name)
|
||||
// } else {
|
||||
// // Some other error
|
||||
// return result.Error
|
||||
// }
|
||||
} else {
|
||||
// only update the fields we want to update.
|
||||
existing.Description = cfg.Description
|
||||
existing.Name = cfg.Name
|
||||
existing.AppService = cfg.AppService
|
||||
if err := db.Save(&existing).Error; err != nil {
|
||||
log.Error("Failed to update ettings.", "settings", map[string]interface{}{
|
||||
"name": cfg.Name,
|
||||
"error": err,
|
||||
})
|
||||
return err
|
||||
// remove the setting if we change to false this will help with future proofing our seeder in the event we need to add it back
|
||||
if cfg.Enabled {
|
||||
existing.Description = cfg.Description
|
||||
existing.Name = cfg.Name
|
||||
existing.AppService = cfg.AppService
|
||||
if err := db.Save(&existing).Error; err != nil {
|
||||
log.Error("Failed to update ettings.", "settings", map[string]interface{}{
|
||||
"name": cfg.Name,
|
||||
"error": err,
|
||||
})
|
||||
return err
|
||||
}
|
||||
} else {
|
||||
// we delete the setting so its no longer there
|
||||
if err := db.Delete(&existing).Error; err != nil {
|
||||
log.Error("Failed to delete ettings.", "settings", map[string]interface{}{
|
||||
"name": cfg.Name,
|
||||
"error": err,
|
||||
})
|
||||
return err
|
||||
}
|
||||
settingDelete := fmt.Sprintf("Updated existing config: %s", cfg.Name)
|
||||
log.Info(settingDelete, "settings", map[string]interface{}{})
|
||||
}
|
||||
|
||||
//log.Printf("Updated existing config: %s", cfg.Name)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user