diff --git a/src/highlanderticketing/handler/oauth.go b/src/highlanderticketing/handler/oauth.go index dbbe02710c74af5d33dd50c31a81558b0f87583e..ed080a7de5bddcea96882d62421bb5fe63557007 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 0f6b304725a3d0fb07a2b8284601240af7476fd8..f40eb690f5ae6f67da73cfe56246bff6eedfb739 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 d62e480e1cc586c1bf3d57973b16b75aba7b24e4..8304c975d6c2d3b06ccaaf286f003477ebed1de0 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 d78ed7ccb7f51f18cfa39716735e289b78b362ee..f807dbcbe6f06b48b83298b2885968262d6bb9c0 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 615d5e1fcabb8252a18ef56030c53146207f4298..27af56fd223e36da8f6affbf1fe23eab70b2b9fa 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 abffa712c9e6ee9066baf93926b8a95d5f2234e2..4ccab1876b6cf53b41edc8c6c6e5fa2902a5dcff 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 103bbf39c2eb52805bedfe9a909e0a8f1c876547..23a4c5cae451954ff118e1b547e9aeb026ac4f53 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 0e03d60859bc7bd90b522bbc24c29cfbe799bcd4..7c7167cd00990d27e84efa5b3c51716edf32f210 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 8d97dba00b4ea8f11177e5f6dc57233ae47e7fad..5a5b2c619efea6ba73a68e7314b1c0e2580d5216 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 38a23ed9bf68883b67f646f1035d2b03f14b6b4a..40ca19207a832a6848a6c5e7cf2f95d74df4c019 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 }