From 5732f1ff1754d1273763778cf06c33a281e10aea Mon Sep 17 00:00:00 2001 From: Martin Schmollinger <martin.schmollinger@reutlingen-university.de> Date: Mon, 17 Apr 2023 15:56:27 +0200 Subject: [PATCH] Added CreateCampaign and GetCampaigns implementation storing data in a global map. --- src/myaktion/handler/campaign.go | 44 ++++++++++++++++++++++++++++++++ src/myaktion/main.go | 2 ++ src/myaktion/model/campaign.go | 1 + src/myaktion/service/campaign.go | 33 ++++++++++++++++++++++++ 4 files changed, 80 insertions(+) create mode 100644 src/myaktion/handler/campaign.go create mode 100644 src/myaktion/service/campaign.go diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go new file mode 100644 index 0000000..216f22d --- /dev/null +++ b/src/myaktion/handler/campaign.go @@ -0,0 +1,44 @@ +package handler + +import ( + "encoding/json" + "log" + "net/http" + + "gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/service" +) + +func CreateCampaign(w http.ResponseWriter, r *http.Request) { + var campaign model.Campaign + err := json.NewDecoder(r.Body).Decode(&campaign) + if err != nil { + log.Printf("Can't serialize request body to campaign struct: %v", err) + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := service.CreateCampaign(&campaign); err != nil { + log.Printf("Error calling service CreateCampaign: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(campaign); err != nil { + log.Printf("Failure encoding value to JSON: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} + +func GetCampaigns(w http.ResponseWriter, _ *http.Request) { + campaigns, err := service.GetCampaigns() + if err != nil { + log.Printf("Error calling service GetCampaigns: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + w.Header().Set("Content-Type", "application/json") + if err := json.NewEncoder(w).Encode(campaigns); err != nil { + log.Printf("Failure encoding value to JSON: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + } +} diff --git a/src/myaktion/main.go b/src/myaktion/main.go index e75ad89..f4843af 100644 --- a/src/myaktion/main.go +++ b/src/myaktion/main.go @@ -13,6 +13,8 @@ func main() { fmt.Println("Starting MyAktion API server") router := mux.NewRouter() router.HandleFunc("/health", handler.Health).Methods("GET") + router.HandleFunc("/campaign", handler.CreateCampaign).Methods("POST") + router.HandleFunc("/campaigns", handler.GetCampaigns).Methods("GET") if err := http.ListenAndServe(":8000", router); err != nil { log.Fatal(err) } diff --git a/src/myaktion/model/campaign.go b/src/myaktion/model/campaign.go index 3074a37..9fb5819 100644 --- a/src/myaktion/model/campaign.go +++ b/src/myaktion/model/campaign.go @@ -1,6 +1,7 @@ package model type Campaign struct { + ID uint Name string OrganizerName string TargetAmount float64 diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go new file mode 100644 index 0000000..3c50803 --- /dev/null +++ b/src/myaktion/service/campaign.go @@ -0,0 +1,33 @@ +package service + +import ( + "log" + + "gitlab.reutlingen-university.de/go-exercises/myaktion-go/src/myaktion/model" +) + +var ( + campaignStore map[uint]*model.Campaign + actCampaignId uint = 1 +) + +func init() { + campaignStore = make(map[uint]*model.Campaign) +} + +func CreateCampaign(campaign *model.Campaign) error { + campaign.ID = actCampaignId + campaignStore[actCampaignId] = campaign + actCampaignId += 1 + log.Printf("Successfully stored new campaign with ID %v in database.", campaign.ID) + log.Printf("Stored: %v", campaign) + return nil +} + +func GetCampaigns() ([]model.Campaign, error) { + var campaigns []model.Campaign + for _, campaign := range campaignStore { + campaigns = append(campaigns, *campaign) + } + return campaigns, nil +} -- GitLab