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