From 3bd9170735a3fec242614d6cabf19f18433c05bc Mon Sep 17 00:00:00 2001 From: jinsu Date: Thu, 4 Dec 2025 23:26:15 +0900 Subject: [PATCH] =?UTF-8?q?nats=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.template | 5 ++- cmd/openweather/main.go | 70 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/.env.template b/.env.template index 281c2db..0e393f5 100644 --- a/.env.template +++ b/.env.template @@ -1 +1,4 @@ -OPENWEATHER_API_KEY= \ No newline at end of file +OPENWEATHER_API_KEY= +OPENWEATHER_LAT=37 +OPENWEATHER_LON=126 +NATS_URL= \ No newline at end of file diff --git a/cmd/openweather/main.go b/cmd/openweather/main.go index f93b2c4..d2b1f0a 100644 --- a/cmd/openweather/main.go +++ b/cmd/openweather/main.go @@ -2,13 +2,18 @@ package main import ( "context" + "encoding/json" "log" "os" "runtime/debug" "strconv" + "time" "github.com/go-co-op/gocron/v2" "github.com/joho/godotenv" + "github.com/neatflowcv/seven-skies/internal/pkg/broker" + "github.com/neatflowcv/seven-skies/internal/pkg/broker/nats" + "github.com/neatflowcv/seven-skies/internal/pkg/domain" "github.com/neatflowcv/seven-skies/internal/pkg/openweather" ) @@ -22,6 +27,8 @@ func version() string { } func main() { + log.Println("version", version()) + godotenv.Load() key := os.Getenv("OPENWEATHER_API_KEY") @@ -39,7 +46,16 @@ func main() { log.Panic("OPENWEATHER_LON is not set") } - log.Println("version", version()) + NATS_URL := os.Getenv("NATS_URL") + if NATS_URL == "" { + log.Panic("NATS_URL is not set") + } + + broker, err := nats.NewBroker(context.Background(), NATS_URL, "SEVEN_SKIES_STREAM", []string{"SEVEN_SKIES_SUBJECT.>"}) + if err != nil { + log.Panic("error in create broker", err) + } + defer broker.Close() scheduler, err := gocron.NewScheduler() if err != nil { @@ -63,7 +79,7 @@ func main() { log.Panic("error in parse lon", err) } - err = Task(key, latFloat, lonFloat) + err = Task(context.Background(), broker, key, latFloat, lonFloat) if err != nil { log.Panic("error in task", err) } @@ -73,6 +89,8 @@ func main() { // 5분을 준 이유는 업데이트가 바로 된다는 보장이 없어서 gocron.NewTask( Task, + context.Background(), + broker, key, latFloat, lonFloat, @@ -88,20 +106,66 @@ func main() { if err != nil { log.Panic("error in get next run", err) } + log.Println("next run", nextRun) select {} } -func Task(key string, lat float64, lon float64) error { +func Task(ctx context.Context, broker broker.Broker, key string, lat float64, lon float64) error { log.Println("get forecast") + forecast, err := openweather.Forecast(context.Background(), key, lat, lon) if err != nil { log.Println("error in get forecast", err) + return err } log.Println("get forecast successfully", forecast) + for _, list := range forecast.List { + weatherEvent := domain.WeatherEvent{ + Date: time.Unix(int64(list.Dt), 0), + Condition: decideCondition(list.Weather[0].Main), + Temperature: &domain.Temperature{Value: domain.Celsius(list.Main.Temp)}, + High: &domain.Temperature{Value: domain.Celsius(list.Main.TempMax)}, + Low: &domain.Temperature{Value: domain.Celsius(list.Main.TempMin)}, + } + + message, err := json.Marshal(weatherEvent) + if err != nil { + log.Println("error in marshal weather event", err) + + continue + } + + err = broker.Publish(ctx, "SEVEN_SKIES_SUBJECT.OPENWEATHER", message) + if err != nil { + log.Println("error in publish weather event", err) + + continue + } + } + return nil } + +func decideCondition(main string) domain.WeatherCondition { + switch main { + case "Thunderstorm", "Drizzle", "Rain": + return domain.WeatherConditionRain + + case "Snow": + return domain.WeatherConditionSnow + + case "Mist", "Smoke", "Haze", "Dust", "Fog", "Sand", "Ash", "Squall", "Tornado", "Clouds": + return domain.WeatherConditionCloudy + + case "Clear": + return domain.WeatherConditionClear + + default: + return domain.WeatherConditionUnknown + } +}