From ad6a8790f02b530ce262da6f966c094aa86a1c30 Mon Sep 17 00:00:00 2001 From: Yege1893 <yannick.ege@web.de> Date: Mon, 10 Jul 2023 22:17:34 +0200 Subject: [PATCH] order fixed --- src/highlanderticketing/handler/match.go | 12 ++--- src/highlanderticketing/handler/oauth.go | 12 ++--- src/highlanderticketing/handler/order.go | 31 +++---------- src/highlanderticketing/main.go | 2 +- src/highlanderticketing/model/match.go | 1 - src/highlanderticketing/service/nats.go | 20 ++++----- src/highlanderticketing/service/order.go | 56 +++++++++++++++--------- 7 files changed, 64 insertions(+), 70 deletions(-) diff --git a/src/highlanderticketing/handler/match.go b/src/highlanderticketing/handler/match.go index cc410d9..3ef79c8 100644 --- a/src/highlanderticketing/handler/match.go +++ b/src/highlanderticketing/handler/match.go @@ -12,7 +12,7 @@ import ( func CreateMatch(w http.ResponseWriter, r *http.Request) { var match *model.Match - if err := CheckAccessToken(w, r, true); err != nil { + if err, _ := CheckAccessToken(w, r, true); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -32,7 +32,7 @@ func CreateMatch(w http.ResponseWriter, r *http.Request) { } func UpdateMatch(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, true); err != nil { + if err, _ := CheckAccessToken(w, r, true); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -58,7 +58,7 @@ func UpdateMatch(w http.ResponseWriter, r *http.Request) { } func GetAllMatches(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, false); err != nil { + if err, _ := CheckAccessToken(w, r, false); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -73,7 +73,7 @@ func GetAllMatches(w http.ResponseWriter, r *http.Request) { } func GetMatchByID(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, false); err != nil { + if err, _ := CheckAccessToken(w, r, false); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -92,7 +92,7 @@ func GetMatchByID(w http.ResponseWriter, r *http.Request) { } func DeleteMatch(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, true); err != nil { + if err, _ := CheckAccessToken(w, r, true); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -118,7 +118,7 @@ func DeleteMatch(w http.ResponseWriter, r *http.Request) { } func UpdateTickets(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, true); err != nil { + if err, _ := CheckAccessToken(w, r, true); err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return diff --git a/src/highlanderticketing/handler/oauth.go b/src/highlanderticketing/handler/oauth.go index a861404..001792f 100644 --- a/src/highlanderticketing/handler/oauth.go +++ b/src/highlanderticketing/handler/oauth.go @@ -57,7 +57,7 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { http.Error(w, "Fehler beim Authentifizieren", http.StatusInternalServerError) return } - // den teil in eine routine packen + user, err := service.GetUserInfoByToken(token.AccessToken) if err != nil { sendJson(w, err) @@ -85,10 +85,10 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { sendJson(w, tokenString) } -func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) error { +func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) (error, string) { tokenString, err := getBearerToken(r) if err != nil { - return err + return err, "" } token, err := jwt.Parse(tokenString, func(token *jwt.Token) (interface{}, error) { @@ -98,7 +98,7 @@ func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) er if err != nil { w.WriteHeader(http.StatusUnauthorized) fmt.Fprint(w, "Ungültiges Authorization-Token") - return err + return err, "" } var username string if claims, ok := token.Claims.(jwt.MapClaims); ok && token.Valid { @@ -110,10 +110,10 @@ func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) er if needAdmin { err := checkAdmin(username) if err != nil { - return err + return err, "" } } - return nil + return nil, username } func checkAdmin(userEmail string) error { diff --git a/src/highlanderticketing/handler/order.go b/src/highlanderticketing/handler/order.go index 19c0be0..7d91062 100644 --- a/src/highlanderticketing/handler/order.go +++ b/src/highlanderticketing/handler/order.go @@ -11,7 +11,8 @@ import ( ) func AddMatchOrder(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, false); err != nil { + err, userOfOrder := CheckAccessToken(w, r, false) + if err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -26,19 +27,8 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - reqToken, err := getBearerToken(r) - if err != nil { - log.Errorf("Failure loading bearer token %v", err) - http.Error(w, err.Error(), http.StatusBadRequest) - } - fmt.Println(reqToken, "reqToken") - userOfOrder, err := service.GetUserInfoByToken(reqToken) - if err != nil { - log.Errorf("Failure loading user Info %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - } fmt.Println(userOfOrder, "userOfOrder") - internalUser, err := service.GetUserByEmail(userOfOrder.Email) + internalUser, err := service.GetUserByEmail(userOfOrder) if err != nil { log.Errorf("Failure loading internal user Info %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) @@ -54,7 +44,8 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) { } func CancelOrder(w http.ResponseWriter, r *http.Request) { - if err := CheckAccessToken(w, r, false); err != nil { + err, userOfOrder := CheckAccessToken(w, r, false) + if err != nil { log.Errorf("Eror checking AccessToken: %v", err) http.Error(w, err.Error(), http.StatusUnauthorized) return @@ -76,17 +67,7 @@ func CancelOrder(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) return } - reqToken, err := getBearerToken(r) - if err != nil { - log.Errorf("Failure loading bearer token %v", err) - http.Error(w, err.Error(), http.StatusBadRequest) - } - userOfOrder, err := service.GetUserInfoByToken(reqToken) - if err != nil { - log.Errorf("Failure loading user Info %v", err) - http.Error(w, err.Error(), http.StatusInternalServerError) - } - internalUser, err := service.GetUserByEmail(userOfOrder.Email) + internalUser, err := service.GetUserByEmail(userOfOrder) if err != nil { log.Errorf("Failure loading internal user Info %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go index 3ab68ee..02f9fd2 100644 --- a/src/highlanderticketing/main.go +++ b/src/highlanderticketing/main.go @@ -32,7 +32,7 @@ func main() { if err != nil { log.Println("Fehler beim Abrufen der Matches:", err) } - time.Sleep(1 * time.Minute) + time.Sleep(3 * time.Minute) } }() diff --git a/src/highlanderticketing/model/match.go b/src/highlanderticketing/model/match.go index 772ae0b..7c063dd 100644 --- a/src/highlanderticketing/model/match.go +++ b/src/highlanderticketing/model/match.go @@ -17,6 +17,5 @@ type Match struct { AwayMatch bool `bson:"away_match"` Location string `bson:"location"` Date time.Time `bson:"date"` - OrderAmount int32 `bson:"orderamount"` Orders []Order `bson:"orders"` } diff --git a/src/highlanderticketing/service/nats.go b/src/highlanderticketing/service/nats.go index d4c7e37..7c0576c 100644 --- a/src/highlanderticketing/service/nats.go +++ b/src/highlanderticketing/service/nats.go @@ -33,43 +33,43 @@ func ConnectToNats() (NatsServer, error) { } -func (s NatsServer) ConfirmOrder(e *model.EmialContent) error { +func (s NatsServer) ConfirmOrder(e *model.EmialContent) (error, bool) { var res *model.Response emailContenct, errMarshal := json.Marshal(e) if errMarshal != nil { fmt.Println(errMarshal) - return fmt.Errorf(errMarshal.Error()) + return fmt.Errorf(errMarshal.Error()), false } response, err := s.Nc.Request("confirmOrder."+string(e.OrderID), []byte(emailContenct), 2*time.Second) if err != nil { log.Println("Error making NATS request:", err) - return fmt.Errorf(err.Error()) + return fmt.Errorf(err.Error()), false } if err := json.Unmarshal(response.Data, &res); err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf(err.Error()), false } fmt.Println("hier die nats response", *res) - return nil + return nil, true } -func (s NatsServer) ConfirmCancel(e *model.EmialContent) error { +func (s NatsServer) ConfirmCancel(e *model.EmialContent) (error, bool) { var res *model.Response emailContenct, errMarshal := json.Marshal(e) if errMarshal != nil { fmt.Println(errMarshal) - return fmt.Errorf(errMarshal.Error()) + return fmt.Errorf(errMarshal.Error()), false } response, err := s.Nc.Request("confirmCancel."+string(e.OrderID), []byte(emailContenct), 2*time.Second) if err != nil { log.Println("Error making NATS request:", err) - return fmt.Errorf(err.Error()) + return fmt.Errorf(err.Error()), false } if err := json.Unmarshal(response.Data, &res); err != nil { - return fmt.Errorf(err.Error()) + return fmt.Errorf(err.Error()), false } fmt.Println("hier die nats response", *res) - return nil + return nil, true } diff --git a/src/highlanderticketing/service/order.go b/src/highlanderticketing/service/order.go index d43f227..09100c0 100644 --- a/src/highlanderticketing/service/order.go +++ b/src/highlanderticketing/service/order.go @@ -4,6 +4,7 @@ import ( "context" "errors" "fmt" + "time" "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/db" "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model" @@ -38,7 +39,7 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } collection := client.Database(db.DB).Collection(db.MATCHES) - + // find match err = collection.FindOne(context.TODO(), filter).Decode(&matchToFind) if err != nil { return err @@ -48,7 +49,7 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } else { matchToFind.AvailableTicketAmount = matchToFind.AvailableTicketAmount - order.Amount } - + // push order updateResult, err := collection.UpdateOne(context.TODO(), filter, updater) if err != nil { return err @@ -56,7 +57,7 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { if updateResult.ModifiedCount == 0 { return fmt.Errorf("no document was updated, please send order again") } - + // update match with new available ticketamount _, errUpdate := UpdateMatch(matchToFind.ID, matchToFind) if errUpdate != nil { errUpdate = fmt.Errorf("can not update match amount, please send order again") @@ -65,11 +66,16 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { if err != nil { return err } + // send email cancel notification defer natsServer.Nc.Close() - if err := natsServer.ConfirmCancel(&emailContent); err != nil { - // hier warten und nochmal versuchen zu senden - order.Cancelnotified = false - err := fmt.Errorf("error sending confirm email: %v", err) + order.Cancelnotified = true + if err, _ := natsServer.ConfirmCancel(&emailContent); err != nil { + time.Sleep(1 * time.Second) + err, _ := natsServer.ConfirmCancel(&emailContent) + if err != nil { + order.Ordernotified = false + err = fmt.Errorf("error sending cancel email: %v", err) + } return err } } @@ -80,16 +86,19 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } defer natsServer.Nc.Close() - - if err := natsServer.ConfirmOrder(&emailContent); err != nil { - // hier warten und nochmal versuchen zu senden - order.Ordernotified = false - err = fmt.Errorf("error sending confirm email: %v", err) + // send confirm email + if err, _ := natsServer.ConfirmOrder(&emailContent); err != nil { + time.Sleep(1 * time.Second) + err, _ := natsServer.ConfirmOrder(&emailContent) + if err != nil { + order.Ordernotified = false + err = fmt.Errorf("error sending confirm email: %v", err) + } return err } else { order.Ordernotified = true } - + // update order notification to true updateNotification, err := collection.UpdateOne(context.TODO(), filter, updaterNotification, options) if err != nil { err = fmt.Errorf("no document was updated, please send order again") @@ -97,7 +106,7 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } if updateNotification.ModifiedCount == 0 { - err = fmt.Errorf("no document was updated, please send order again") + err = fmt.Errorf("notification was not updated") return err } @@ -105,11 +114,11 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } func CancelOrder(matchID primitive.ObjectID, order *model.Order) error { - fmt.Println("order", order) if order.Canceled == true { return fmt.Errorf("order already canceled") } filter := bson.D{primitive.E{Key: "_id", Value: matchID}} + // find match with id matchToFind, err := GetMatchByID(matchID) if err != nil { return err @@ -135,7 +144,7 @@ func CancelOrder(matchID primitive.ObjectID, order *model.Order) error { bson.D{{Key: "element._id", Value: order.ID}}, }, }) - + // update order to canceled updateMatchCancel, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options) if err != nil { return err @@ -144,7 +153,7 @@ func CancelOrder(matchID primitive.ObjectID, order *model.Order) error { return fmt.Errorf("not updated") } - + // update match with new available tickets _, errUpdateAmount := UpdateMatch(matchToFind.ID, matchToFind) if errUpdateAmount != nil { order.Canceled = false @@ -161,14 +170,19 @@ func CancelOrder(matchID primitive.ObjectID, order *model.Order) error { natsServer, err := ConnectToNats() defer natsServer.Nc.Close() - + // send notification mail emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date.String(), Emailadress: order.User.Email, OrderID: order.ID.String()} - if err := natsServer.ConfirmCancel(&emailContent); err != nil { - return fmt.Errorf("error sending confirm email %v", err) + if err, _ := natsServer.ConfirmCancel(&emailContent); err != nil { + time.Sleep(1 * time.Second) + err, _ := natsServer.ConfirmOrder(&emailContent) + if err != nil { + order.Ordernotified = false + err = fmt.Errorf("error sending confirm email: %v", err) + } } else { order.Cancelnotified = true } - + // update cancel notification updateMatchCancelNotifi, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options) if err != nil { return err -- GitLab