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