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