campingmontagut/cmd/camper-weather/main.go

93 lines
1.7 KiB
Go

package main
import (
"context"
"dev.tandem.ws/tandem/camper/pkg/database"
"encoding/json"
"log"
"net/http"
"os"
"strconv"
"time"
)
type Temperature struct {
Day float64 `json:"day"`
Min float64 `json:"min"`
}
type Weather struct {
ID int `json:"id"`
}
type Forecast struct {
Timestamp int64 `json:"dt"`
Weather []Weather `json:"weather"`
Temperature Temperature `json:"temp"`
}
type OpenWeatherMap struct {
Forecasts []Forecast `json:"list"`
}
func main() {
db, err := database.New(context.Background(), os.Getenv("CAMPER_DATABASE_URL"))
if err != nil {
log.Fatal(err)
}
defer db.Close()
conn, err := db.Acquire(context.Background())
if err != nil {
log.Fatal(err)
}
defer conn.Release()
updateForecast(context.Background(), conn)
}
func updateForecast(ctx context.Context, conn *database.Conn) {
if _, err := conn.Exec(ctx, "set role to admin"); err != nil {
log.Fatal(err)
}
var stationURL string
if err := conn.QueryRow(ctx, `
select station_uri
from weather_forecast
`).Scan(
&stationURL,
); err != nil {
log.Fatal(err)
}
resp, err := http.Get(stationURL)
if err != nil {
log.Fatal(err)
}
var result OpenWeatherMap
if err := json.NewDecoder(resp.Body).Decode(&result); err != nil {
log.Fatal(err)
}
for _, forecast := range result.Forecasts {
if _, err := conn.Exec(ctx, `
update weather_forecast
set weather_condition_id = $1
, day_temperature = $2
, min_temperature = $3
, forecasted_at = $4
, updated_at = current_timestamp
where station_uri = $5
`,
strconv.Itoa(forecast.Weather[0].ID),
forecast.Temperature.Day,
forecast.Temperature.Min,
time.Unix(forecast.Timestamp, 0),
stationURL,
); err != nil {
log.Fatal(err)
}
}
}