package main import ( "database/sql" "fmt" _ "github.com/lib/pq" "go-weather/config" "go-weather/handlers" "go-weather/services" "log" "net/http" "os" "os/signal" "time" ) func startPoller(db *sql.DB, ws *services.WeatherService, defaultCity string, interval time.Duration) { // Use the service weather, err := ws.FetchWeather(defaultCity) if err != nil { log.Printf("poller: fetch failed: %v", err) } else { ds := services.NewDatabaseService(db) id, err := ds.SaveReading(weather) if err != nil { log.Printf("poller: save failed %v", err) } else { log.Printf("poller: saved reading #%d for %s (%.1f F)", id, weather.Name, weather.Main.Temp) } } ticker := time.NewTicker(interval) defer ticker.Stop() for range ticker.C { weather, err := ws.FetchWeather(defaultCity) if err != nil { log.Printf("poller fetch failed: %v", err) continue } ds := services.NewDatabaseService(db) id, err := ds.SaveReading(weather) if err != nil { log.Printf("poller: save failed: %v", err) continue } log.Printf("poller: saved reading #%d for %s (%.1f F)", id, weather.Name, weather.Main.Temp) } } func main() { config := config.Load() // Connect to DB connStr := fmt.Sprintf( "host=%s port=%s user=%s password=%s dbname=%s sslmode=disable", config.DBHost, config.DBPort, config.DBUser, config.DBPassword, config.DBName, ) database, err := services.ConnectDB(connStr) if err != nil { log.Fatalf("failed to connect to db: %v", err) } defer database.Close() databaseService := services.NewDatabaseService(database) // Setup weather_readings table if err := databaseService.CreateTable(); err != nil { log.Fatalf("failed to create table: %v", err) } // Create services weatherService := services.NewWeatherService(config.APIKey) // Create route handlers weatherHandler := handlers.NewWeatherHandler(weatherService, databaseService, config.DefaultCity) // Start background poller go startPoller(database, weatherService, config.DefaultCity, 10*time.Minute) // Register routes http.HandleFunc("/weather/fetch", weatherHandler.FetchWeather) http.HandleFunc("/weather/history", weatherHandler.GetHistory) http.HandleFunc("/health", handlers.Health) http.HandleFunc("/latest-temperature", handlers.LatestTemperature) http.HandleFunc("/test", handlers.Test) // Start server go func() { fmt.Println("server listening on :8080") if err := http.ListenAndServe(":8080", nil); err != nil { log.Fatalf("server failed: %v", err) } }() // Wait for shutdown quit := make(chan os.Signal, 1) signal.Notify(quit, os.Interrupt) <-quit fmt.Println("\nshutting down...") }