94 lines
2.2 KiB
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)
|
|
}
|
|
}
|
|
}
|
|
}
|