From 389213ceb8edc7c0e7947fda9106b3da19f0cd04 Mon Sep 17 00:00:00 2001 From: Yege1893 <yannick.ege@web.de> Date: Fri, 7 Jul 2023 15:43:58 +0200 Subject: [PATCH] nats implemented --- src/emailnotification/.env | 2 +- src/emailnotification/Dockerfile | 3 +- src/emailnotification/main.go | 101 +++++++----------- src/emailnotification/model/emailContent.go | 12 +-- src/emailnotification/model/natsResponse.go | 5 + src/emailnotification/service/email.go | 2 +- src/emailnotification/service/nats.go | 23 ++++ src/highlanderticketing/.env | 2 +- src/highlanderticketing/main.go | 28 +++-- src/highlanderticketing/model/emailContent.go | 10 +- src/highlanderticketing/model/natsResponse.go | 5 + src/highlanderticketing/service/nats.go | 30 ++++++ 12 files changed, 139 insertions(+), 84 deletions(-) create mode 100644 src/emailnotification/model/natsResponse.go create mode 100644 src/emailnotification/service/nats.go create mode 100644 src/highlanderticketing/model/natsResponse.go create mode 100644 src/highlanderticketing/service/nats.go diff --git a/src/emailnotification/.env b/src/emailnotification/.env index 877c343..dbec04d 100644 --- a/src/emailnotification/.env +++ b/src/emailnotification/.env @@ -2,4 +2,4 @@ EMAIL_PW=NEMOWeiß1! EMAIL_ADRESS=Yannick.ege@web.de -NATS_URL=nats://nats:4222 \ No newline at end of file +NATS_URI=nats://nats:4222 \ No newline at end of file diff --git a/src/emailnotification/Dockerfile b/src/emailnotification/Dockerfile index 1491568..2946e19 100644 --- a/src/emailnotification/Dockerfile +++ b/src/emailnotification/Dockerfile @@ -2,7 +2,7 @@ FROM golang:1.20-buster # non-go modules dependencies RUN apt update -# copy code and protobuf +# copy code WORKDIR /go/src/app COPY ./emailnotification . @@ -12,6 +12,7 @@ RUN go install RUN wget https://raw.githubusercontent.com/vishnubob/wait-for-it/81b1373f17855a4dc21156cfe1694c31d7d1792e/wait-for-it.sh RUN chmod +x ./wait-for-it.sh ./docker-entrypoint.sh +ENTRYPOINT ["./docker-entrypoint.sh"] CMD ["emailnotification"] EXPOSE 8001 \ No newline at end of file diff --git a/src/emailnotification/main.go b/src/emailnotification/main.go index d7b96ae..2dbadfe 100644 --- a/src/emailnotification/main.go +++ b/src/emailnotification/main.go @@ -1,81 +1,60 @@ package main import ( + "encoding/json" "fmt" "log" - "os" - "sync" - "time" + "net/http" - "github.com/joho/godotenv" "github.com/nats-io/nats.go" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/emailnotification/model" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/emailnotification/service" ) func main() { - err := godotenv.Load(".env") + nc, err := service.ConnectToNats() if err != nil { - log.Fatalf("Error loading .env file: %v", err) + log.Fatalf("unable to connect to nats", err) } - fmt.Println("aufgerufen") - - time.Sleep(2 * time.Second) - - natsUrl := os.Getenv("NATS_URL") - nc, err := nats.Connect(natsUrl) - if err != nil { - log.Fatalf("Error connecting to NATS server: %v", err) - } - defer nc.Close() - - var wg sync.WaitGroup - - wg.Add(2) - - go func() { - defer wg.Done() - fmt.Println("wird aufgerufen") - orderSub, err := nc.SubscribeSync("Order") - if err != nil { - log.Fatalf("Error subscribing to 'Order': %v", err) - } - log.Println("Service hört auf die Subscription:", orderSub.Subject) - - for { - msg, err := orderSub.NextMsg(-1) - if err != nil { - log.Println("Error receiving message:", err) - continue - } - if msg != nil { - log.Printf("Nachricht erhalten: %s", msg.Data) - msg.Ack() - } + nc.Subscribe("confirmOrder", func(m *nats.Msg) { + var ( + req model.EmialContent + res model.Response + ) + if err := json.Unmarshal(m.Data, &req); err != nil { + panic(err) } - }() + // hier email verschicken auslösen, wenn kein error --> dann response tru verschicken - go func() { - defer wg.Done() - cancelationSub, err := nc.SubscribeSync("Cancelation") - if err != nil { - log.Fatalf("Error subscribing to 'Cancelation': %v", err) + res.Send = true + e, errMarshal := json.Marshal(res) + if errMarshal != nil { + fmt.Println(errMarshal) + return } - log.Println("Service hört auf die Subscription:", cancelationSub.Subject) - - for { - msg, err := cancelationSub.NextMsg(-1) - if err != nil { - log.Println("Error receiving message:", err) - continue - } - if msg != nil { - log.Printf("Nachricht erhalten: %s", msg.Data) - msg.Ack() - } + nc.Publish(m.Reply, []byte(e)) + }) + + nc.Subscribe("confirmCancel", func(m *nats.Msg) { + var ( + req model.EmialContent + res model.Response + ) + if err := json.Unmarshal(m.Data, &req); err != nil { + panic(err) + } + res.Send = true + e, errMarshal := json.Marshal(res) + if errMarshal != nil { + fmt.Println(errMarshal) + return } + nc.Publish(m.Reply, []byte(e)) + }) - }() - wg.Wait() + if err := http.ListenAndServe(":8181", nil); err != nil { + log.Fatal(err) + } - fmt.Println("Alle Go-Routinen sind abgeschlossen. Hauptprogramm wird beendet.") } diff --git a/src/emailnotification/model/emailContent.go b/src/emailnotification/model/emailContent.go index 2b3decb..7c85411 100644 --- a/src/emailnotification/model/emailContent.go +++ b/src/emailnotification/model/emailContent.go @@ -1,9 +1,9 @@ package model -type EmialContenct struct { - Name string - AwayMatch bool - Location string - Date string - Emailadress string +type EmialContent struct { + Name string `json:"name"` + AwayMatch bool `json:"awaymatch"` + Location string `json:"location"` + Date string `json:"date"` + Emailadress string `json:"emailadress"` } diff --git a/src/emailnotification/model/natsResponse.go b/src/emailnotification/model/natsResponse.go new file mode 100644 index 0000000..ea4856d --- /dev/null +++ b/src/emailnotification/model/natsResponse.go @@ -0,0 +1,5 @@ +package model + +type Response struct { + Send bool `json:"send"` +} diff --git a/src/emailnotification/service/email.go b/src/emailnotification/service/email.go index 2618c2d..f4276c3 100644 --- a/src/emailnotification/service/email.go +++ b/src/emailnotification/service/email.go @@ -12,7 +12,7 @@ import ( "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/emailnotification/model" ) -func CreateEmail(emailContenct model.EmialContenct, subject string) (string, string, string) { +func CreateEmail(emailContenct model.EmialContent, subject string) (string, string, string) { if subject == "confirmOrder" { return emailContenct.Emailadress, fmt.Sprintf("Hallo Herr/Frau, %s\r\nHiermit bestaetigen wird deine Bestellung fuer das VFB Spiel in %s, am %s", emailContenct.Name, emailContenct.Location, emailContenct.Date), "Confirm Cancelation" } diff --git a/src/emailnotification/service/nats.go b/src/emailnotification/service/nats.go new file mode 100644 index 0000000..f2a82a6 --- /dev/null +++ b/src/emailnotification/service/nats.go @@ -0,0 +1,23 @@ +package service + +import ( + "log" + "os" + + "github.com/joho/godotenv" + "github.com/nats-io/nats.go" +) + +func ConnectToNats() (*nats.Conn, error) { + if err := godotenv.Load(".env"); err != nil { + log.Fatalf("Error loading .env file") + } + uri := os.Getenv("NATS_URI") + var err error + var nc *nats.Conn + nc, err = nats.Connect(uri) + if err != nil { + log.Fatal("Error establishing connection to NATS:", err) + } + return nc, nil +} diff --git a/src/highlanderticketing/.env b/src/highlanderticketing/.env index 82bb259..6dd7f7e 100644 --- a/src/highlanderticketing/.env +++ b/src/highlanderticketing/.env @@ -1 +1 @@ -NATS_URL=nats://nats:4222 \ No newline at end of file +NATS_URI=nats://nats:4222 \ No newline at end of file diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go index 6801c5c..69278d4 100644 --- a/src/highlanderticketing/main.go +++ b/src/highlanderticketing/main.go @@ -4,7 +4,6 @@ import ( "fmt" "net/http" "os" - "time" "github.com/gorilla/mux" "github.com/joho/godotenv" @@ -12,6 +11,8 @@ import ( log "github.com/sirupsen/logrus" "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/db" "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/handler" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/service" ) func main() { @@ -21,22 +22,33 @@ func main() { fmt.Println(userArray) service.DeleteAllMatches() api.GetMatchesOfApiToDb("https://api.openligadb.de/getmatchesbyteamid/16/5/0")*/ - //init db if err := godotenv.Load(".env"); err != nil { log.Fatalf("Error loading .env file") } - natsUrl := os.Getenv("NATS_URL") - nc, _ := nats.Connect(natsUrl) - - rep, _ := nc.Request("Order", nil, time.Second) - fmt.Println("hier die response", rep) - _, err := db.GetMongoClient() if err != nil { log.Fatal(err) } + + var natsServer service.NatsServer + + uri := os.Getenv("NATS_URI") + + nc, err := nats.Connect(uri) + if err == nil { + natsServer.Nc = nc + } + if err != nil { + log.Fatal("Error establishing connection to NATS:", err) + } + + fmt.Println("Connected to NATS at:", natsServer.Nc.ConnectedUrl()) + + e := model.EmialContent{Name: "aa", AwayMatch: true, Location: "ss", Date: "aaa", Emailadress: "aaa"} + natsServer.ConfirmOrder(&e) + log.Println("Starting Highlander Ticketing server") router := mux.NewRouter() router.HandleFunc("/login", handler.HandleLogin).Methods("GET") diff --git a/src/highlanderticketing/model/emailContent.go b/src/highlanderticketing/model/emailContent.go index 10dedd3..7c85411 100644 --- a/src/highlanderticketing/model/emailContent.go +++ b/src/highlanderticketing/model/emailContent.go @@ -1,9 +1,9 @@ package model type EmialContent struct { - string - Name string - AwayMatch bool - Location string - Date string + Name string `json:"name"` + AwayMatch bool `json:"awaymatch"` + Location string `json:"location"` + Date string `json:"date"` + Emailadress string `json:"emailadress"` } diff --git a/src/highlanderticketing/model/natsResponse.go b/src/highlanderticketing/model/natsResponse.go new file mode 100644 index 0000000..ea4856d --- /dev/null +++ b/src/highlanderticketing/model/natsResponse.go @@ -0,0 +1,5 @@ +package model + +type Response struct { + Send bool `json:"send"` +} diff --git a/src/highlanderticketing/service/nats.go b/src/highlanderticketing/service/nats.go new file mode 100644 index 0000000..cacd302 --- /dev/null +++ b/src/highlanderticketing/service/nats.go @@ -0,0 +1,30 @@ +package service + +import ( + "encoding/json" + "fmt" + "log" + "time" + + "github.com/nats-io/nats.go" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model" +) + +type NatsServer struct { + Nc *nats.Conn +} + +func (s NatsServer) ConfirmOrder(e *model.EmialContent) { + emailContenct, errMarshal := json.Marshal(e) + if errMarshal != nil { + fmt.Println(errMarshal) + return + } + response, err := s.Nc.Request("confirmOrder", []byte(emailContenct), 2*time.Second) + if err != nil { + log.Println("Error making NATS request:", err) + } + fmt.Println("hier die nats response", string(response.Data)) +} + +// hier dann confirm cancel -- GitLab