From 3ca52d002ed2580e1053bfc1e186ec6ba73891aa Mon Sep 17 00:00:00 2001 From: Yege1893 <yannick.ege@web.de> Date: Sat, 8 Jul 2023 22:50:50 +0200 Subject: [PATCH] cancelation --- src/highlanderticketing/handler/oauth.go | 4 +- src/highlanderticketing/handler/order.go | 54 ++++++- src/highlanderticketing/handler/utils.go | 13 ++ src/highlanderticketing/main.go | 8 +- src/highlanderticketing/model/match.go | 1 + src/highlanderticketing/model/order.go | 16 +- src/highlanderticketing/service/nats.go | 19 ++- src/highlanderticketing/service/oauth.go | 2 +- src/highlanderticketing/service/order.go | 155 +++++++++++++++++++- src/highlanderticketing/service/register.go | 2 +- 10 files changed, 240 insertions(+), 34 deletions(-) diff --git a/src/highlanderticketing/handler/oauth.go b/src/highlanderticketing/handler/oauth.go index dbbe027..ed080a7 100644 --- a/src/highlanderticketing/handler/oauth.go +++ b/src/highlanderticketing/handler/oauth.go @@ -53,7 +53,7 @@ func HandleCallbackLogin(w http.ResponseWriter, r *http.Request) { return } // den teil in eine routine packen - user, err := service.GetUserInfo(token.AccessToken) + user, err := service.GetUserInfoByToken(token.AccessToken) if err != nil { sendJson(w, err) return @@ -89,7 +89,7 @@ func CheckAccessToken(w http.ResponseWriter, r *http.Request, needAdmin bool) er } func checkAdmin(token string) error { - userExternal, err := service.GetUserInfo(token) + userExternal, err := service.GetUserInfoByToken(token) if err != nil { return err } diff --git a/src/highlanderticketing/handler/order.go b/src/highlanderticketing/handler/order.go index 0f6b304..f40eb69 100644 --- a/src/highlanderticketing/handler/order.go +++ b/src/highlanderticketing/handler/order.go @@ -32,7 +32,7 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) { http.Error(w, err.Error(), http.StatusBadRequest) } fmt.Println(reqToken, "reqToken") - userOfOrder, err := service.GetUserInfo(reqToken) + userOfOrder, err := service.GetUserInfoByToken(reqToken) if err != nil { log.Errorf("Failure loading user Info %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) @@ -43,9 +43,7 @@ func AddMatchOrder(w http.ResponseWriter, r *http.Request) { log.Errorf("Failure loading internal user Info %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) } - fmt.Println(internalUser, 2) order.User = *internalUser - fmt.Println(order.User, 3) err = service.AddMatchOrder(id, order) if err != nil { log.Errorf("Failure adding order to match with ID %v: %v", id, err) @@ -76,7 +74,7 @@ func AddTravelOrder(w http.ResponseWriter, r *http.Request) { log.Errorf("Failure loading bearer token %v", err) http.Error(w, err.Error(), http.StatusBadRequest) } - userOfOrder, err := service.GetUserInfo(reqToken) + userOfOrder, err := service.GetUserInfoByToken(reqToken) if err != nil { log.Errorf("Failure loading user Info %v", err) http.Error(w, err.Error(), http.StatusInternalServerError) @@ -97,6 +95,54 @@ func AddTravelOrder(w http.ResponseWriter, r *http.Request) { sendJson(w, order) } +func CancelOrder(w http.ResponseWriter, r *http.Request) { + if err := CheckAccessToken(w, r, false); err != nil { + log.Errorf("Eror checking AccessToken: %v", err) + http.Error(w, err.Error(), http.StatusUnauthorized) + return + } + id, err := getID(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + orderId, err := getOrderID(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + order, err := getOrder(r) + if err != nil { + 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) + if err != nil { + log.Errorf("Failure loading internal user Info %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } + order.User = *internalUser + order.ID = orderId + fmt.Println(orderId, "orderId") + + err = service.CancelOrder(id, order) + if err != nil { + log.Errorf("Failure adding donation to campaign with ID %v: %v", id, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, order) +} func getOrder(r *http.Request) (*model.Order, error) { var order model.Order diff --git a/src/highlanderticketing/handler/utils.go b/src/highlanderticketing/handler/utils.go index d62e480..8304c97 100644 --- a/src/highlanderticketing/handler/utils.go +++ b/src/highlanderticketing/handler/utils.go @@ -34,6 +34,19 @@ func getID(r *http.Request) (primitive.ObjectID, error) { return objectID, nil } +func getOrderID(r *http.Request) (primitive.ObjectID, error) { + vars := mux.Vars(r) + id := vars["orderid"] + + objectID, err := primitive.ObjectIDFromHex(id) + if err != nil { + log.Errorf("Can't get ObjectID from request: %v", err) + return primitive.NilObjectID, err + } + + return objectID, nil +} + func getBearerToken(r *http.Request) (string, error) { reqToken := r.Header.Get("Authorization") if reqToken == "" { diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go index d78ed7c..f807dbc 100644 --- a/src/highlanderticketing/main.go +++ b/src/highlanderticketing/main.go @@ -1,6 +1,7 @@ package main import ( + "fmt" "net/http" "os" @@ -8,18 +9,20 @@ import ( "github.com/joho/godotenv" "github.com/nats-io/nats.go" log "github.com/sirupsen/logrus" + "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/api" "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() { - /*service.DeleteAllUsers() + service.DeleteAllUsers() var userArray []model.User userArray, _ = service.GetAllUsers() fmt.Println(userArray) service.DeleteAllMatches() - api.GetMatchesOfApiToDb("https://api.openligadb.de/getmatchesbyteamid/16/5/0")*/ + api.GetMatchesOfApiToDb("https://api.openligadb.de/getmatchesbyteamid/16/5/0") if err := godotenv.Load(".env"); err != nil { log.Fatalf("Error loading .env file") @@ -51,6 +54,7 @@ func main() { router.HandleFunc("/match/{id}", handler.DeleteMatch).Methods("DELETE") router.HandleFunc("/match/{id}/matchorder", handler.AddMatchOrder).Methods("POST") router.HandleFunc("/match/{id}/travelorder", handler.AddTravelOrder).Methods("POST") + router.HandleFunc("/match/{id}/cancelorder/{orderid}", handler.CancelOrder).Methods("PUT") if err := http.ListenAndServe(":8000", router); err != nil { log.Fatal(err) } diff --git a/src/highlanderticketing/model/match.go b/src/highlanderticketing/model/match.go index 615d5e1..27af56f 100644 --- a/src/highlanderticketing/model/match.go +++ b/src/highlanderticketing/model/match.go @@ -12,6 +12,7 @@ type Match struct { Location string `bson:"location"` Date string `bson:"date, omitempty"` Travel Travel `bson:"travel"` + OrderAmount int32 `bson:"orderamount, omitempty"` Orders []Order `bson:"orders"` } diff --git a/src/highlanderticketing/model/order.go b/src/highlanderticketing/model/order.go index abffa71..4ccab18 100644 --- a/src/highlanderticketing/model/order.go +++ b/src/highlanderticketing/model/order.go @@ -3,14 +3,10 @@ package model import "go.mongodb.org/mongo-driver/bson/primitive" type Order struct { - ID primitive.ObjectID `bson:"_id, omitempty"` - OrderType OrderType `bson:"order_type"` - Amount int32 `bson:"amount"` - User User `bson:"user, omitempty"` + ID primitive.ObjectID `bson:"_id, omitempty"` + Amount int32 `bson:"amount"` + User User `bson:"user, omitempty"` + Ordernotified bool `bson:"ordernotified, omitempty"` + Canceled bool `bson:"canceled, omitempty"` + Cancelnotified bool `bson:"cancelnotified, omitempty"` } -type OrderType string - -const ( - MATCHTICKET OrderType = "MATCHTICKET" - BUSTICKET OrderType = "TRAVELTICKET" -) diff --git a/src/highlanderticketing/service/nats.go b/src/highlanderticketing/service/nats.go index 103bbf3..23a4c5c 100644 --- a/src/highlanderticketing/service/nats.go +++ b/src/highlanderticketing/service/nats.go @@ -33,38 +33,43 @@ func ConnectToNats() (NatsServer, error) { } -func (s NatsServer) ConfirmOrder(e *model.EmialContent) { +func (s NatsServer) ConfirmOrder(e *model.EmialContent) error { var res *model.Response emailContenct, errMarshal := json.Marshal(e) if errMarshal != nil { fmt.Println(errMarshal) - return + return fmt.Errorf(errMarshal.Error()) } 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()) } if err := json.Unmarshal(response.Data, &res); err != nil { - panic(err) + return fmt.Errorf(err.Error()) } fmt.Println("hier die nats response", *res) + return nil } -func (s NatsServer) confirmCancel(e *model.EmialContent) { +func (s NatsServer) ConfirmCancel(e *model.EmialContent) error { var res *model.Response emailContenct, errMarshal := json.Marshal(e) if errMarshal != nil { fmt.Println(errMarshal) - return + return fmt.Errorf(errMarshal.Error()) } - response, err := s.Nc.Request("confirmOrder."+string(e.Emailadress), []byte(emailContenct), 2*time.Second) + 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()) } if err := json.Unmarshal(response.Data, &res); err != nil { - panic(err) + return fmt.Errorf(err.Error()) } + fmt.Println("hier die nats response", &res) + return nil } diff --git a/src/highlanderticketing/service/oauth.go b/src/highlanderticketing/service/oauth.go index 0e03d60..7c7167c 100644 --- a/src/highlanderticketing/service/oauth.go +++ b/src/highlanderticketing/service/oauth.go @@ -49,7 +49,7 @@ func ValidateGoogleAccessToken(accessToken string) (bool, error) { return false, nil } -func GetUserInfo(accessToken string) (model.User, error) { +func GetUserInfoByToken(accessToken string) (model.User, error) { var userInfo model.User client := &http.Client{} req, err := http.NewRequest("GET", "https://www.googleapis.com/oauth2/v1/userinfo", nil) diff --git a/src/highlanderticketing/service/order.go b/src/highlanderticketing/service/order.go index 8d97dba..5a5b2c6 100644 --- a/src/highlanderticketing/service/order.go +++ b/src/highlanderticketing/service/order.go @@ -8,6 +8,7 @@ import ( "gitlab.reutlingen-university.de/ege/highlander-ticketing-go-ss2023/src/highlanderticketing/model" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/bson/primitive" + "go.mongodb.org/mongo-driver/mongo/options" ) func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { @@ -37,14 +38,39 @@ func AddMatchOrder(matchID primitive.ObjectID, order *model.Order) error { } if updateResult.ModifiedCount == 0 { - return fmt.Errorf("no document was updated") + return fmt.Errorf("no document was updated, please send order again") } natsServer, err := ConnectToNats() defer natsServer.Nc.Close() - emailContenct := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()} - natsServer.ConfirmOrder(&emailContenct) + emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()} + if err := natsServer.ConfirmOrder(&emailContent); err != nil { + // hier warten und nochmal versuchen zu senden + order.Ordernotified = false + return fmt.Errorf("error sending confirm email: %v", err) + } else { + order.Ordernotified = true + } + + updaterNotification := bson.D{primitive.E{Key: "$set", Value: bson.D{ + primitive.E{Key: "orders.$[element]", Value: order}, + }}} + + options := options.Update().SetArrayFilters(options.ArrayFilters{ + Filters: []interface{}{ + bson.D{{Key: "element._id", Value: order.ID}}, + }, + }) + + updateNotification, err := collection.UpdateOne(context.TODO(), filter, updaterNotification, options) + if err != nil { + return fmt.Errorf("no document was updated, please send order again") + } + + if updateNotification.ModifiedCount == 0 { + return fmt.Errorf("no document was updated, please send order again") + } return nil } @@ -74,17 +100,132 @@ func AddTravelOrder(matchID primitive.ObjectID, order *model.Order) error { } if updateResult.ModifiedCount == 0 { - return fmt.Errorf("no document was updated") + return fmt.Errorf("no document was updated, please send order again") } natsServer, err := ConnectToNats() defer natsServer.Nc.Close() - emailContenct := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()} - natsServer.ConfirmOrder(&emailContenct) + emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: matchToFind.ID.String()} + if err := natsServer.ConfirmOrder(&emailContent); err != nil { + // hier warten und nochmal versuchen zu senden + order.Ordernotified = false + return fmt.Errorf("error sending confirm email %v", err) + } else { + order.Ordernotified = true + } + + updaterNotification := bson.D{primitive.E{Key: "$set", Value: bson.D{ + primitive.E{Key: "orders.$[element]", Value: order}, + }}} + + options := options.Update().SetArrayFilters(options.ArrayFilters{ + Filters: []interface{}{ + bson.D{{Key: "element._id", Value: order.ID}}, + }, + }) + + updateNotification, err := collection.UpdateOne(context.TODO(), filter, updaterNotification, options) + if err != nil { + return fmt.Errorf("no document was updated, please send order again") + } + + if updateNotification.ModifiedCount == 0 { + return fmt.Errorf("no document was updated, please send order again") + } return nil } -func CancelOrder() { +var isMatchOrder bool = true + +func CancelOrder(matchID primitive.ObjectID, order *model.Order) error { + filter := bson.D{primitive.E{Key: "_id", Value: matchID}} + matchToFind, err := GetMatchByID(matchID) + if err != nil { + return err + } + + client, err := db.GetMongoClient() + if err != nil { + return err + } + + collection := client.Database(db.DB).Collection(db.MATCHES) + + order.Canceled = true + + updaterMatchCancel := bson.D{primitive.E{Key: "$set", Value: bson.D{ + primitive.E{Key: "orders.$[element]", Value: order}, + }}} + + updaterTravelCancel := bson.D{primitive.E{Key: "$set", Value: bson.D{ + primitive.E{Key: "travel.orders.$[element]", Value: order}, + }}} + + options := options.Update().SetArrayFilters(options.ArrayFilters{ + Filters: []interface{}{ + bson.D{{Key: "element._id", Value: order.ID}}, + }, + }) + + updateMatchCancel, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options) + if err != nil { + return err + } + if updateMatchCancel.ModifiedCount == 0 { + isMatchOrder = false + updateTravelCancel, err := collection.UpdateOne(context.TODO(), filter, updaterTravelCancel, options) + if err != nil { + return err + } + if updateTravelCancel.ModifiedCount == 0 { + return fmt.Errorf("orderid not in system") + } + + } + + natsServer, err := ConnectToNats() + defer natsServer.Nc.Close() + + emailContent := model.EmialContent{Name: order.User.Name, AwayMatch: matchToFind.AwayMatch, Location: matchToFind.Location, Date: matchToFind.Date, Emailadress: order.User.Email, OrderID: order.ID.String()} + if err := natsServer.ConfirmCancel(&emailContent); err != nil { + return fmt.Errorf("error sending confirm email %v", err) + } + + order.Cancelnotified = true + + if isMatchOrder == false { + updateTravelCancelNotifi, err := collection.UpdateOne(context.TODO(), filter, updaterTravelCancel, options) + if err != nil { + return err + } + if updateTravelCancelNotifi.ModifiedCount == 0 { + return fmt.Errorf("orderid not in system") + } + isMatchOrder = true + } else { + updateMatchCancelNotifi, err := collection.UpdateOne(context.TODO(), filter, updaterMatchCancel, options) + if err != nil { + return err + } + if updateMatchCancelNotifi.ModifiedCount == 0 { + return fmt.Errorf("orderid not in system") + } + } + return nil + +} +func deleteOrder(orderID primitive.ObjectID) error { + filter := bson.D{primitive.E{Key: "_id", Value: orderID}} + client, err := db.GetMongoClient() + if err != nil { + return err + } + collection := client.Database(db.DB).Collection(db.MATCHES) + _, err = collection.DeleteOne(context.TODO(), filter) + if err != nil { + return err + } + return nil } diff --git a/src/highlanderticketing/service/register.go b/src/highlanderticketing/service/register.go index 38a23ed..40ca192 100644 --- a/src/highlanderticketing/service/register.go +++ b/src/highlanderticketing/service/register.go @@ -7,7 +7,7 @@ import ( ) func Register(accessToken string) error { - user, err := GetUserInfo(accessToken) + user, err := GetUserInfoByToken(accessToken) if err != nil { return err } -- GitLab