diff --git a/src/highlanderticketing/handler/match.go b/src/highlanderticketing/handler/match.go index abeebd162ee44d9c076ced7c51310c2501f7b7af..4bee86e12c38f388a3dcca30c15f28fd4bb02f47 100644 --- a/src/highlanderticketing/handler/match.go +++ b/src/highlanderticketing/handler/match.go @@ -1 +1,146 @@ package handler + +import ( + "encoding/json" + "net/http" + + log "github.com/sirupsen/logrus" + + "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 CreateMatch(w http.ResponseWriter, r *http.Request) { + var match *model.Match + match, err := getMatch(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := service.CreateMatch(match); err != nil { + log.Errorf("Error calling service CreateMatch: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, match) +} + +// noch testen +/*func CreateMatches(w http.ResponseWriter, r *http.Request) { + var match *model.Match + match, err := getMatch(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := service.CreateMatch(match); err != nil { + log.Errorf("Error calling service CreateMatch: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, match) +} +*/ +func UpdateMatch(w http.ResponseWriter, r *http.Request) { + id, err := getID(r) + if err != nil { + log.Errorf("Please parse in ID at the url %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + MatchToUpdate, err := getMatch(r) + if err != nil { + log.Errorf("Match not found %v", err) + return + } + MatchUpdated, err := service.UpdateMatch(id, MatchToUpdate) + if err != nil { + log.Errorf("Campaign could not be updated %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + sendJson(w, MatchUpdated) +} + +func GetAllMatches(w http.ResponseWriter, r *http.Request) { + matches, err := service.GetAllMatches() + if err != nil { + log.Errorf("Error calling service GetAllMatches: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, matches) +} + +func GetMatchByID(w http.ResponseWriter, r *http.Request) { + id, err := getID(r) + if err != nil { + log.Errorf("Please parse in ID at the url %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + } + campaign, err := service.GetMatchByID(id) + if err != nil { + log.Errorf("No Match with this ID %v", err) + return + } + sendJson(w, campaign) +} + +func DeleteMatch(w http.ResponseWriter, r *http.Request) { + id, err := getID(r) + if err != nil { + log.Errorf("Please parse in ID at the url %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } else { + log.Infof("ID to delete was found in struct") + } + err1 := service.DeleteMatch(id) + if err1 != nil { + log.Errorf("Match could not be deleted %v", err1) + http.Error(w, err1.Error(), http.StatusInternalServerError) + return + } else { + log.Infof("ID deleted") + log.Tracef("ID: %v deleted", id) + } + sendJson(w, result{Success: "OK"}) +} + +// nur intern +/*func DeleteAllMatches(w http.ResponseWriter, r *http.Request) { + err := service.DeleteAllMatches() + if err != nil { + log.Errorf("Match could not be deleted %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } else { + log.Infof("Matches deleted") + } + sendJson(w, result{Success: "OK"}) +}*/ +func getMatch(r *http.Request) (*model.Match, error) { + var match model.Match + err := json.NewDecoder(r.Body).Decode(&match) + if err != nil { + log.Errorf("Can't serialize request body to campaign struct: %v", err) + return nil, err + } else { + log.Infof("request body seralized to campaign struct") + log.Tracef("body seralized in struct campaign: %v", match) + } + return &match, nil +} + +/*func getMatches(r *http.Request) (*[]model.Match, error){ + var match model.Match + err := json.NewDecoder(r.Body).Decode(&match) + if err != nil { + log.Errorf("Can't serialize request body to campaign struct: %v", err) + return nil, err + } else { + log.Infof("request body seralized to campaign struct") + log.Tracef("body seralized in struct campaign: %v", match) + } + return &matches, nil +}*/ diff --git a/src/highlanderticketing/handler/utils.go b/src/highlanderticketing/handler/utils.go new file mode 100644 index 0000000000000000000000000000000000000000..cca142c4d441eca008ebbc9a157c419a65ca0c44 --- /dev/null +++ b/src/highlanderticketing/handler/utils.go @@ -0,0 +1,34 @@ +package handler + +import ( + "encoding/json" + "net/http" + + "github.com/gorilla/mux" + log "github.com/sirupsen/logrus" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +type result struct { + Success string `json:"success"` +} + +func sendJson(w http.ResponseWriter, value interface{}) { + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(value); err != nil { + log.Errorf("Failure encoding value to JSON: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} +func getID(r *http.Request) (primitive.ObjectID, error) { + vars := mux.Vars(r) + id := vars["id"] + + 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 +} diff --git a/src/highlanderticketing/main.go b/src/highlanderticketing/main.go index 42cf66afb09f42aa5e7a9823b89d707baa499586..b667c44259b3b0be169532da3b2e1d1e9bfc0ba8 100644 --- a/src/highlanderticketing/main.go +++ b/src/highlanderticketing/main.go @@ -1,7 +1,6 @@ package main import ( - "fmt" "net/http" "os" @@ -9,50 +8,22 @@ 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" - "go.mongodb.org/mongo-driver/bson/primitive" ) func main() { - router := mux.NewRouter() + //init db _, err := db.GetMongoClient() if err != nil { log.Fatal(err) } - - // Testen - objectID := primitive.NewObjectID() - var initialMatch = model.Match{ID: objectID, InitialTicketAmount: 1, AvailableTicketAmount: 1, AwayMatch: true, Location: "Stuttgart"} - err1 := service.CreateMatch(&initialMatch) - if err1 != nil { - fmt.Println(err) - } - matches, err := service.GetAllMatches() - if err != nil { - fmt.Println(err) - } - fmt.Println(matches) - - var updateModel = model.Match{ID: objectID, InitialTicketAmount: 1, AvailableTicketAmount: 1, AwayMatch: true, Location: "Schalke"} - updatedmatch, err := service.UpdateMatch(objectID, &updateModel) - if err != nil { - fmt.Println(err) - } - fmt.Println(updatedmatch) - match, err := service.GetMatchByID(objectID) - if err != nil { - fmt.Println(err) - } - fmt.Println(match) - deleted := service.DeleteAllMatches() - if err != nil { - fmt.Println(deleted) - } - - // ende tests - + log.Println("Starting Highlander Ticketing server") + router := mux.NewRouter() router.HandleFunc("/health", handler.Health).Methods("GET") + router.HandleFunc("/match", handler.CreateMatch).Methods("POST") + router.HandleFunc("/matches", handler.GetAllMatches).Methods("GET") + router.HandleFunc("/match/{id}", handler.GetMatchByID).Methods("GET") + router.HandleFunc("/match/{id}", handler.UpdateMatch).Methods("PUT") + router.HandleFunc("/match/{id}", handler.DeleteMatch).Methods("DELETE") 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 1311852f811ca4c72f9a5d8c3628dd841a16dc29..3d36e57ca41831a0701ff73ded32a9bef38399e5 100644 --- a/src/highlanderticketing/model/match.go +++ b/src/highlanderticketing/model/match.go @@ -1,17 +1,36 @@ package model -import "go.mongodb.org/mongo-driver/bson/primitive" +import ( + "go.mongodb.org/mongo-driver/bson/primitive" + "google.golang.org/genproto/googleapis/type/date" +) type Match struct { - ID primitive.ObjectID `bson:"_id"` + ID primitive.ObjectID `bson:"_id, omitempty"` InitialTicketAmount int32 `bson:"initial_ticket_amount"` AvailableTicketAmount int32 `bson:"available_ticket_amount"` AwayMatch bool `bson:"away_match"` Location string `bson:"location"` - //Date date.Date - //Travel Travel - //Orders []Order + Date date.Date `bson:"date"` + Travel Travel `bson:"travel, omitempty"` + Orders []Order `bson:"orders"` } -// Funktion ins Modell (siehe -//Myaktion), welche den available_ Ticket_Amount berechnet +/*func calculateAmountDonated(matchID primitive.ObjectID) (int32, error) { + collection := client.Database("your_db").Collection("orders") + pipeline := []bson.M{ + {"$match": bson.M{"match_id": matchID}}, + {"$group": bson.M{"_id": nil, "totalAmount": bson.M{"$sum": "$amount"}}}, + } + + var result struct { + TotalAmount int32 `bson:"totalAmount"` + } + + err := collection.Aggregate(context.TODO(), pipeline).Decode(&result) + if err != nil { + return 0, err + } + + return result.TotalAmount, nil +}*/ // muss nach jedem update , erstellen gemacht werden , funktion anpassen diff --git a/src/highlanderticketing/service/match.go b/src/highlanderticketing/service/match.go index 6c119cfd569d32e5a721af2c2f8181457398e63f..575eaf0404e9474bab555080b64258329ce13571 100644 --- a/src/highlanderticketing/service/match.go +++ b/src/highlanderticketing/service/match.go @@ -12,6 +12,7 @@ import ( ) func CreateMatch(match *model.Match) error { + match.ID = primitive.NewObjectID() client, err := db.GetMongoClient() if err != nil { return err @@ -25,7 +26,7 @@ func CreateMatch(match *model.Match) error { return nil } -// noch testen +// noch testen nur intern für anbindung an die api func CreateMatches(list *[]model.Match) error { insertableList := make([]interface{}, len(*list)) for i, v := range *list { @@ -61,7 +62,7 @@ func UpdateMatch(matchID primitive.ObjectID, match *model.Match) (*model.Match, primitive.E{Key: "available_ticket_amount", Value: match.AvailableTicketAmount}, primitive.E{Key: "away_match", Value: match.AwayMatch}, primitive.E{Key: "location", Value: match.Location}, - //primitive.E{Key: "date", Value: existingMatch.Date}, + //primitive.E{Key: "date", Value: match.Date}, }}} client, err := db.GetMongoClient()