You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

173 lines
4.5 KiB

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)
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")
//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")
}
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)
}
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
})
}