diff --git a/spargcom/senuma/database/database.go b/spargcom/senuma/database/database.go index 52738f1..0d0e27c 100644 --- a/spargcom/senuma/database/database.go +++ b/spargcom/senuma/database/database.go @@ -33,6 +33,86 @@ func CreateArtikel(art domain.Artikel) (resArt domain.Artikel, err error) { return resArt, err } +func DeleteArtikel(artId uint64) (result, err error) { + conn, err := sql.Open(dbType, dbConnection) + if err != nil { + log.Println("Error while connecting DB: ", err) + } + log.Println("DB Verbindung hergestellt") + defer conn.Close() + + _, err = conn.Exec("DELETE FROM artikel WHERE id = ?", artId) + if err != nil { + log.Fatal("Error while executing DELETE statement", err) + } + return result, err +} + +func ShowArtikel() (artArray []domain.Artikel, err error) { + conn, err := sql.Open(dbType, dbConnection) + if err != nil { + log.Println("Error while connecting DB: ", err) + } + log.Println("DB Verbindung hergestellt") + defer conn.Close() + + results, err := conn.Query("SELECT * FROM artikel") + if err != nil { + log.Fatal("Error while executing SELECt statement", err) + } + + var art domain.Artikel + for results.Next() { + err = results.Scan(&art.Id, &art.Bezeichnung, &art.ArtNrExt) + if err != nil { + log.Fatal("Error: ", err) + } + artArray = append(artArray, art) + } + return artArray, err +} + +func GetArtikel(id uint64) (artikel domain.Artikel, err error) { + conn, err := sql.Open(dbType, dbConnection) + if err != nil { + log.Println("Error while connecting DB: ", err) + } + log.Println("DB Verbindung hergestellt") + defer conn.Close() + + results, err := conn.Query("SELECT * FROM artikel WHERE id=?", id) + if err != nil { + log.Fatal("Error while executing SELECt statement", err) + } + for results.Next() { + err = results.Scan(&artikel.Id, &artikel.Bezeichnung, &artikel.ArtNrExt) + if err != nil { + log.Fatal("Error: ", err) + } + } + + return artikel, err +} + +func UpdateArtikel(art domain.Artikel) (resArt domain.Artikel, err error) { + conn, err := sql.Open(dbType, dbConnection) + if err != nil { + log.Println("Error while connecting DB: ", err) + } + log.Println("Verbindung hergestellt") + log.Println("Bezeichnung = ", art.Bezeichnung) + defer conn.Close() + + _, err = conn.Exec("UPDATE artikel SET bezeichnung=?, artnr_ext=? WHERE id=?", art.Bezeichnung, art.ArtNrExt, art.Id) + if err != nil { + log.Println("Error while executing insert statement", err) + } + + resArt = art + + return resArt, err +} + /*func CreateUser(us domain.User) (resUs domain.User, err error) { conn, err := sql.Open(dbType, dbConnection) if err != nil { diff --git a/spargcom/senuma/senuma b/spargcom/senuma/senuma new file mode 100644 index 0000000..946b199 Binary files /dev/null and b/spargcom/senuma/senuma differ diff --git a/spargcom/senuma/senuma.exe b/spargcom/senuma/senuma.exe index 3eccb8a..a1ae93a 100644 Binary files a/spargcom/senuma/senuma.exe and b/spargcom/senuma/senuma.exe differ diff --git a/spargcom/senuma/senuma.go b/spargcom/senuma/senuma.go index 4114e9b..618d445 100644 --- a/spargcom/senuma/senuma.go +++ b/spargcom/senuma/senuma.go @@ -8,6 +8,7 @@ import ( "os" "spargcom/senuma/database" "spargcom/senuma/domain" + "strconv" log "github.com/sirupsen/logrus" @@ -25,7 +26,12 @@ func main() { log.SetOutput(file) log.SetLevel(log.InfoLevel) r := mux.NewRouter() - r.HandleFunc("/artikel", createArtikelHandler).Methods("POST") + r.Use(CORS) + 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("/groups", createGroupHandler).Methods("POST") @@ -34,13 +40,14 @@ func main() { //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") } func createArtikelHandler(writer http.ResponseWriter, req *http.Request) { + body, err := ioutil.ReadAll(req.Body) if err != nil { writer.WriteHeader(http.StatusBadRequest) @@ -49,6 +56,7 @@ func createArtikelHandler(writer http.ResponseWriter, req *http.Request) { 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) @@ -56,7 +64,7 @@ func createArtikelHandler(writer http.ResponseWriter, req *http.Request) { b, err := json.Marshal(res) if err != nil { - log.Println("Error: ", err) + log.Fatal("Error: ", err) } location := fmt.Sprintf("%s/%d", req.URL.String(), res.Id) @@ -65,3 +73,101 @@ func createArtikelHandler(writer http.ResponseWriter, req *http.Request) { 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) +} + +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 + }) +} diff --git a/spargcom/senuma/senuma.log b/spargcom/senuma/senuma.log index b7c962e..bd5cfa0 100644 --- a/spargcom/senuma/senuma.log +++ b/spargcom/senuma/senuma.log @@ -1,2 +1,35 @@ time="2021-05-12T22:07:25+02:00" level=info msg="Bezeichnung = HP ProLine 405 G6" time="2021-05-12T22:07:25+02:00" level=info msg="externe Art-Nr = HPPL405G6" +time="2021-05-13T17:18:52+02:00" level=info msg="Deleting artikel with ID0" +time="2021-05-13T17:26:53+02:00" level=info msg="Deleting artikel with ID0" +time="2021-05-13T17:30:21+02:00" level=info msg="Deleting artikel with ID6" +time="2021-05-27T18:19:33+02:00" level=info msg="Deleting artikel with ID5" +time="2021-05-27T18:25:56+02:00" level=info msg="Deleting artikel with ID4" +time="2021-05-28T17:41:08+02:00" level=info msg="Bezeichnung = HP ProLine 405 G6" +time="2021-05-28T17:41:08+02:00" level=info msg="externe Art-Nr = HPPL405G6" +time="2021-05-28T17:41:08+02:00" level=info msg="creating new ArtikelHP ProLine 405 G6" +time="2021-05-28T17:41:22+02:00" level=info msg="Bezeichnung = HP ProLine 405 G6" +time="2021-05-28T17:41:22+02:00" level=info msg="externe Art-Nr = HPPL405G6" +time="2021-05-28T17:41:22+02:00" level=info msg="creating new ArtikelHP ProLine 405 G6" +time="2021-05-28T18:01:47+02:00" level=info msg="Bezeichnung = HP ProLine 405 G6" +time="2021-05-28T18:01:47+02:00" level=info msg="externe Art-Nr = HPPL405G6" +time="2021-05-28T18:01:47+02:00" level=info msg="creating new ArtikelHP ProLine 405 G6" +time="2021-05-28T18:06:47+02:00" level=info msg="Deleting artikel with ID8" +time="2021-05-28T18:07:50+02:00" level=info msg="Deleting artikel with ID8" +time="2021-05-28T18:08:06+02:00" level=info msg="Deleting artikel with ID9" +time="2021-05-28T18:09:19+02:00" level=info msg="Deleting artikel with ID7" +time="2021-05-28T21:22:39+02:00" level=info msg="Bezeichnung = fkgjkd" +time="2021-05-28T21:22:39+02:00" level=info msg="externe Art-Nr = 4857" +time="2021-05-28T21:22:39+02:00" level=info msg="creating new Artikelfkgjkd" +time="2021-05-28T22:29:14+02:00" level=info msg="Bezeichnung = Test" +time="2021-05-28T22:29:14+02:00" level=info msg="externe Art-Nr = 689ghjzui" +time="2021-05-28T22:29:14+02:00" level=info msg="creating new ArtikelTest" +time="2021-05-28T23:48:07+02:00" level=info msg="Bezeichnung = Test" +time="2021-05-28T23:48:07+02:00" level=info msg="externe Art-Nr = 689ghjzui" +time="2021-05-28T23:48:07+02:00" level=info msg="updating ArtikelTest" +time="2021-05-28T23:48:34+02:00" level=info msg="Bezeichnung = fkgjkd" +time="2021-05-28T23:48:34+02:00" level=info msg="externe Art-Nr = 4857" +time="2021-05-28T23:48:34+02:00" level=info msg="updating Artikelfkgjkd" +time="2021-05-28T23:54:30+02:00" level=info msg="Bezeichnung = HP ProLine 405 G6" +time="2021-05-28T23:54:30+02:00" level=info msg="externe Art-Nr = HPPL405G6" +time="2021-05-28T23:54:30+02:00" level=info msg="updating ArtikelHP ProLine 405 G6" diff --git a/spargcom/senuma/sparg@kub-01 b/spargcom/senuma/sparg@kub-01 new file mode 100644 index 0000000..946b199 Binary files /dev/null and b/spargcom/senuma/sparg@kub-01 differ