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