diff --git a/src/emailnotification/service/email.go b/src/emailnotification/service/email.go index 9572f56715db3b1ceb1906807be14a10acd1131f..cacd6c2a4b1874e91b5f84e1ec534944ab0911d7 100644 --- a/src/emailnotification/service/email.go +++ b/src/emailnotification/service/email.go @@ -14,7 +14,7 @@ import ( func CreateEmail(emailContenct model.EmialContent, subject string) (string, string, string) { if subject == "confirm" { - 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 Order" + return emailContenct.Emailadress, fmt.Sprintf("Hallo Herr/Frau, %s\r\nHiermit bestaetigen wird deine Bestellung fuer das VFB Spiel", emailContenct.Name), "Confirm Order" } if subject == "cancel" { return emailContenct.Emailadress, fmt.Sprintf("Hallo Herr/Frau, %s\r\nHiermit bestaetigen wird die Stornierung deiner Bestellung fuer das VFB Spiel in %s, am %s", emailContenct.Name, emailContenct.Location, emailContenct.Date), "Confirm Cancelation" diff --git a/src/highlanderticketing/.env b/src/highlanderticketing/.env index 6dd7f7eefa0826bb6ead6e17dc405470c8bd5f85..9e9bcbe2adab66141afa4e02941e8ff91e830ad7 100644 --- a/src/highlanderticketing/.env +++ b/src/highlanderticketing/.env @@ -1 +1,3 @@ -NATS_URI=nats://nats:4222 \ No newline at end of file +NATS_URI=nats://nats:4222 +CLIENT_ID=20993146996-uvmr7479e3qmhiu9gasko3lr163ll76j.apps.googleusercontent.com +CLIENT_SECRET=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 \ No newline at end of file diff --git a/src/highlanderticketing/api/match.go b/src/highlanderticketing/api/match.go index 0bdf3c22a7ffbd7c75faba6e0f6823b7c0522aa8..cd4fea9151aacb9c822cd97a8224a6637a08a732 100644 --- a/src/highlanderticketing/api/match.go +++ b/src/highlanderticketing/api/match.go @@ -2,40 +2,44 @@ package api import ( "encoding/json" - "fmt" "io" "net/http" "time" + log "github.com/sirupsen/logrus" "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model" ) func GetMatchesOfApi(apiUrl string) ([]*model.Match, error) { data, err := getData(apiUrl) if err != nil { + log.Errorf("Failure loading data of match %v", err) return []*model.Match{}, err } matches, err := formatJsonToMatch(data) if err != nil { + log.Errorf("Failure formating match %v", err) return []*model.Match{}, err } - fmt.Println(matches) + log.Info("Got matches of API") return matches, nil } func GetlatestMatchesOfApi(url string, updateChan chan<- *model.Match) error { data, err := getData(url) if err != nil { + log.Errorf("Failure loading data of match %v", err) return err } matches, err := formatJsonToMatch(data) if err != nil { + log.Errorf("Failure formating match %v", err) return err } for _, match := range matches { updateChan <- match } - + log.Info("added matches to chain") return nil } @@ -43,22 +47,25 @@ func getData(apiUrl string) ([]byte, error) { request, err := http.NewRequest("GET", apiUrl, nil) if err != nil { + log.Errorf("Failure creating request %v", err) return []byte{}, err } client := &http.Client{} - response, error := client.Do(request) + response, err := client.Do(request) - if error != nil { - fmt.Println(error) + if err != nil { + log.Errorf("Failure making request %v", err) + return []byte{}, err } responseBody, err := io.ReadAll(response.Body) if err != nil { + log.Errorf("Failure searalizing request %v", err) return []byte{}, err } defer response.Body.Close() - + log.Info("Got data of API") return responseBody, nil } @@ -67,6 +74,7 @@ func formatJsonToMatch(jsonArray []byte) ([]*model.Match, error) { var results []map[string]interface{} if err := json.Unmarshal(jsonArray, &results); err != nil { + log.Errorf("Failure unmarshaling data %v", err) return nil, err } @@ -77,6 +85,7 @@ func formatJsonToMatch(jsonArray []byte) ([]*model.Match, error) { matchDate, err := time.Parse("2006-01-02T15:04:05", result["matchDateTime"].(string)) if err != nil { + log.Errorf("Failure parsing date %v", err) return nil, err } match.Date = matchDate @@ -107,5 +116,6 @@ func formatJsonToMatch(jsonArray []byte) ([]*model.Match, error) { } matches = append(matches, &match) } + log.Info("formated matches in json") return matches, nil } diff --git a/src/highlanderticketing/config/oauthconf.go b/src/highlanderticketing/config/oauthconf.go index b1013e8758eb63bd5d482df1ee146d3c4bfec4e0..60cc802a1013437dcfdd3cc5fc396e184d35dccc 100644 --- a/src/highlanderticketing/config/oauthconf.go +++ b/src/highlanderticketing/config/oauthconf.go @@ -1,15 +1,21 @@ package config import ( + "log" + "os" + + "github.com/joho/godotenv" "golang.org/x/oauth2" "golang.org/x/oauth2/google" ) -// in env varialben packen func GetOAuthConfigLogin() *oauth2.Config { + if err := godotenv.Load(".env"); err != nil { + log.Fatalf("Error loading .env file") + } return &oauth2.Config{ - ClientID: "20993146996-uvmr7479e3qmhiu9gasko3lr163ll76j.apps.googleusercontent.com", - ClientSecret: "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", + ClientID: os.Getenv("CLIENT_ID"), + ClientSecret: os.Getenv("CLIENT_SECRET"), RedirectURL: "http://localhost:8000/callback/login", Scopes: []string{ "https://www.googleapis.com/auth/userinfo.email", @@ -20,9 +26,12 @@ func GetOAuthConfigLogin() *oauth2.Config { } func GetOAuthConfigRegister() *oauth2.Config { + if err := godotenv.Load(".env"); err != nil { + log.Fatalf("Error loading .env file") + } return &oauth2.Config{ - ClientID: "20993146996-uvmr7479e3qmhiu9gasko3lr163ll76j.apps.googleusercontent.com", - ClientSecret: "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", + ClientID: os.Getenv("CLIENT_ID"), + ClientSecret: os.Getenv("CLIENT_SECRET"), RedirectURL: "http://localhost:8000/callback/register", Scopes: []string{ "https://www.googleapis.com/auth/userinfo.email", diff --git a/src/highlanderticketing/db/db.go b/src/highlanderticketing/db/db.go index 3718292fe17b2dba3a2c169f522afbfddf9d5bd6..a2e6500b670b4ef7bc59be021edb2fec238be262 100644 --- a/src/highlanderticketing/db/db.go +++ b/src/highlanderticketing/db/db.go @@ -2,9 +2,10 @@ package db import ( "context" - "fmt" "sync" + log "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) @@ -21,6 +22,7 @@ const ( DBUSER = "db_user" MATCHES = "col_matches" USERS = "col_users" + USERS_TEST = "col_users_test" POOL_SIZE = 10000 // Anzahl der Verbindungen im Pool ) @@ -31,24 +33,28 @@ func GetMongoClient() (*mongo.Client, error) { clientOptions.SetMaxPoolSize(POOL_SIZE) client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { - fmt.Println("hier liegt der fehler") + clientInstanceError = err + log.Errorf("Failure instancing client %v", err) } err = client.Ping(context.TODO(), nil) if err != nil { clientInstanceError = err + log.Errorf("Failure pinging client %v", err) } clientInstance = client }) - + log.Info("client returned") return clientInstance, clientInstanceError } func CloseMongoClient() error { if clientInstance != nil { err := clientInstance.Disconnect(context.Background()) if err != nil { + log.Errorf("Failure disconnecting client %v", err) return err } } + log.Info("client disconnected") return nil } diff --git a/src/highlanderticketing/handler/oauth.go b/src/highlanderticketing/handler/oauth.go index 001792f70cec833bc0a84228dc8935f7e11f7653..6fbeb9141f4ac0f92160ddba7c1ba6d8e357f1bd 100644 --- a/src/highlanderticketing/handler/oauth.go +++ b/src/highlanderticketing/handler/oauth.go @@ -17,29 +17,33 @@ import ( var secretKey = []byte("mysecretkey") +// aufgerufen, wenn der benutzer sich ein loggt, ruft oauth conf auf, leitet zu authorisisuerngsseite um func HandleLogin(w http.ResponseWriter, r *http.Request) { oauthConfig := config.GetOAuthConfigLogin() url := oauthConfig.AuthCodeURL("state", oauth2.AccessTypeOffline) http.Redirect(w, r, url, http.StatusTemporaryRedirect) } +// aufgerufen, wenn der benutzer sich registriert, ruft oauth conf auf, leitet zu authorisisuerngsseite um func HandleRegister(w http.ResponseWriter, r *http.Request) { oauthConfig := config.GetOAuthConfigRegister() url := oauthConfig.AuthCodeURL("state", oauth2.AccessTypeOffline) http.Redirect(w, r, url, http.StatusTemporaryRedirect) } + +// aufgerufen, wenn autorisierungscode von google kommt, tauscht code gegen access token ein, und registriert den benutzer func HandleCallbackRegister(w http.ResponseWriter, r *http.Request) { oauthConfig := config.GetOAuthConfigRegister() code := r.URL.Query().Get("code") token, err := oauthConfig.Exchange(context.Background(), code) if err != nil { - log.Println("Fehler beim Austausch des Autorisierungscodes:", err) + log.Errorf("Failure exchanging authorisingcode: %v", err) http.Error(w, "Fehler beim Authentifizieren", http.StatusInternalServerError) return } err = service.Register(token.AccessToken) if err != nil { - fmt.Println(err) + log.Errorf("Failure registrating: %v", err) io.WriteString(w, `user besteht bereits`) } else { sendJson(w, "user erfolgreich angelegt") @@ -47,13 +51,14 @@ func HandleCallbackRegister(w http.ResponseWriter, r *http.Request) { } +// aufgerufen, wenn autorisierungscode von google kommt, tauscht code gegen Zugriffstoken ein, generiert jwt token func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { oauthConfig := config.GetOAuthConfigLogin() code := r.URL.Query().Get("code") token, err := oauthConfig.Exchange(context.Background(), code) if err != nil { - log.Println("Fehler beim Austausch des Autorisierungscodes:", err) + log.Errorf("Failure exchanging authorisingcode: %v", err) http.Error(w, "Fehler beim Authentifizieren", http.StatusInternalServerError) return } @@ -73,7 +78,7 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { tokenJwt := jwt.New(jwt.SigningMethodHS256) claims := tokenJwt.Claims.(jwt.MapClaims) claims["username"] = userfound.Email - claims["exp"] = time.Now().Add(time.Hour * 24).Unix() + claims["exp"] = time.Now().Add(time.Minute * 5).Unix() tokenString, err := tokenJwt.SignedString(secretKey) if err != nil { @@ -81,13 +86,15 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { return } - fmt.Fprintf(w, "Login erfolgreich") + log.Info("Login erfolgreich") sendJson(w, tokenString) } +// überprüft den jwt token func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) (error, string) { tokenString, err := getBearerToken(r) if err != nil { + log.Errorf("no bearer token handed over: %v", err) return err, "" } @@ -113,12 +120,14 @@ func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) (e return err, "" } } + log.Info("token checked succesfully") return nil, username } func checkAdmin(userEmail string) error { user, err := service.GetUserByEmail(userEmail) if err != nil { + log.Errorf("failure getting user by email: %v", err) return err } if user.IsAdmin { diff --git a/src/highlanderticketing/handler/order.go b/src/highlanderticketing/handler/order.go index 7d9106223cecdeaa22191ee05a6edc6277d67b54..495df57c2530bc707e8027b90ff335712625914a 100644 --- a/src/highlanderticketing/handler/order.go +++ b/src/highlanderticketing/handler/order.go @@ -2,7 +2,6 @@ package handler import ( "encoding/json" - "fmt" "net/http" log "github.com/sirupsen/logrus" @@ -19,15 +18,16 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) { } id, err := getID(r) if err != nil { + log.Errorf("Eror gettin id in request: %v", err) http.Error(w, err.Error(), http.StatusBadRequest) return } order, err := getOrder(r) if err != nil { + log.Errorf("Eror gettin order in request: %v", err) http.Error(w, err.Error(), http.StatusBadRequest) return } - fmt.Println(userOfOrder, "userOfOrder") internalUser, err := service.GetUserByEmail(userOfOrder) if err != nil { log.Errorf("Failure loading internal user Info %v", err) @@ -52,18 +52,19 @@ func CancelOrder(w http.ResponseWriter, r *http.Request) { } id, err := getID(r) if err != nil { + log.Errorf("Eror gettin id in request: %v", err) http.Error(w, err.Error(), http.StatusBadRequest) return } orderId, err := getOrderID(r) if err != nil { + log.Errorf("Eror gettin order in request: %v", err) http.Error(w, err.Error(), http.StatusBadRequest) return } - fmt.Println(orderId, "orderid") order, err := service.GetOrderById(orderId) - fmt.Println("order ", order) if err != nil { + log.Errorf("Eror order internal: %v", err) http.Error(w, err.Error(), http.StatusBadRequest) return } diff --git a/src/highlanderticketing/handler/travel.go b/src/highlanderticketing/handler/travel.go deleted file mode 100644 index abeebd162ee44d9c076ced7c51310c2501f7b7af..0000000000000000000000000000000000000000 --- a/src/highlanderticketing/handler/travel.go +++ /dev/null @@ -1 +0,0 @@ -package handler diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go index 02f9fd253c8f234d66f51716362090b78327d0bf..bae9774b3b101e4edd7aac15c3b0a7ec733b125d 100644 --- a/src/highlanderticketing/main.go +++ b/src/highlanderticketing/main.go @@ -20,11 +20,10 @@ import ( func main() { updateChan := make(chan *model.Match) service.DeleteAllMatches() - /*service.DeleteAllUsers() - var userArray []model.User - userArray, _ = service.GetAllUsers() - fmt.Println(userArray) - */ + service.DeleteAllUsers() + /* var userArray []model.User + userArray, _ = service.GetAllUsers() + fmt.Println(userArray)*/ go func() { for { diff --git a/src/highlanderticketing/service/match.go b/src/highlanderticketing/service/match.go index b65e0da3b03d77e7898ba61b8a7082873d4c4b4c..8b1c2c9fbe2ae4658c5a8618ffc72586e739f92a 100644 --- a/src/highlanderticketing/service/match.go +++ b/src/highlanderticketing/service/match.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + 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/model" "go.mongodb.org/mongo-driver/bson" @@ -16,14 +17,17 @@ func CreateMatch(match *model.Match) error { match.Orders = []model.Order{} client, err := db.GetMongoClient() if err != nil { + log.Errorf("Eror gettin db client: %v", err) return err } collection := client.Database(db.DB).Collection(db.MATCHES) _, err = collection.InsertOne(context.TODO(), match) if err != nil { + log.Errorf("Erorr inserting match: %v", err) return nil } + log.Info("match inserted: %v", match) return nil } @@ -35,22 +39,23 @@ func InserExternalMatch(match *model.Match) error { client, err := db.GetMongoClient() if err != nil { + log.Errorf("Eror gettin db client: %v", err) return err } collection := client.Database(db.DB).Collection(db.MATCHES) err = collection.FindOne(context.TODO(), filter).Decode(existingMatch) if err == nil { - fmt.Println("existier bereits") + log.Info("match already exists") return fmt.Errorf("Match mit ExternalID %d exists already", match.ExternalID) } else if err != mongo.ErrNoDocuments { return err } - fmt.Println(match, "match das rein kommt") _, err = collection.InsertOne(context.TODO(), match) if err != nil { return nil } + log.Info("match inserted: %v", match) return nil } @@ -73,12 +78,14 @@ func UpdateMatch(matchID primitive.ObjectID, match *model.Match) (*model.Match, client, err := db.GetMongoClient() if err != nil { + log.Errorf("Eror gettin db client: %v", err) return nil, err } collection := client.Database(db.DB).Collection(db.MATCHES) updateResult, err := collection.UpdateOne(context.TODO(), filter, updater) if err != nil { + log.Errorf("Erorr getting collection of db: %v", err) return nil, err } @@ -88,9 +95,10 @@ func UpdateMatch(matchID primitive.ObjectID, match *model.Match) (*model.Match, err = collection.FindOne(context.TODO(), filter).Decode(&result) if err != nil { + log.Errorf("Erorr finding match in db: %v", err) return nil, err } - + log.Info("match updated: %v", match) return &result, nil } @@ -100,7 +108,7 @@ func UpdateTickets(matchID primitive.ObjectID, match *model.Match) (*model.Match existingmatch, err := GetMatchByID(matchID) if err != nil { - fmt.Println(existingmatch, "existingmatch") + log.Errorf("Erorr getting match by id: %v", err) return &result, err } @@ -115,12 +123,14 @@ func UpdateTickets(matchID primitive.ObjectID, match *model.Match) (*model.Match client, err := db.GetMongoClient() if err != nil { + log.Errorf("Eror gettin db client: %v", err) return nil, err } collection := client.Database(db.DB).Collection(db.MATCHES) updateResult, err := collection.UpdateOne(context.TODO(), filter, updater) if err != nil { + log.Errorf("Erorr getting collection of db: %v", err) return nil, err } @@ -132,7 +142,7 @@ func UpdateTickets(matchID primitive.ObjectID, match *model.Match) (*model.Match if err != nil { return nil, err } - + log.Info("tickets updated: %v", match) return &result, nil } diff --git a/src/highlanderticketing/service/nats.go b/src/highlanderticketing/service/nats.go index 7c0576c7586d9d63c34fbf5d35679df9b47fdc8e..8ad15824451e471f8937c00f21fc8f48ad11d4a3 100644 --- a/src/highlanderticketing/service/nats.go +++ b/src/highlanderticketing/service/nats.go @@ -49,6 +49,9 @@ func (s NatsServer) ConfirmOrder(e *model.EmialContent) (error, bool) { if err := json.Unmarshal(response.Data, &res); err != nil { return fmt.Errorf(err.Error()), false } + if res.Send != true { + return fmt.Errorf("emain not succesfuly send"), false + } fmt.Println("hier die nats response", *res) return nil, true } @@ -69,7 +72,9 @@ func (s NatsServer) ConfirmCancel(e *model.EmialContent) (error, bool) { if err := json.Unmarshal(response.Data, &res); err != nil { return fmt.Errorf(err.Error()), false } - + if res.Send != true { + return fmt.Errorf("emain not succesfuly send"), false + } fmt.Println("hier die nats response", *res) return nil, true } diff --git a/src/highlanderticketing/service/user.go b/src/highlanderticketing/service/user.go index 53c047faf49e2832465f9a03f566cb92c01522bd..c9c703c7e5d9411b5d621439b9dc073935dad4ea 100644 --- a/src/highlanderticketing/service/user.go +++ b/src/highlanderticketing/service/user.go @@ -50,18 +50,15 @@ func CreateUser(user *model.User) error { result := collection.FindOneAndUpdate(context.TODO(), filter, update, options) if result.Err() == mongo.ErrNoDocuments { - fmt.Println(3) return nil // dokument wurd erstellt } else if result.Err() != nil { - fmt.Println(2) return result.Err() // fehler beim process an sich } else { - fmt.Println(1) return fmt.Errorf("Der Benutzer existiert bereits") } } -func UpdateUser(userID primitive.ObjectID, user *model.User) (*model.User, error) { //darf nur ein admin machen +func UpdateUser(userID primitive.ObjectID, user *model.User) (*model.User, error) { result := model.User{} existingUser, err := GetUserByID(userID) if existingUser == nil || err != nil { diff --git a/src/highlanderticketing/service/user_test.go b/src/highlanderticketing/service/user_test.go new file mode 100644 index 0000000000000000000000000000000000000000..d3c4404abb4239a6f09e347f522a68317d0be6db --- /dev/null +++ b/src/highlanderticketing/service/user_test.go @@ -0,0 +1,39 @@ +package service_test + +import ( + "reflect" + "testing" + + "github.com/stretchr/testify/assert" + "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 TestCreateUserIntegration(t *testing.T) { + user := &model.User{ + Email: "test@example.com", + Name: "John", + FamilyName: "Doe", + IsAdmin: false, + } + + // Testfall 1: der benutzer wird angelegt + err2 := service.CreateUser(user) + + assert.Nil(t, err2) + assert.False(t, user.IsAdmin) + + if !reflect.DeepEqual(t, user) { + t.Errorf("Expected %+v, but got %+v", t, err2) + } + + // Testfall 2: es gibt bereits den Benutzer + err3 := service.CreateUser(user) + + assert.Error(t, err3) + assert.Equal(t, "Der Benutzer existiert bereits", err3.Error()) + + if !reflect.DeepEqual(err2, user) { + t.Errorf("Expected %+v, but got %+v", t, err2) + } +}