Files
go-weather/main.go
T
2026-02-18 15:35:56 -08:00

96 lines
2.6 KiB
Go

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...")
}