diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go index 6117d878b55aacea5bfe27e75030d10fc3533e03..bc0ceeb3bd724d7437b5a5a593f8e4b45b01dbb5 100644 --- a/src/myaktion/handler/campaign.go +++ b/src/myaktion/handler/campaign.go @@ -19,6 +19,36 @@ func getCampaign(r *http.Request) (*model.Campaign, error) { return &campaign, nil } +func CreateCampaign(w http.ResponseWriter, r *http.Request) { + var campaign *model.Campaign + campaign, err := getCampaign(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + if err := service.CreateCampaign(campaign); err != nil { + log.Errorf("Error calling service CreateCampaign: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, campaign) +} + +func GetCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + campaign, err := service.GetCampaign(id) + if err != nil { + log.Errorf("Error retrieving campaign with ID %d: %v", id, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, campaign) +} + func GetCampaigns(w http.ResponseWriter, _ *http.Request) { campaigns, err := service.GetCampaigns() if err != nil { @@ -29,17 +59,37 @@ func GetCampaigns(w http.ResponseWriter, _ *http.Request) { sendJson(w, campaigns) } -func CreateCampaign(w http.ResponseWriter, r *http.Request) { - var campaign *model.Campaign +func UpdateCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } campaign, err := getCampaign(r) if err != nil { http.Error(w, err.Error(), http.StatusBadRequest) return } - if err := service.CreateCampaign(campaign); err != nil { - log.Errorf("Error calling service CreateCampaign: %v", err) + campaign, err = service.UpdateCampaign(id, campaign) + if err != nil { + log.Errorf("Error updating campaign with ID dd: %v", id, err) http.Error(w, err.Error(), http.StatusInternalServerError) return } sendJson(w, campaign) } + +func DeleteCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + err = service.DeleteCampaign(id) + if err != nil { + log.Errorf("Failure deleting campaign with ID %d: %v", id, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, result{Success: "True"}) +} diff --git a/src/myaktion/handler/donation.go b/src/myaktion/handler/donation.go new file mode 100644 index 0000000000000000000000000000000000000000..b10e3078e1e410a24dfa323b2ab448b3648af853 --- /dev/null +++ b/src/myaktion/handler/donation.go @@ -0,0 +1,41 @@ +package handler + +import ( + "encoding/json" + "net/http" + + log "github.com/sirupsen/logrus" + "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/service" +) + +func getDonation(r *http.Request) (*model.Donation, error) { + var donation model.Donation + err := json.NewDecoder(r.Body).Decode(&donation) + if err != nil { + log.Errorf("Can't serialize request body to donation struct: %v", err) + return nil, err + } + + return &donation, nil +} + +func AddDonation(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + donation, err := getDonation(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + err = service.AddDonation(id, donation) + if err != nil { + log.Errorf("Error adding donation to campaign with ID %d: %v", id, err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + sendJson(w, donation) +} diff --git a/src/myaktion/main.go b/src/myaktion/main.go index 28e090a195a11b845ac475de0506f0534ad0aff9..da694a2fed41ed8f1799b3d423b2d6c043d36bf6 100644 --- a/src/myaktion/main.go +++ b/src/myaktion/main.go @@ -9,6 +9,7 @@ import ( log "github.com/sirupsen/logrus" "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/handler" "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/model" + "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/service" ) func init() { @@ -24,7 +25,7 @@ func init() { log.SetLevel(level) } -func main() { +func loadSampleData() { campaign := model.Campaign{ Name: "Spenden für eine bessere Note", OrganizerName: "Geheimnisvolle Ente", @@ -50,12 +51,22 @@ func main() { Status: model.IN_PROCESS, }) + service.CreateCampaign(&campaign) +} + +func main() { + loadSampleData() port := 8000 log.Infof("Starting MyAktion API server on port %v.\n", port) router := mux.NewRouter() router.HandleFunc("/health", handler.Health).Methods("GET") router.HandleFunc("/campaigns", handler.GetCampaigns).Methods("GET") - router.HandleFunc("/campaign", handler.CreateCampaign).Methods("POST") + router.HandleFunc("/campaigns", handler.CreateCampaign).Methods("POST") + router.HandleFunc("/campaigns/{id}", handler.GetCampaign).Methods("GET") + router.HandleFunc("/campaigns/{id}", handler.UpdateCampaign).Methods("PUT") + router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE") + router.HandleFunc("/campaigns/{id}/donation", handler.AddDonation).Methods("POST") + if err := http.ListenAndServe(fmt.Sprintf(":%v", port), router); err != nil { log.Fatal(err) } diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go index d4274a3e540c03791574217b71afca91009920d9..510712b62121b59aac40f322150498cc65f2d9c0 100644 --- a/src/myaktion/service/campaign.go +++ b/src/myaktion/service/campaign.go @@ -1,6 +1,8 @@ package service import ( + "fmt" + log "github.com/sirupsen/logrus" "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/model" @@ -15,6 +17,27 @@ func init() { campaignStore = make(map[uint]*model.Campaign) } +func CreateCampaign(campaign *model.Campaign) error { + campaign.ID = actCampaignId + campaignStore[actCampaignId] = campaign + actCampaignId += 1 + log.Infof("Successfully stored new campaign with ID %v in database.", campaign.ID) + log.Tracef("Stored: %v", campaign) + + return nil +} + +func GetCampaign(id uint) (*model.Campaign, error) { + if campaign, ok := campaignStore[id]; !ok { + log.Info("Campaign with ID %d not found.", id) + return nil, fmt.Errorf("campaign with id %d not found", id) + } else { + log.Infof("Successfully retrieved campaign with ID %v.", campaign.ID) + log.Tracef("Retrieved: ", *campaign) + return campaign, nil + } +} + func GetCampaigns() ([]model.Campaign, error) { var campaigns []model.Campaign for _, campaign := range campaignStore { @@ -26,12 +49,26 @@ func GetCampaigns() ([]model.Campaign, error) { return campaigns, nil } -func CreateCampaign(campaign *model.Campaign) error { - campaign.ID = actCampaignId - campaignStore[actCampaignId] = campaign - actCampaignId += 1 - log.Infof("Successfully stored new campaign with ID %v in database.", campaign.ID) - log.Tracef("Stored: %v", campaign) +func UpdateCampaign(id uint, campaign *model.Campaign) (*model.Campaign, error) { + if storeCampaign, ok := campaignStore[id]; !ok { + log.Info("Campaign with ID %d not found.", id) + return nil, fmt.Errorf("campaign with id %d not found", id) + } else { + *storeCampaign = *campaign + storeCampaign.ID = id + log.Infof("Successfully updated campaign with ID %d.", id) + log.Tracef("Updated: %v", storeCampaign) + return storeCampaign, nil + } +} - return nil +func DeleteCampaign(id uint) error { + if campaign, ok := campaignStore[id]; !ok { + log.Info("Campaign with ID %d not found.", id) + return fmt.Errorf("campaign with id %d not found", id) + } else { + delete(campaignStore, id) + log.Infof("Successfully deleted campaign with ID %v.", campaign.ID) + return nil + } } diff --git a/src/myaktion/service/donation.go b/src/myaktion/service/donation.go new file mode 100644 index 0000000000000000000000000000000000000000..5a7bb0978290c0977975470f64f818a8348a8843 --- /dev/null +++ b/src/myaktion/service/donation.go @@ -0,0 +1,22 @@ +package service + +import ( + "fmt" + + log "github.com/sirupsen/logrus" + "gitlab.reutlingen-university.de/yesildas/myaktion-go/src/myaktion/model" +) + +func AddDonation(campaignId uint, donation *model.Donation) error { + campaign, err := GetCampaign(campaignId) + if err != nil { + log.Info("Campaign with ID %d not found.", campaignId) + return fmt.Errorf("campaign with id %d not found", campaignId) + } + if campaign.Donations == nil { + campaign.Donations = []model.Donation{} + } + campaign.Donations = append(campaign.Donations, *donation) + + return nil +}