diff --git a/Calls.md b/Calls.md new file mode 100644 index 0000000000000000000000000000000000000000..b7419b6788cd2de07d75e9c9a8c51916f7c2c69f --- /dev/null +++ b/Calls.md @@ -0,0 +1,32 @@ +### Campaign POST + +``` +curl -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100, "account":{"name":"Martin","bankName":"DKB","number":"123456"}}' localhost:8000/campaigns +``` + +### Campaign PUT +``` +curl -X PUT -H "Content-Type: application/json" -d '{"name":"Covid","organizerName":"Martin","donationMinimum":2,"targetAmount":100, "account":{"name":"Bombardillo Crocodillo","bankName":"Sacur","number":"123456"}}' localhost:8000/campaigns/1 +``` + +### Campaign all GET +``` +curl localhost:8000/campaigns +``` + +### Campaign one GET +``` +curl localhost:8000/campaigns/1 +``` + +### Campaign Delete +``` +curl -X DELETE localhost:8000/campaigns/1 +``` + +### Donation POST: +``` +curl -X POST -H "Content-Type: application/json" -d '{"amount": 50.0, "donorName": "Max Mustermann", "receiptRequested": true, "status": "TRANSFERRED", "account": {"name": "Max Mustermann", "bankname": "Bank AG", "number": "1234567890"}}' localhost:8000/campaigns/1/donation +``` + + diff --git a/src/myaktion/handler/campaign.go b/src/myaktion/handler/campaign.go index 8dddcbedbc9335639c2ad99d2824c9e28b734ceb..9b220a71dc4758f1b97eaa19f8f360b218b72acf 100644 --- a/src/myaktion/handler/campaign.go +++ b/src/myaktion/handler/campaign.go @@ -24,6 +24,46 @@ func CreateCampaign(w http.ResponseWriter, r *http.Request) { sendJson(w, campaign) } +func UpdateCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + log.Printf("Error retrieving ID from request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + campaign, err := getCampaign(r) + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + error := service.UpdateCampaign(campaign, id) + if error != nil { + http.Error(w, error.Error(), http.StatusInternalServerError) + return + } + sendJson(w, campaign) +} + +func GetCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + if err != nil { + log.Printf("Error retrieving ID from request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + campaign, err := service.GetCampaign(id) + if err != nil { + log.Printf("Error calling service GetCampagin: %v", 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 { @@ -34,6 +74,43 @@ func GetCampaigns(w http.ResponseWriter, _ *http.Request) { sendJson(w, campaigns) } +func DeleteCampaign(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + + if err != nil { + log.Printf("Error retrieving ID from request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + var campaign model.Campaign + err = service.DeleteCampaign(&campaign, id) + + if err != nil { + log.Printf("Error calling service DeleteCampaign: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + +} + +func AddDonation(w http.ResponseWriter, r *http.Request) { + id, err := getId(r) + + if err != nil { + log.Printf("Error retrieving ID from request: %v", err) + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + + donation, err := getDonation(r) + + if err != nil { + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + err = service.AddDonation(donation, id) +} func getCampaign(r *http.Request) (*model.Campaign, error) { var campaign model.Campaign err := json.NewDecoder(r.Body).Decode(&campaign) @@ -43,3 +120,14 @@ func getCampaign(r *http.Request) (*model.Campaign, error) { } return &campaign, nil } + +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 +} diff --git a/src/myaktion/main.go b/src/myaktion/main.go index 977002565602270c32f1171922dfa53abc1b99e5..9c69c595a6d359df5338aa3ba7320e5c66cb1736 100644 --- a/src/myaktion/main.go +++ b/src/myaktion/main.go @@ -24,8 +24,14 @@ func main() { log.Println("Starting My-Aktion API server") router := mux.NewRouter() router.HandleFunc("/health", handler.Health).Methods("GET") + router.HandleFunc("/campaigns", handler.CreateCampaign).Methods("POST") + router.HandleFunc("/campaigns/{id}", handler.UpdateCampaign).Methods("PUT") + router.HandleFunc("/campaigns/{id}", handler.GetCampaign).Methods("GET") router.HandleFunc("/campaigns", handler.GetCampaigns).Methods("GET") + router.HandleFunc("/campaigns/{id}", handler.DeleteCampaign).Methods("DELETE") + + router.HandleFunc("/campaigns/{id}/donation", handler.AddDonation).Methods("POST") if err := http.ListenAndServe(":8000", router); err != nil { log.Fatal(err) } diff --git a/src/myaktion/service/campaign.go b/src/myaktion/service/campaign.go index 46e77f39c1d1e448de9c4cafaa7552669a850353..3755b229f1d4eee4fecf138247b7cab55b2b0d14 100644 --- a/src/myaktion/service/campaign.go +++ b/src/myaktion/service/campaign.go @@ -29,3 +29,52 @@ func GetCampaigns() ([]model.Campaign, error) { log.Tracef("Retrieved: %v", campaigns) return campaigns, nil } + +func GetCampaign(id uint) (*model.Campaign, error) { + var campaign *model.Campaign + + result := db.DB.First(&campaign, id) + + if result.Error != nil { + return nil, result.Error + } + log.Tracef("Retrieved: %v", campaign) + return campaign, nil +} + +func UpdateCampaign(campaign *model.Campaign, id uint) error { + result := db.DB.Model(&campaign).Where("id = ?", id).Updates(campaign) + if result.Error != nil { + return result.Error + } + return nil +} + +func DeleteCampaign(campaign *model.Campaign, id uint) error { + + result := db.DB.Model(&campaign).Where("id = ?", id).Delete(campaign) + + if result.Error != nil { + return result.Error + } + + log.Infof("Successfully deleted campaign with ID %v in database.", campaign.ID) + log.Tracef("Deleted: %v", campaign) + + return nil + +} + +func AddDonation(donation *model.Donation, id uint) error { + + donation.CampaignID = id + + result := db.DB.Create(&donation) + + if result.Error != nil { + return result.Error + } + log.Infof("Successfully stored new donation in database.") + log.Tracef("Stored: %v", donation) + return nil +}