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