90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"log"
|
|
"os"
|
|
"time"
|
|
|
|
"github.com/timetracker/backend/internal/models"
|
|
"gorm.io/gorm/logger"
|
|
)
|
|
|
|
func main() {
|
|
// Parse command line flags
|
|
force := false
|
|
for _, arg := range os.Args[1:] {
|
|
if arg == "--force" || arg == "-f" {
|
|
force = true
|
|
}
|
|
}
|
|
|
|
// Get database configuration with sensible defaults
|
|
dbConfig := models.DefaultDatabaseConfig()
|
|
|
|
// Override with environment variables if provided
|
|
if host := os.Getenv("DB_HOST"); host != "" {
|
|
dbConfig.Host = host
|
|
}
|
|
if port := os.Getenv("DB_PORT"); port != "" {
|
|
var portInt int
|
|
if _, err := fmt.Sscanf(port, "%d", &portInt); err == nil && portInt > 0 {
|
|
dbConfig.Port = portInt
|
|
}
|
|
}
|
|
if user := os.Getenv("DB_USER"); user != "" {
|
|
dbConfig.User = user
|
|
}
|
|
if password := os.Getenv("DB_PASSWORD"); password != "" {
|
|
dbConfig.Password = password
|
|
}
|
|
if dbName := os.Getenv("DB_NAME"); dbName != "" {
|
|
dbConfig.DBName = dbName
|
|
}
|
|
if sslMode := os.Getenv("DB_SSLMODE"); sslMode != "" {
|
|
dbConfig.SSLMode = sslMode
|
|
}
|
|
|
|
// Set log level
|
|
dbConfig.LogLevel = logger.Info
|
|
|
|
// Initialize database
|
|
fmt.Println("Connecting to database...")
|
|
if err := models.InitDB(dbConfig); err != nil {
|
|
log.Fatalf("Error initializing database: %v", err)
|
|
}
|
|
defer func() {
|
|
if err := models.CloseDB(); err != nil {
|
|
log.Printf("Error closing database connection: %v", err)
|
|
}
|
|
}()
|
|
fmt.Println("✓ Database connection successful")
|
|
|
|
// Create context with timeout
|
|
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
|
|
defer cancel()
|
|
|
|
// Check if we need to seed (e.g., no companies exist)
|
|
if !force {
|
|
var count int64
|
|
db := models.GetEngine(ctx)
|
|
if err := db.Model(&models.Company{}).Count(&count).Error; err != nil {
|
|
log.Fatalf("Error checking if seeding is needed: %v", err)
|
|
}
|
|
|
|
// If data already exists, skip seeding
|
|
if count > 0 {
|
|
fmt.Println("Database already contains data. Use --force to override.")
|
|
return
|
|
}
|
|
}
|
|
|
|
// Seed the database
|
|
fmt.Println("Seeding database with initial data...")
|
|
if err := models.SeedDB(ctx); err != nil {
|
|
log.Fatalf("Error seeding database: %v", err)
|
|
}
|
|
fmt.Println("✓ Database seeding completed successfully")
|
|
}
|