From 75c384c9f3104a2e9a4936d8bbd6d47c3444742c Mon Sep 17 00:00:00 2001 From: arnaucode Date: Tue, 20 Jun 2017 09:01:46 +0200 Subject: [PATCH] REST architecture implemented --- handlers.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ imageModel.go | 5 +++++ logger.go | 23 +++++++++++++++++++++++ main.go | 13 +++++++++++++ router.go | 24 ++++++++++++++++++++++++ routes.go | 35 +++++++++++++++++++++++++++++++++++ 6 files changed, 149 insertions(+) create mode 100644 handlers.go create mode 100644 imageModel.go create mode 100644 logger.go create mode 100644 main.go create mode 100644 router.go create mode 100644 routes.go diff --git a/handlers.go b/handlers.go new file mode 100644 index 0000000..e53bce9 --- /dev/null +++ b/handlers.go @@ -0,0 +1,49 @@ +package main + +import ( + "encoding/json" + "fmt" + "io" + "io/ioutil" + "net/http" + + "github.com/gorilla/mux" +) + +func Index(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "Welcome! To send images, go to /image") +} + +func ImageShow(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + imageName := vars["imageName"] + fmt.Fprintln(w, "Image show:", imageName) +} + +func NewImage(w http.ResponseWriter, r *http.Request) { + var img ImageModel + body, err := ioutil.ReadAll(io.LimitReader(r.Body, 1048576)) + if err != nil { + panic(err) + } + if err := r.Body.Close(); err != nil { + panic(err) + } + fmt.Println(string(body)) + if err := json.Unmarshal(body, &img); err != nil { + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(422) // unprocessable entity + if err := json.NewEncoder(w).Encode(err); err != nil { + panic(err) + } + } + img.File = body + fmt.Println(img) + fmt.Println(img.File) + + w.Header().Set("Content-Type", "application/json; charset=UTF-8") + w.WriteHeader(http.StatusCreated) + if err := json.NewEncoder(w).Encode(img.File); err != nil { + panic(err) + } +} diff --git a/imageModel.go b/imageModel.go new file mode 100644 index 0000000..881e70f --- /dev/null +++ b/imageModel.go @@ -0,0 +1,5 @@ +package main + +type ImageModel struct { + File []byte `json:"file"` +} diff --git a/logger.go b/logger.go new file mode 100644 index 0000000..3f002e3 --- /dev/null +++ b/logger.go @@ -0,0 +1,23 @@ +package main + +import ( + "log" + "net/http" + "time" +) + +func Logger(inner http.Handler, name string) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + start := time.Now() + + inner.ServeHTTP(w, r) + + log.Printf( + "%s\t%s\t%s\t%s", + r.Method, + r.RequestURI, + name, + time.Since(start), + ) + }) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..73dcf92 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "log" + "net/http" +) + +func main() { + + router := NewRouter() + + log.Fatal(http.ListenAndServe(":3050", router)) +} diff --git a/router.go b/router.go new file mode 100644 index 0000000..32caba3 --- /dev/null +++ b/router.go @@ -0,0 +1,24 @@ +package main + +import ( + "net/http" + + "github.com/gorilla/mux" +) + +func NewRouter() *mux.Router { + router := mux.NewRouter().StrictSlash(true) + for _, route := range routes { + var handler http.Handler + handler = route.HandlerFunc + handler = Logger(handler, route.Name) + + router. + Methods(route.Method). + Path(route.Pattern). + Name(route.Name). + Handler(handler) + + } + return router +} diff --git a/routes.go b/routes.go new file mode 100644 index 0000000..9bfee11 --- /dev/null +++ b/routes.go @@ -0,0 +1,35 @@ +package main + +import ( + "net/http" +) + +type Route struct { + Name string + Method string + Pattern string + HandlerFunc http.HandlerFunc +} + +type Routes []Route + +var routes = Routes{ + Route{ + "Index", + "GET", + "/", + Index, + }, + Route{ + "ImageShow", + "GET", + "/images/{imageName}", + ImageShow, + }, + Route{ + "NewImage", + "POST", + "/image", + NewImage, + }, +}