sarga_updater/main.go

124 lines
2.7 KiB
Go
Raw Normal View History

2023-05-03 08:17:44 +00:00
package main
2023-05-03 08:07:34 +00:00
import (
2023-05-03 08:38:31 +00:00
"fmt"
2023-05-03 09:03:29 +00:00
"github.com/joho/godotenv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
2023-05-03 08:07:34 +00:00
"log"
"os"
2023-05-03 09:03:29 +00:00
"os/signal"
2023-05-03 08:07:34 +00:00
"sarga_updater/bagisto_models"
2023-05-03 09:03:29 +00:00
helper "sarga_updater/helpers"
2023-05-03 08:07:34 +00:00
"sarga_updater/repositories"
2023-05-03 09:03:29 +00:00
"syscall"
2023-05-03 08:07:34 +00:00
"time"
)
2023-05-03 09:03:29 +00:00
func init() {
// logging setup
helper.Setup()
log.Println("init function")
// init .env
err := godotenv.Load()
if err != nil {
log.Fatal(err)
}
}
2023-05-03 08:07:34 +00:00
func main() {
2023-05-03 08:34:50 +00:00
2023-05-03 08:38:31 +00:00
fmt.Println("main started")
2023-05-03 08:07:34 +00:00
// Retrieve database connection information from environment variables
2023-05-03 08:34:50 +00:00
dsn := os.Getenv("BAZA")
2023-05-03 08:51:14 +00:00
log.Println("DSN => ", dsn)
2023-05-03 08:07:34 +00:00
// Connect to the database
2023-05-03 09:03:29 +00:00
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
2023-05-03 08:07:34 +00:00
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{})
2023-05-03 09:56:23 +00:00
go worker(db, stopCh, updatePeriod)
2023-05-03 08:07:34 +00:00
// 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)
2023-05-03 09:03:29 +00:00
}
2023-05-03 08:07:34 +00:00
}
2023-05-03 09:56:23 +00:00
func worker(db *gorm.DB, stopCh <-chan struct{}, updatePeriod time.Duration) {
importer, _ := repositories.ParseImporterInstance(db)
2023-05-03 10:18:01 +00:00
2023-05-03 14:50:17 +00:00
ticker := time.NewTicker(time.Second)
2023-05-03 08:07:34 +00:00
defer ticker.Stop()
2023-05-03 09:09:51 +00:00
log.Printf("Updater worker Started")
2023-05-03 09:56:23 +00:00
2023-05-03 08:07:34 +00:00
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
2023-05-03 09:15:16 +00:00
} else {
2023-05-03 10:12:57 +00:00
log.Println(len(result))
2023-05-03 10:18:01 +00:00
2023-05-03 08:07:34 +00:00
}
// Update products as needed
2023-05-03 09:15:16 +00:00
for index, product := range result {
log.Printf("NO: %d, URL: %s", index, product.TextValue)
2023-05-03 08:07:34 +00:00
// 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)
2023-05-03 10:18:01 +00:00
if err != nil {
log.Println("Error getting product information:", err)
2023-05-03 08:07:34 +00:00
continue
}
2023-05-03 10:18:01 +00:00
// Update the product in the database
2023-05-03 15:19:22 +00:00
if err := importer.UpdateOrCreate(jsonProduct, product.ProductID).Error; err != nil {
2023-05-03 14:45:50 +00:00
log.Println("Error updateing product information:", err)
}
2023-05-03 08:07:34 +00:00
}
2023-05-03 14:45:50 +00:00
log.Printf("%d Products updated", len(result))
2023-05-03 14:50:17 +00:00
ticker = time.NewTicker(updatePeriod)
2023-05-03 08:07:34 +00:00
}
}
}