93 lines
1.7 KiB
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)
|
|
}
|
|
}
|
|
}
|