package main import ( "context" "fmt" "log" "os" "time" "github.com/jackc/pgx/v5" "geoip-rest/internal/importer" "geoip-rest/internal/userprogram" ) const ( defaultCSVPath = "/initial_data/user_program_info_init_20251208.csv" defaultUpdateDir = "/update_data" defaultTimeout = 10 * time.Minute defaultSchema = "public" defaultLogDir = "/log" targetTableName = "user_program_info_replica" ) func main() { dbURL, err := databaseURL() if err != nil { log.Fatalf("database config: %v", err) } csvPath := env("USER_PROGRAM_INFO_CSV", defaultCSVPath) updateDir := env("USER_PROGRAM_UPDATE_DIR", defaultUpdateDir) schema := env("USER_PROGRAM_INFO_SCHEMA", env("POSTGRES_SCHEMA", defaultSchema)) logDir := env("USER_PROGRAM_IMPORT_LOG_DIR", defaultLogDir) ctx, cancel := context.WithTimeout(context.Background(), defaultTimeout) defer cancel() conn, err := pgx.Connect(ctx, dbURL) if err != nil { log.Fatalf("failed to connect to database: %v", err) } defer conn.Close(context.Background()) if err := importer.EnsureUserProgramReplica(ctx, conn, csvPath, schema, logDir); err != nil { log.Fatalf("failed to ensure %s table: %v", targetTableName, err) } if err := importer.ImportUserProgramUpdates(ctx, conn, updateDir, schema, logDir); err != nil { log.Fatalf("failed to import updates from %s: %v", updateDir, err) } if err := userprogram.SeedIPGeoInfoIfMissing(ctx, conn, schema); err != nil { log.Fatalf("failed to seed ip_geoinfo: %v", err) } log.Printf("%s is ready in schema %s using data from %s (updates: %s)", targetTableName, schema, csvPath, updateDir) } func env(key, fallback string) string { if val := os.Getenv(key); val != "" { return val } return fallback } func databaseURL() (string, error) { if url := os.Getenv("DATABASE_URL"); url != "" { return url, nil } user := os.Getenv("POSTGRES_USER") pass := os.Getenv("POSTGRES_PASSWORD") host := env("POSTGRES_HOST", "localhost") port := env("POSTGRES_PORT", "5432") db := os.Getenv("POSTGRES_DB") if user == "" || pass == "" || db == "" { return "", fmt.Errorf("DATABASE_URL or POSTGRES_{USER,PASSWORD,DB} is required") } return fmt.Sprintf("postgres://%s:%s@%s:%s/%s?sslmode=disable", user, pass, host, port, db), nil }