Add rest router
diff --git a/core/kg/api/rest/router.go b/core/kg/api/rest/router.go
new file mode 100644
index 0000000..8e695f2
--- /dev/null
+++ b/core/kg/api/rest/router.go
@@ -0,0 +1,39 @@
+package rest
+
+import (
+	"net/http"
+
+	"github.com/gorilla/mux"
+)
+
+const APIURLSuffix = "/api/v1"
+
+type Routers struct {
+	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 {
+	apiRoot := root.PathPrefix(APIURLSuffix).Subrouter()
+	users := apiRoot.PathPrefix("/users").Subrouter()
+	user := apiRoot.PathPrefix("/users/{user_id:[A-Za-z0-9]+}").Subrouter()
+
+	routers := &Routers{
+		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")
+}
diff --git a/core/kg/api/rest/user_service.go b/core/kg/api/rest/user_service.go
new file mode 100644
index 0000000..91c7cb6
--- /dev/null
+++ b/core/kg/api/rest/user_service.go
@@ -0,0 +1,12 @@
+package rest
+
+import "net/http"
+
+func createUser(w http.ResponseWriter, r *http.Request) {
+}
+
+func getUsers(w http.ResponseWriter, r *http.Request) {
+}
+
+func getUser(w http.ResponseWriter, r *http.Request) {
+}
diff --git a/core/kg/api/rpc/user_service.go b/core/kg/api/rpc/user_service.go
new file mode 100644
index 0000000..c424cee
--- /dev/null
+++ b/core/kg/api/rpc/user_service.go
@@ -0,0 +1,47 @@
+package rpc
+
+import (
+	"context"
+
+	"github.com/giolekva/pcloud/core/kg/common"
+	"github.com/giolekva/pcloud/core/kg/model/proto"
+	"github.com/pkg/errors"
+	"google.golang.org/protobuf/types/known/timestamppb"
+)
+
+type userService struct {
+	proto.UnimplementedUserServiceServer
+	app common.AppIface
+}
+
+// NewService returns new user service
+func NewService(app common.AppIface) proto.UserServiceServer {
+	s := &userService{
+		app: app,
+	}
+	return s
+}
+
+func (us *userService) GetUser(c context.Context, r *proto.GetUserRequest) (*proto.GetUserResponse, error) {
+	user, err := us.app.GetUser(r.GetId())
+	if err != nil {
+		return nil, errors.Wrap(err, "can't get user from application")
+	}
+	return &proto.GetUserResponse{
+		User: &proto.User{
+			Id:                 &user.ID,
+			CreateAt:           &timestamppb.Timestamp{Seconds: user.CreateAt},
+			UpdateAt:           &timestamppb.Timestamp{Seconds: user.UpdateAt},
+			DeleteAt:           &timestamppb.Timestamp{Seconds: user.DeleteAt},
+			Username:           user.Username,
+			Password:           user.Password,
+			LastPasswordUpdate: &timestamppb.Timestamp{Seconds: user.LastPasswordUpdate},
+		},
+	}, nil
+}
+func (us *userService) ListUsers(context.Context, *proto.ListUserRequest) (*proto.ListUserResponse, error) {
+	return nil, nil
+}
+func (us *userService) CreateUser(context.Context, *proto.CreateUserRequest) (*proto.CreateUserResponse, error) {
+	return nil, nil
+}
diff --git a/core/kg/api/rpc/user_service_test.go b/core/kg/api/rpc/user_service_test.go
new file mode 100644
index 0000000..ec53f89
--- /dev/null
+++ b/core/kg/api/rpc/user_service_test.go
@@ -0,0 +1,32 @@
+package rpc_test
+
+import (
+	"context"
+	"fmt"
+	"testing"
+
+	"github.com/giolekva/pcloud/core/kg/model/proto"
+	"github.com/giolekva/pcloud/core/kg/server"
+	"github.com/stretchr/testify/assert"
+	"google.golang.org/grpc"
+)
+
+func TestUserService(t *testing.T) {
+	ts := server.Setup(t)
+	defer ts.ShutdownServers()
+	_, err := ts.App.GetUser("id")
+	assert.NotNil(t, err)
+
+	ctx := context.Background()
+	address := fmt.Sprintf("localhost:%d", ts.Config.GRPC.Port)
+	conn, err := grpc.Dial(address, grpc.WithInsecure())
+	if err != nil {
+		t.Fatalf("did not connect: %v", err)
+	}
+	defer conn.Close()
+
+	client := proto.NewUserServiceClient(conn)
+	request := &proto.GetUserRequest{Id: "id"}
+	_, err = client.GetUser(ctx, request)
+	assert.NotNil(t, err)
+}