sarga_updater/main.go

94 lines
2.2 KiB
Go

package main
import (
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
"os"
"os/signal"
"sarga_updater/bagisto_models"
"sarga_updater/repositories"
"syscall"
"time"
)
func main() {
// Retrieve database connection information from environment variables
dsn := os.Getenv("DB_DSN")
// Connect to the database
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatalf("Error connecting to database: %s", err)
}
importer, _ := repositories.ParseImporterInstance(db)
updatePeriodStr := os.Getenv("UPDATE_PERIOD")
updatePeriod, err := time.ParseDuration(updatePeriodStr)
if err != nil {
log.Fatal("Error parsing update period:", err)
}
// Start the worker
stopCh := make(chan struct{})
go worker(importer, stopCh, updatePeriod)
// Wait for termination signal
signalCh := make(chan os.Signal, 1)
signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
<-signalCh
// Stop the worker
close(stopCh)
// Close the database connection
sqlDB, err := db.DB()
if err != nil {
log.Fatalf("Error getting database connection from gorm: %s", err)
}
err = sqlDB.Close()
if err != nil {
log.Fatalf("Error closing database connection: %s", err)
}
}
func worker(importer *repositories.Importer, stopCh <-chan struct{}, updatePeriod time.Duration) {
ticker := time.NewTicker(updatePeriod)
defer ticker.Stop()
for {
select {
case <-stopCh:
return
case <-ticker.C:
result, err := bagisto_models.GetFlatSources(importer.Baza)
if err != nil {
log.Println("Error retrieving products:", err)
continue
}
// Update products as needed
for _, product := range result {
// Retrieve the latest information from the source URL
parser := repositories.NewLinkParser(product.TextValue)
data, err := parser.ParseLink()
if err != nil {
log.Println("Error decoding product information:", err)
continue
}
jsonProduct, err := parser.GetProductDetailWithOptions(data.ID, data.ProductGroupID)
// Update the product in the database
if err := importer.UpdateOrCreate(jsonProduct).Error; err != nil {
log.Println("Error decoding product information:", err)
continue
}
log.Printf("Product %d updated: %+v\n", product.ID, product)
}
}
}
}