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)
 }
diff --git a/core/kg/cmd/commands/root.go b/core/kg/cmd/commands/root.go
index 70a4d23..6316ab1 100644
--- a/core/kg/cmd/commands/root.go
+++ b/core/kg/cmd/commands/root.go
@@ -1,9 +1,11 @@
 package commands
 
 import (
+	"github.com/giolekva/pcloud/core/kg/app"
 	"github.com/giolekva/pcloud/core/kg/log"
 	"github.com/giolekva/pcloud/core/kg/model"
 	"github.com/giolekva/pcloud/core/kg/server"
+	"github.com/giolekva/pcloud/core/kg/store/memory"
 	"github.com/spf13/cobra"
 )
 
@@ -35,8 +37,11 @@
 	})
 	config := model.NewConfig()
 
-	grpcServer := server.NewGRPCServer(logger, config, nil)
-	httpServer := server.NewHTTPServer(logger, config, nil)
+	st := memory.New()
+	a := app.NewApp(st, logger)
+
+	grpcServer := server.NewGRPCServer(logger, config, a)
+	httpServer := server.NewHTTPServer(logger, config, a)
 
 	servers := server.New(logger)
 	servers.AddServers(grpcServer)
diff --git a/core/kg/server/http_server.go b/core/kg/server/http_server.go
index dd8151a..932d53b 100644
--- a/core/kg/server/http_server.go
+++ b/core/kg/server/http_server.go
@@ -12,38 +12,37 @@
 	"github.com/giolekva/pcloud/core/kg/common"
 	"github.com/giolekva/pcloud/core/kg/log"
 	"github.com/giolekva/pcloud/core/kg/model"
-	"github.com/giolekva/pcloud/core/kg/store"
 	"github.com/gorilla/mux"
 )
 
 // HTTPServerImpl http server implementation
 type HTTPServerImpl struct {
-	Log     common.LoggerIface
 	srv     *http.Server
-	routers *rest.Routers
+	routers *rest.Router
 	config  *model.Config
-	store   store.Store
+	app     common.AppIface
+	logger  common.LoggerIface
 }
 
 var _ Server = &HTTPServerImpl{}
 
 // NewHTTPServer creates new HTTP Server
-func NewHTTPServer(logger common.LoggerIface, config *model.Config, store store.Store) Server {
+func NewHTTPServer(logger common.LoggerIface, config *model.Config, app common.AppIface) Server {
 	a := &HTTPServerImpl{
-		Log:     logger,
-		routers: rest.NewRouter(mux.NewRouter()),
+		logger:  logger,
+		routers: rest.NewRouter(mux.NewRouter(), app, logger),
 		config:  config,
-		store:   store,
+		app:     app,
 	}
 
 	pwd, _ := os.Getwd()
-	a.Log.Info("HTTP server current working", log.String("directory", pwd))
+	a.logger.Info("HTTP server current working", log.String("directory", pwd))
 	return a
 }
 
 // Start method starts a http server
 func (a *HTTPServerImpl) Start() error {
-	a.Log.Info("Starting HTTP Server...")
+	a.logger.Info("Starting HTTP Server...")
 
 	a.srv = &http.Server{
 		Addr:         fmt.Sprintf("%s:%d", a.config.HTTP.Host, a.config.HTTP.Port),
@@ -53,9 +52,9 @@
 		IdleTimeout:  time.Duration(a.config.HTTP.IdleTimeout) * time.Second,
 	}
 
-	a.Log.Info("HTTP Server is listening on", log.Int("port", a.config.HTTP.Port))
+	a.logger.Info("HTTP Server is listening on", log.Int("port", a.config.HTTP.Port))
 	if err := a.srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
-		a.Log.Error("Failed to listen and serve: %v", log.Err(err))
+		a.logger.Error("Failed to listen and serve: %v", log.Err(err))
 		return err
 	}
 	return nil
@@ -63,7 +62,7 @@
 
 // Shutdown method shuts http server down
 func (a *HTTPServerImpl) Shutdown() error {
-	a.Log.Info("Stopping HTTP Server...")
+	a.logger.Info("Stopping HTTP Server...")
 	if a.srv == nil {
 		return errors.New("No http server present")
 	}
@@ -71,11 +70,11 @@
 	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
 	defer cancel()
 	if err := a.srv.Shutdown(ctx); err != nil {
-		a.Log.Error("Unable to shutdown server", log.Err(err))
+		a.logger.Error("Unable to shutdown server", log.Err(err))
 	}
 
 	// a.srv.Close()
 	// a.srv = nil
-	a.Log.Info("HTTP Server stopped")
+	a.logger.Info("HTTP Server stopped")
 	return nil
 }
diff --git a/core/kg/server/servers_mock.go b/core/kg/server/servers_mock.go
index e2b6afc..03ff60d 100644
--- a/core/kg/server/servers_mock.go
+++ b/core/kg/server/servers_mock.go
@@ -24,7 +24,7 @@
 	config := model.NewConfig()
 	logger := &log.NoOpLogger{}
 	grpcServer := NewGRPCServer(logger, config, app)
-	httpServer := NewHTTPServer(logger, config, nil)
+	httpServer := NewHTTPServer(logger, config, app)
 	ts := &MockServer{
 		App:     app,
 		Servers: []Server{grpcServer, httpServer},