119 lines
2.6 KiB
Go
119 lines
2.6 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/joho/godotenv"
|
|
"gorm.io/driver/mysql"
|
|
"gorm.io/gorm"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"sarga_updater/bagisto_models"
|
|
helper "sarga_updater/helpers"
|
|
"sarga_updater/repositories"
|
|
"syscall"
|
|
"time"
|
|
)
|
|
|
|
func init() {
|
|
// logging setup
|
|
helper.Setup()
|
|
|
|
log.Println("init function")
|
|
|
|
// init .env
|
|
err := godotenv.Load()
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
|
|
func main() {
|
|
|
|
fmt.Println("main started")
|
|
|
|
// Retrieve database connection information from environment variables
|
|
dsn := os.Getenv("BAZA")
|
|
log.Println("DSN => ", 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)
|
|
}
|
|
|
|
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(db, 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(db *gorm.DB, stopCh <-chan struct{}, updatePeriod time.Duration) {
|
|
importer, _ := repositories.ParseImporterInstance(db)
|
|
ticker := time.NewTicker(time.Second)
|
|
ticker = time.NewTicker(updatePeriod)
|
|
defer ticker.Stop()
|
|
log.Printf("Updater worker Started")
|
|
|
|
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
|
|
} else {
|
|
log.Println(len(result))
|
|
continue
|
|
}
|
|
|
|
// Update products as needed
|
|
for index, product := range result {
|
|
log.Printf("NO: %d, URL: %s", index, product.TextValue)
|
|
// 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)
|
|
}
|
|
}
|
|
}
|
|
}
|