Add get user resp api endpoint
diff --git a/core/kg/api/rest/handler.go b/core/kg/api/rest/handler.go
new file mode 100644
index 0000000..dbc5882
--- /dev/null
+++ b/core/kg/api/rest/handler.go
@@ -0,0 +1,43 @@
+package rest
+
+import (
+ "encoding/json"
+ "net/http"
+)
+
+type HandlerFunc func(w http.ResponseWriter, r *http.Request) error
+
+// ServeHTTP calls f(w, r) and handles error
+func (f HandlerFunc) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+ if err := f(w, r); err != nil {
+ jsoner(w, http.StatusBadRequest, err.Error()) // TODO detect the correct statusCode from error
+ }
+}
+
+func jsoner(w http.ResponseWriter, statusCode int, payload interface{}) error {
+ w.Header().Set("Content-Type", "application/json")
+
+ // If there is nothing to marshal then set status code and return.
+ if payload == nil {
+ _, err := w.Write([]byte("{}"))
+ return err
+ }
+
+ if statusCode != http.StatusOK {
+ w.WriteHeader(statusCode)
+ }
+
+ encoder := json.NewEncoder(w)
+ encoder.SetEscapeHTML(true)
+ encoder.SetIndent("", "")
+
+ if err := encoder.Encode(payload); err != nil {
+ return err
+ }
+
+ if f, ok := w.(http.Flusher); ok {
+ f.Flush()
+ }
+
+ return nil
+}
diff --git a/core/kg/api/rest/router.go b/core/kg/api/rest/router.go
index 8e695f2..c0bb33a 100644
--- a/core/kg/api/rest/router.go
+++ b/core/kg/api/rest/router.go
@@ -3,37 +3,43 @@
import (
"net/http"
+ "github.com/giolekva/pcloud/core/kg/common"
"github.com/gorilla/mux"
)
const APIURLSuffix = "/api/v1"
-type Routers struct {
+type Router struct {
+ App common.AppIface
+ Logger common.LoggerIface
+
Root *mux.Router // ''
APIRoot *mux.Router // 'api/v1'
Users *mux.Router // 'api/v1/users'
User *mux.Router // 'api/v1/users/{user_id:[A-Za-z0-9]+}'
}
-func NewRouter(root *mux.Router) *Routers {
+func NewRouter(root *mux.Router, app common.AppIface, logger common.LoggerIface) *Router {
apiRoot := root.PathPrefix(APIURLSuffix).Subrouter()
users := apiRoot.PathPrefix("/users").Subrouter()
user := apiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter()
- routers := &Routers{
+ routers := &Router{
+ App: app,
+ Logger: logger,
+
Root: root,
APIRoot: apiRoot,
Users: users,
User: user,
}
+
root.Handle("/api/v1/{anything:.*}", http.HandlerFunc(http.NotFound))
routers.initUsers()
return routers
}
-func (r *Routers) initUsers() {
- r.Users.Handle("", http.HandlerFunc(createUser)).Methods("POST")
- r.Users.Handle("", http.HandlerFunc(getUsers)).Methods("GET")
- r.User.Handle("", http.HandlerFunc(getUser)).Methods("GET")
+func (router *Router) ServeHTTP(w http.ResponseWriter, req *http.Request) {
+ router.Root.ServeHTTP(w, req)
}
diff --git a/core/kg/api/rest/user_service.go b/core/kg/api/rest/user_service.go
index 91c7cb6..c129b78 100644
--- a/core/kg/api/rest/user_service.go
+++ b/core/kg/api/rest/user_service.go
@@ -1,12 +1,52 @@
package rest
-import "net/http"
+import (
+ "net/http"
-func createUser(w http.ResponseWriter, r *http.Request) {
+ "github.com/gorilla/mux"
+ "github.com/pkg/errors"
+)
+
+func (router *Router) initUsers() {
+ router.Users.Handle("", router.buildCreateUserHandler()).Methods("POST")
+ router.Users.Handle("", router.buildGetUsersHandler()).Methods("GET")
+ router.User.Handle("", router.buildGetUserHandler()).Methods("GET")
}
-func getUsers(w http.ResponseWriter, r *http.Request) {
+func (router *Router) buildCreateUserHandler() http.Handler {
+ fn := func(w http.ResponseWriter, r *http.Request) error {
+ router.Logger.Debug("Rest API: create user")
+ return nil
+ }
+ return HandlerFunc(fn)
}
-func getUser(w http.ResponseWriter, r *http.Request) {
+func (router *Router) buildGetUsersHandler() http.Handler {
+ fn := func(w http.ResponseWriter, r *http.Request) error {
+ router.Logger.Debug("Rest API: get users")
+ return nil
+ }
+ return HandlerFunc(fn)
+}
+
+func (router *Router) buildGetUserHandler() http.Handler {
+ fn := func(w http.ResponseWriter, r *http.Request) error {
+ router.Logger.Debug("Rest API: get user")
+ params := mux.Vars(r)
+
+ var userID string
+ var ok bool
+ if userID, ok = params["user_id"]; !ok {
+ return errors.New("missing parameter: user_id")
+ }
+ user, err := router.App.GetUser(userID)
+
+ if err != nil {
+ return errors.Wrapf(err, "can't get user from app")
+ }
+
+ jsoner(w, http.StatusOK, user)
+ return nil
+ }
+ return HandlerFunc(fn)
}