Add get users rest endpoint
diff --git a/core/kg/api/rest/user_service.go b/core/kg/api/rest/user_service.go
index 42cf40c..d966305 100644
--- a/core/kg/api/rest/user_service.go
+++ b/core/kg/api/rest/user_service.go
@@ -3,6 +3,7 @@
 import (
 	"encoding/json"
 	"net/http"
+	"strconv"
 
 	"github.com/giolekva/pcloud/core/kg/model"
 	"github.com/gorilla/mux"
@@ -38,6 +39,23 @@
 func (router *Router) buildGetUsersHandler() http.Handler {
 	fn := func(w http.ResponseWriter, r *http.Request) error {
 		router.Logger.Debug("Rest API: get users")
+		page := r.URL.Query().Get("page")
+		perPage := r.URL.Query().Get("per_page")
+
+		pageInt, err := strconv.Atoi(page)
+		if err != nil {
+			return errors.New("parameter page should be an int")
+		}
+		perPageInt, err := strconv.Atoi(perPage)
+		if err != nil {
+			return errors.New("parameter per_page should be an int")
+		}
+		users, err := router.App.GetUsers(pageInt, perPageInt)
+		if err != nil {
+			return errors.Wrap(err, "can't get users from app")
+		}
+
+		jsoner(w, http.StatusOK, users)
 		return nil
 	}
 	return HandlerFunc(fn)
diff --git a/core/kg/app/app.go b/core/kg/app/app.go
index 0d8b312..8cdc0d6 100644
--- a/core/kg/app/app.go
+++ b/core/kg/app/app.go
@@ -1,6 +1,7 @@
 package app
 
 import (
+	"github.com/giolekva/pcloud/core/kg/common"
 	"github.com/giolekva/pcloud/core/kg/model"
 	"github.com/giolekva/pcloud/core/kg/store"
 )
@@ -9,11 +10,11 @@
 type App struct {
 	store  store.Store
 	config *model.Config
-	logger logger
+	logger common.LoggerIface
 }
 
 // NewApp creates new app
-func NewApp(store store.Store, config *model.Config, logger logger) *App {
+func NewApp(store store.Store, config *model.Config, logger common.LoggerIface) *App {
 	return &App{
 		store:  store,
 		config: config,
diff --git a/core/kg/app/app_mock.go b/core/kg/app/app_mock.go
index f85e754..41575ff 100644
--- a/core/kg/app/app_mock.go
+++ b/core/kg/app/app_mock.go
@@ -2,6 +2,7 @@
 
 import (
 	"github.com/giolekva/pcloud/core/kg/log"
+	"github.com/giolekva/pcloud/core/kg/model"
 	"github.com/giolekva/pcloud/core/kg/store/memory"
 )
 
@@ -13,6 +14,7 @@
 func NewTestApp() *MockApp {
 	memStore := memory.New()
 	logger := &log.NoOpLogger{}
-	a := NewApp(memStore, logger)
+	config := model.NewConfig()
+	a := NewApp(memStore, config, logger)
 	return &MockApp{a}
 }
diff --git a/core/kg/app/interfaces.go b/core/kg/app/interfaces.go
deleted file mode 100644
index 53cb1aa..0000000
--- a/core/kg/app/interfaces.go
+++ /dev/null
@@ -1,10 +0,0 @@
-package app
-
-import "github.com/giolekva/pcloud/core/kg/log"
-
-type logger interface {
-	Debug(message string, fields ...log.Field)
-	Info(message string, fields ...log.Field)
-	Warn(message string, fields ...log.Field)
-	Error(message string, fields ...log.Field)
-}
diff --git a/core/kg/app/user.go b/core/kg/app/user.go
index dd25e84..063c084 100644
--- a/core/kg/app/user.go
+++ b/core/kg/app/user.go
@@ -15,6 +15,7 @@
 	return user, nil
 }
 
+// CreateUser creates a user. For now it is used only for creation of the very first user
 func (a *App) CreateUser(user *model.User) (*model.User, error) {
 	if !a.isFirstUserAccount() {
 		return nil, errors.New("not a first user")
@@ -28,6 +29,15 @@
 	return updatedUser, nil
 }
 
+//GetUsers returns list of users
+func (a *App) GetUsers(page, perPage int) ([]*model.User, error) {
+	users, err := a.store.User().GetAllWithOptions(page, perPage)
+	if err != nil {
+		return nil, errors.Wrap(err, "can't get users with options from store")
+	}
+	return users, nil
+}
+
 func (a *App) isFirstUserAccount() bool {
 	count, err := a.store.User().Count()
 	if err != nil {
diff --git a/core/kg/common/interfaces.go b/core/kg/common/interfaces.go
index 2c20e28..4966c13 100644
--- a/core/kg/common/interfaces.go
+++ b/core/kg/common/interfaces.go
@@ -15,4 +15,5 @@
 type AppIface interface {
 	GetUser(userID string) (*model.User, error)
 	CreateUser(user *model.User) (*model.User, error)
+	GetUsers(page, perPage int) ([]*model.User, error)
 }
diff --git a/core/kg/store/memory/user_store.go b/core/kg/store/memory/user_store.go
index 62d1ea6..c551131 100644
--- a/core/kg/store/memory/user_store.go
+++ b/core/kg/store/memory/user_store.go
@@ -64,6 +64,23 @@
 	return users, nil
 }
 
+func (us *memoryUserStore) GetAllWithOptions(page, perPage int) ([]*model.User, error) {
+	us.mutex.RLock()
+	defer us.mutex.RUnlock()
+
+	// Not an ideal way to implement a pagination over a map but memory store is for testing anyway.
+	v := make([]*model.User, 0, len(us.users))
+	for _, value := range us.users {
+		v = append(v, value)
+	}
+	users := make([]*model.User, 0, perPage)
+	startIndex := page * perPage
+	for i := startIndex; i < startIndex+perPage && i < len(us.users); i++ {
+		users = append(users, v[i].Clone())
+	}
+	return users, nil
+}
+
 func (us *memoryUserStore) Count() (int64, error) {
 	return int64(us.maxID) - 1, nil
 }
diff --git a/core/kg/store/sqlstore/user_store.go b/core/kg/store/sqlstore/user_store.go
index 38a196a..34ca081 100644
--- a/core/kg/store/sqlstore/user_store.go
+++ b/core/kg/store/sqlstore/user_store.go
@@ -53,3 +53,7 @@
 func (us SqlUserStore) Count() (int64, error) {
 	return 0, nil
 }
+
+func (us SqlUserStore) GetAllWithOptions(page, perPage int) ([]*model.User, error) {
+	return nil, nil
+}
diff --git a/core/kg/store/store.go b/core/kg/store/store.go
index 3d4f4f7..d8ca29d 100644
--- a/core/kg/store/store.go
+++ b/core/kg/store/store.go
@@ -13,4 +13,5 @@
 	Get(id string) (*model.User, error)
 	GetAll() ([]*model.User, error)
 	Count() (int64, error)
+	GetAllWithOptions(page, perPage int) ([]*model.User, error)
 }