package main import ( "encoding/json" "fmt" "io/ioutil" "net/http" "os" "spargcom/senuma/database" "spargcom/senuma/domain" "strconv" log "github.com/sirupsen/logrus" "github.com/gorilla/mux" ) func main() { file, err := os.OpenFile("senuma.log", os.O_CREATE|os.O_APPEND, 0644) if err != nil { log.Fatal(err) } defer file.Close() log.SetOutput(file) log.SetLevel(log.InfoLevel) r := mux.NewRouter() r.Use(CORS) // Handler-Funktionscalls r.HandleFunc("/api/artikel", createArtikelHandler).Methods("POST") r.HandleFunc("/api/artikel/{id:[0-9]+}", deleteArtikelHandler).Methods("DELETE") r.HandleFunc("/api/artikel", showArtikelHandler).Methods("GET") r.HandleFunc("/api/artikel/{id:[0-9]+}", getArtikelHandler).Methods("GET") r.HandleFunc("/api/artikel/{id:[0-9]+}", updateArtikelHandler).Methods("PUT") r.HandleFunc("/api/kunden", createKundeHandler).Methods("POST") r.HandleFunc("/api/kunden/{id:[0-9]+}", deleteKundeHandler).Methods("DELETE") r.HandleFunc("/api/kunden", showKundeHandler).Methods("GET") r.HandleFunc("/api/kunden/{id:[0-9]+}", getKundeHandler).Methods("GET") r.HandleFunc("/api/kunden/{id:[0-9]+}", updateKundeHandler).Methods("PUT") r.HandleFunc("/api/lieferanten", createLieferantHandler).Methods("POST") r.HandleFunc("/api/lieferanten/{id:[0-9]+}", deleteLieferantHandler).Methods("DELETE") r.HandleFunc("/api/lieferanten", showLieferantHandler).Methods("GET") r.HandleFunc("/api/lieferanten/{id:[0-9]+}", getLieferantHandler).Methods("GET") r.HandleFunc("/api/lieferanten/{id:[0-9]+}", updateLieferantHandler).Methods("PUT") //r.HandleFunc("/groups", createGroupHandler).Methods("POST") //r.HandleFunc("/users", createUserHandler).Methods("POST") //r.HandleFunc("/accounts", createAccountHandler).Methods("POST") //r.HandleFunc("/tunnels", createTunnelHandler).Methods("POST") http.Handle("/", r) http.ListenAndServe(":8081", r) log.Info("running on localhost, Port 8081") } // Artikel func createArtikelHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var art domain.Artikel json.Unmarshal(body, &art) log.Println("Bezeichnung = ", art.Bezeichnung) log.Println("externe Art-Nr = ", art.ArtNrExt) log.Info("creating new Artikel", art.Bezeichnung) res, err := database.CreateArtikel(art) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusCreated) writer.Write(b) } func deleteArtikelHandler(writer http.ResponseWriter, req *http.Request) { artikelId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) log.Info("Deleting artikel with ID", artikelId) _, err := database.DeleteArtikel(artikelId) if err != nil { log.Fatal("Error: Delete could not be executed", err) } writer.WriteHeader(http.StatusNoContent) } func showArtikelHandler(writer http.ResponseWriter, req *http.Request) { res, err := database.ShowArtikel() if err != nil { log.Fatal("Error: Artikel can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func getArtikelHandler(writer http.ResponseWriter, req *http.Request) { artikelId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) res, err := database.GetArtikel(artikelId) if err != nil { log.Fatal("Error: Artikel can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func updateArtikelHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var art domain.Artikel json.Unmarshal(body, &art) log.Println("Bezeichnung = ", art.Bezeichnung) log.Println("externe Art-Nr = ", art.ArtNrExt) log.Info("updating Artikel", art.Bezeichnung) res, err := database.UpdateArtikel(art) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } // Kunde func createKundeHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var kd domain.Kunde json.Unmarshal(body, &kd) log.Println("Name = ", kd.Name) log.Println("externe Kd-Nr = ", kd.KdNrExt) log.Info("creating new Kunde", kd.Name) res, err := database.CreateKunde(kd) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusCreated) writer.Write(b) } func deleteKundeHandler(writer http.ResponseWriter, req *http.Request) { kundeId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) log.Info("Deleting Kunde with ID", kundeId) _, err := database.DeleteKunde(uint(kundeId)) if err != nil { log.Fatal("Error: Delete could not be executed", err) } writer.WriteHeader(http.StatusNoContent) } func showKundeHandler(writer http.ResponseWriter, req *http.Request) { res, err := database.ShowKunde() if err != nil { log.Fatal("Error: Kunde can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func getKundeHandler(writer http.ResponseWriter, req *http.Request) { kundeId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) res, err := database.GetKunde(kundeId) if err != nil { log.Fatal("Error: Kunde can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func updateKundeHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var kunde domain.Kunde json.Unmarshal(body, &kunde) log.Println("Name = ", kunde.Name) log.Println("externe Kd-Nr = ", kunde.KdNrExt) log.Info("updating Kunde", kunde.Name) res, err := database.UpdateKunde(kunde) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } // Lieferanten func createLieferantHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var lief domain.Lieferant json.Unmarshal(body, &lief) log.Println("Name = ", lief.Name) log.Println("externe Lieferanten-Nr = ", lief.LiefNrExt) log.Info("creating new Lieferant", lief.Name) res, err := database.CreateLieferant(lief) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusCreated) writer.Write(b) } func deleteLieferantHandler(writer http.ResponseWriter, req *http.Request) { lieferantId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) log.Info("Deleting Kunde with ID", lieferantId) _, err := database.DeleteLieferant(uint(lieferantId)) if err != nil { log.Fatal("Error: Delete could not be executed", err) } writer.WriteHeader(http.StatusNoContent) } func showLieferantHandler(writer http.ResponseWriter, req *http.Request) { res, err := database.ShowLieferant() if err != nil { log.Fatal("Error: Lieferant can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func getLieferantHandler(writer http.ResponseWriter, req *http.Request) { lieferId, _ := strconv.ParseUint(mux.Vars(req)["id"], 10, 64) res, err := database.GetLieferant(lieferId) if err != nil { log.Fatal("Error: Lieferant can't be shown ", err) writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := req.URL.String() writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } func updateLieferantHandler(writer http.ResponseWriter, req *http.Request) { body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) } var lieferant domain.Lieferant json.Unmarshal(body, &lieferant) log.Println("Name = ", lieferant.Name) log.Println("externe Lieferanten-Nr = ", lieferant.LiefNrExt) log.Info("updating Lieferant", lieferant.Name) res, err := database.UpdateLieferant(lieferant) if err != nil { writer.WriteHeader(http.StatusInternalServerError) } b, err := json.Marshal(res) if err != nil { log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) writer.Header().Set("Location:", location) writer.Header().Set("Content-Type", "application/json") writer.WriteHeader(http.StatusOK) writer.Write(b) } // General func CORS(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Set headers w.Header().Set("Access-Control-Allow-Headers:", "*") w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "*") if r.Method == "OPTIONS" { w.WriteHeader(http.StatusOK) return } fmt.Println("ok") // Next next.ServeHTTP(w, r) return }) }