nats 적용

This commit is contained in:
2025-12-04 23:26:15 +09:00
parent 13990d8d8f
commit 3bd9170735
2 changed files with 71 additions and 4 deletions

View File

@@ -1 +1,4 @@
OPENWEATHER_API_KEY= OPENWEATHER_API_KEY=
OPENWEATHER_LAT=37
OPENWEATHER_LON=126
NATS_URL=

View File

@@ -2,13 +2,18 @@ package main
import ( import (
"context" "context"
"encoding/json"
"log" "log"
"os" "os"
"runtime/debug" "runtime/debug"
"strconv" "strconv"
"time"
"github.com/go-co-op/gocron/v2" "github.com/go-co-op/gocron/v2"
"github.com/joho/godotenv" "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" "github.com/neatflowcv/seven-skies/internal/pkg/openweather"
) )
@@ -22,6 +27,8 @@ func version() string {
} }
func main() { func main() {
log.Println("version", version())
godotenv.Load() godotenv.Load()
key := os.Getenv("OPENWEATHER_API_KEY") key := os.Getenv("OPENWEATHER_API_KEY")
@@ -39,7 +46,16 @@ func main() {
log.Panic("OPENWEATHER_LON is not set") 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() scheduler, err := gocron.NewScheduler()
if err != nil { if err != nil {
@@ -63,7 +79,7 @@ func main() {
log.Panic("error in parse lon", err) log.Panic("error in parse lon", err)
} }
err = Task(key, latFloat, lonFloat) err = Task(context.Background(), broker, key, latFloat, lonFloat)
if err != nil { if err != nil {
log.Panic("error in task", err) log.Panic("error in task", err)
} }
@@ -73,6 +89,8 @@ func main() {
// 5분을 준 이유는 업데이트가 바로 된다는 보장이 없어서 // 5분을 준 이유는 업데이트가 바로 된다는 보장이 없어서
gocron.NewTask( gocron.NewTask(
Task, Task,
context.Background(),
broker,
key, key,
latFloat, latFloat,
lonFloat, lonFloat,
@@ -88,20 +106,66 @@ func main() {
if err != nil { if err != nil {
log.Panic("error in get next run", err) log.Panic("error in get next run", err)
} }
log.Println("next run", nextRun) log.Println("next run", nextRun)
select {} 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") log.Println("get forecast")
forecast, err := openweather.Forecast(context.Background(), key, lat, lon) forecast, err := openweather.Forecast(context.Background(), key, lat, lon)
if err != nil { if err != nil {
log.Println("error in get forecast", err) log.Println("error in get forecast", err)
return err return err
} }
log.Println("get forecast successfully", forecast) 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 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
}
}