diff --git a/app/plugin_api.go b/app/plugin_api.go index 2ec57bc91d..93600b58ed 100644 --- a/app/plugin_api.go +++ b/app/plugin_api.go @@ -179,6 +179,10 @@ func (api *PluginAPI) DeleteUser(userId string) *model.AppError { return err } +func (api *PluginAPI) GetUsers(options *model.UserGetOptions) ([]*model.User, *model.AppError) { + return api.app.GetUsers(options) +} + func (api *PluginAPI) GetUser(userId string) (*model.User, *model.AppError) { return api.app.GetUser(userId) } diff --git a/app/plugin_api_test.go b/app/plugin_api_test.go index b7d0c0a03a..7afc6012be 100644 --- a/app/plugin_api_test.go +++ b/app/plugin_api_test.go @@ -47,6 +47,93 @@ func setupPluginApiTest(t *testing.T, pluginCode string, pluginManifest string, app.SetPluginsEnvironment(env) } +func TestPluginAPIGetUsers(t *testing.T) { + th := Setup() + defer th.TearDown() + api := th.SetupPluginAPI() + + user1, err := th.App.CreateUser(&model.User{ + Email: strings.ToLower(model.NewId()) + "success+test@example.com", + Password: "password", + Username: "user1" + model.NewId(), + }) + require.Nil(t, err) + defer th.App.PermanentDeleteUser(user1) + + user2, err := th.App.CreateUser(&model.User{ + Email: strings.ToLower(model.NewId()) + "success+test@example.com", + Password: "password", + Username: "user2" + model.NewId(), + }) + require.Nil(t, err) + defer th.App.PermanentDeleteUser(user2) + + user3, err := th.App.CreateUser(&model.User{ + Email: strings.ToLower(model.NewId()) + "success+test@example.com", + Password: "password", + Username: "user3" + model.NewId(), + }) + require.Nil(t, err) + defer th.App.PermanentDeleteUser(user3) + + user4, err := th.App.CreateUser(&model.User{ + Email: strings.ToLower(model.NewId()) + "success+test@example.com", + Password: "password", + Username: "user4" + model.NewId(), + }) + require.Nil(t, err) + defer th.App.PermanentDeleteUser(user4) + + testCases := []struct { + Description string + Page int + PerPage int + ExpectedUsers []*model.User + }{ + { + "page 0, perPage 0", + 0, + 0, + []*model.User{}, + }, + { + "page 0, perPage 10", + 0, + 10, + []*model.User{user1, user2, user3, user4}, + }, + { + "page 0, perPage 2", + 0, + 2, + []*model.User{user1, user2}, + }, + { + "page 1, perPage 2", + 1, + 2, + []*model.User{user3, user4}, + }, + { + "page 10, perPage 10", + 10, + 10, + []*model.User{}, + }, + } + + for _, testCase := range testCases { + t.Run(testCase.Description, func(t *testing.T) { + users, err := api.GetUsers(&model.UserGetOptions{ + Page: testCase.Page, + PerPage: testCase.PerPage, + }) + assert.Nil(t, err) + assert.Equal(t, testCase.ExpectedUsers, users) + }) + } +} + func TestPluginAPIGetUsersInTeam(t *testing.T) { th := Setup().InitBasic() defer th.TearDown() diff --git a/plugin/api.go b/plugin/api.go index b49413e1b5..9ef2d92fa2 100644 --- a/plugin/api.go +++ b/plugin/api.go @@ -55,6 +55,11 @@ type API interface { // DeleteUser deletes a user. DeleteUser(userId string) *model.AppError + // GetUsers a list of users based on search options. + // + // Minimum server version: 5.10 + GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError) + // GetUser gets a user. GetUser(userId string) (*model.User, *model.AppError) diff --git a/plugin/client_rpc_generated.go b/plugin/client_rpc_generated.go index 339c1dac39..50b32aab0c 100644 --- a/plugin/client_rpc_generated.go +++ b/plugin/client_rpc_generated.go @@ -755,6 +755,35 @@ func (s *apiRPCServer) DeleteUser(args *Z_DeleteUserArgs, returns *Z_DeleteUserR return nil } +type Z_GetUsersArgs struct { + A *model.UserGetOptions +} + +type Z_GetUsersReturns struct { + A []*model.User + B *model.AppError +} + +func (g *apiRPCClient) GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError) { + _args := &Z_GetUsersArgs{} + _returns := &Z_GetUsersReturns{} + if err := g.client.Call("Plugin.GetUsers", _args, _returns); err != nil { + log.Printf("RPC call to GetUsers API failed: %s", err.Error()) + } + return _returns.A, _returns.B +} + +func (s *apiRPCServer) GetUsers(args *Z_GetUsersArgs, returns *Z_GetUsersReturns) error { + if hook, ok := s.impl.(interface { + GetUsers(*model.UserGetOptions) ([]*model.User, *model.AppError) + }); ok { + returns.A, returns.B = hook.GetUsers(args.A) + } else { + return encodableError(fmt.Errorf("API GetUsers called but not implemented.")) + } + return nil +} + type Z_GetUserArgs struct { A string } diff --git a/plugin/plugintest/api.go b/plugin/plugintest/api.go index 2d1bd3a357..d5d6dfb20b 100644 --- a/plugin/plugintest/api.go +++ b/plugin/plugintest/api.go @@ -1516,6 +1516,31 @@ func (_m *API) GetUserStatusesByIds(userIds []string) ([]*model.Status, *model.A return r0, r1 } +// GetUsers provides a mock function with given fields: _a0 +func (_m *API) GetUsers(_a0 *model.UserGetOptions) ([]*model.User, *model.AppError) { + ret := _m.Called(_a0) + + var r0 []*model.User + if rf, ok := ret.Get(0).(func(*model.UserGetOptions) []*model.User); ok { + r0 = rf(_a0) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).([]*model.User) + } + } + + var r1 *model.AppError + if rf, ok := ret.Get(1).(func(*model.UserGetOptions) *model.AppError); ok { + r1 = rf(_a0) + } else { + if ret.Get(1) != nil { + r1 = ret.Get(1).(*model.AppError) + } + } + + return r0, r1 +} + // GetUsersByUsernames provides a mock function with given fields: usernames func (_m *API) GetUsersByUsernames(usernames []string) ([]*model.User, *model.AppError) { ret := _m.Called(usernames)