[MM-28210] sqlstore/user_store: filter deleted users for GetProfilesInChannel (#15390)

* sqlstore/user_store: filter deleted users for GetProfilesInChannel

* allow GetProfilesInChannel use userGetOptions

* sqlstore/user_store: add more test cases

* store/user_store: refine filter
Этот коммит содержится в:
Ibrahim Serdar Acikgoz
2020-09-16 11:04:17 +03:00
коммит произвёл GitHub
родитель 9c272f0b20
Коммит e69a2a41ca
14 изменённых файлов: 229 добавлений и 77 удалений

Просмотреть файл

@@ -688,11 +688,11 @@ type AppIface interface {
GetUsersByIds(userIds []string, options *store.UserGetByIdsOpts) ([]*model.User, *model.AppError)
GetUsersByUsernames(usernames []string, asAdmin bool, viewRestrictions *model.ViewUsersRestrictions) ([]*model.User, *model.AppError)
GetUsersEtag(restrictionsHash string) string
GetUsersInChannel(channelId string, offset int, limit int) ([]*model.User, *model.AppError)
GetUsersInChannelByStatus(channelId string, offset int, limit int) ([]*model.User, *model.AppError)
GetUsersInChannelMap(channelId string, offset int, limit int, asAdmin bool) (map[string]*model.User, *model.AppError)
GetUsersInChannelPage(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError)
GetUsersInChannelPageByStatus(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError)
GetUsersInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError)
GetUsersInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError)
GetUsersInChannelMap(options *model.UserGetOptions, asAdmin bool) (map[string]*model.User, *model.AppError)
GetUsersInChannelPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError)
GetUsersInChannelPageByStatus(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError)
GetUsersInTeam(options *model.UserGetOptions) ([]*model.User, *model.AppError)
GetUsersInTeamEtag(teamId string, restrictionsHash string) string
GetUsersInTeamPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError)

Просмотреть файл

@@ -8683,7 +8683,7 @@ func (a *OpenTracingAppLayer) GetUsersEtag(restrictionsHash string) string {
return resultVar0
}
func (a *OpenTracingAppLayer) GetUsersInChannel(channelId string, offset int, limit int) ([]*model.User, *model.AppError) {
func (a *OpenTracingAppLayer) GetUsersInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetUsersInChannel")
@@ -8695,7 +8695,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannel(channelId string, offset int, li
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetUsersInChannel(channelId, offset, limit)
resultVar0, resultVar1 := a.app.GetUsersInChannel(options)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
@@ -8705,7 +8705,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannel(channelId string, offset int, li
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetUsersInChannelByStatus(channelId string, offset int, limit int) ([]*model.User, *model.AppError) {
func (a *OpenTracingAppLayer) GetUsersInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetUsersInChannelByStatus")
@@ -8717,7 +8717,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelByStatus(channelId string, offset
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetUsersInChannelByStatus(channelId, offset, limit)
resultVar0, resultVar1 := a.app.GetUsersInChannelByStatus(options)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
@@ -8727,7 +8727,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelByStatus(channelId string, offset
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetUsersInChannelMap(channelId string, offset int, limit int, asAdmin bool) (map[string]*model.User, *model.AppError) {
func (a *OpenTracingAppLayer) GetUsersInChannelMap(options *model.UserGetOptions, asAdmin bool) (map[string]*model.User, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetUsersInChannelMap")
@@ -8739,7 +8739,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelMap(channelId string, offset int,
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetUsersInChannelMap(channelId, offset, limit, asAdmin)
resultVar0, resultVar1 := a.app.GetUsersInChannelMap(options, asAdmin)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
@@ -8749,7 +8749,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelMap(channelId string, offset int,
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetUsersInChannelPage(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError) {
func (a *OpenTracingAppLayer) GetUsersInChannelPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetUsersInChannelPage")
@@ -8761,7 +8761,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelPage(channelId string, page int,
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetUsersInChannelPage(channelId, page, perPage, asAdmin)
resultVar0, resultVar1 := a.app.GetUsersInChannelPage(options, asAdmin)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))
@@ -8771,7 +8771,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelPage(channelId string, page int,
return resultVar0, resultVar1
}
func (a *OpenTracingAppLayer) GetUsersInChannelPageByStatus(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError) {
func (a *OpenTracingAppLayer) GetUsersInChannelPageByStatus(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) {
origCtx := a.ctx
span, newCtx := tracing.StartSpanWithParentByContext(a.ctx, "app.GetUsersInChannelPageByStatus")
@@ -8783,7 +8783,7 @@ func (a *OpenTracingAppLayer) GetUsersInChannelPageByStatus(channelId string, pa
}()
defer span.Finish()
resultVar0, resultVar1 := a.app.GetUsersInChannelPageByStatus(channelId, page, perPage, asAdmin)
resultVar0, resultVar1 := a.app.GetUsersInChannelPageByStatus(options, asAdmin)
if resultVar1 != nil {
span.LogFields(spanlog.Error(resultVar1))

Просмотреть файл

@@ -314,9 +314,17 @@ func (api *PluginAPI) UpdateUserStatus(userId, status string) (*model.Status, *m
func (api *PluginAPI) GetUsersInChannel(channelId, sortBy string, page, perPage int) ([]*model.User, *model.AppError) {
switch sortBy {
case model.CHANNEL_SORT_BY_USERNAME:
return api.app.GetUsersInChannel(channelId, page*perPage, perPage)
return api.app.GetUsersInChannel(&model.UserGetOptions{
InChannelId: channelId,
Page: page,
PerPage: perPage,
})
case model.CHANNEL_SORT_BY_STATUS:
return api.app.GetUsersInChannelByStatus(channelId, page*perPage, perPage)
return api.app.GetUsersInChannelByStatus(&model.UserGetOptions{
InChannelId: channelId,
Page: page,
PerPage: perPage,
})
default:
return nil, model.NewAppError("GetUsersInChannel", "plugin.api.get_users_in_channel", nil, "invalid sort option", http.StatusBadRequest)
}

Просмотреть файл

@@ -505,16 +505,16 @@ func (a *App) GetUsersNotInTeamEtag(teamId string, restrictionsHash string) stri
return fmt.Sprintf("%v.%v.%v.%v", a.Srv().Store.User().GetEtagForProfilesNotInTeam(teamId), a.Config().PrivacySettings.ShowFullName, a.Config().PrivacySettings.ShowEmailAddress, restrictionsHash)
}
func (a *App) GetUsersInChannel(channelId string, offset int, limit int) ([]*model.User, *model.AppError) {
return a.Srv().Store.User().GetProfilesInChannel(channelId, offset, limit)
func (a *App) GetUsersInChannel(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
return a.Srv().Store.User().GetProfilesInChannel(options)
}
func (a *App) GetUsersInChannelByStatus(channelId string, offset int, limit int) ([]*model.User, *model.AppError) {
return a.Srv().Store.User().GetProfilesInChannelByStatus(channelId, offset, limit)
func (a *App) GetUsersInChannelByStatus(options *model.UserGetOptions) ([]*model.User, *model.AppError) {
return a.Srv().Store.User().GetProfilesInChannelByStatus(options)
}
func (a *App) GetUsersInChannelMap(channelId string, offset int, limit int, asAdmin bool) (map[string]*model.User, *model.AppError) {
users, err := a.GetUsersInChannel(channelId, offset, limit)
func (a *App) GetUsersInChannelMap(options *model.UserGetOptions, asAdmin bool) (map[string]*model.User, *model.AppError) {
users, err := a.GetUsersInChannel(options)
if err != nil {
return nil, err
}
@@ -529,16 +529,16 @@ func (a *App) GetUsersInChannelMap(channelId string, offset int, limit int, asAd
return userMap, nil
}
func (a *App) GetUsersInChannelPage(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError) {
users, err := a.GetUsersInChannel(channelId, page*perPage, perPage)
func (a *App) GetUsersInChannelPage(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) {
users, err := a.GetUsersInChannel(options)
if err != nil {
return nil, err
}
return a.sanitizeProfiles(users, asAdmin), nil
}
func (a *App) GetUsersInChannelPageByStatus(channelId string, page int, perPage int, asAdmin bool) ([]*model.User, *model.AppError) {
users, err := a.GetUsersInChannelByStatus(channelId, page*perPage, perPage)
func (a *App) GetUsersInChannelPageByStatus(options *model.UserGetOptions, asAdmin bool) ([]*model.User, *model.AppError) {
users, err := a.GetUsersInChannelByStatus(options)
if err != nil {
return nil, err
}

Просмотреть файл

@@ -528,7 +528,11 @@ func TestGetUsersByStatus(t *testing.T) {
onlineUser2 := createUserWithStatus("online2", model.STATUS_ONLINE)
t.Run("sorting by status then alphabetical", func(t *testing.T) {
usersByStatus, err := th.App.GetUsersInChannelPageByStatus(channel.Id, 0, 8, true)
usersByStatus, err := th.App.GetUsersInChannelPageByStatus(&model.UserGetOptions{
InChannelId: channel.Id,
Page: 0,
PerPage: 8,
}, true)
require.Nil(t, err)
expectedUsersByStatus := []*model.User{
@@ -550,7 +554,11 @@ func TestGetUsersByStatus(t *testing.T) {
})
t.Run("paging", func(t *testing.T) {
usersByStatus, err := th.App.GetUsersInChannelPageByStatus(channel.Id, 0, 3, true)
usersByStatus, err := th.App.GetUsersInChannelPageByStatus(&model.UserGetOptions{
InChannelId: channel.Id,
Page: 0,
PerPage: 3,
}, true)
require.Nil(t, err)
require.Equal(t, 3, len(usersByStatus), "received too many users")
@@ -563,9 +571,14 @@ func TestGetUsersByStatus(t *testing.T) {
require.Equal(t, awayUser1.Id, usersByStatus[2].Id, "expected to receive away users second")
usersByStatus, err = th.App.GetUsersInChannelPageByStatus(channel.Id, 1, 3, true)
usersByStatus, err = th.App.GetUsersInChannelPageByStatus(&model.UserGetOptions{
InChannelId: channel.Id,
Page: 1,
PerPage: 3,
}, true)
require.Nil(t, err)
require.NotEmpty(t, usersByStatus, "at least some users are expected")
require.Equal(t, awayUser2.Id, usersByStatus[0].Id, "expected to receive away users second")
require.False(
@@ -574,7 +587,11 @@ func TestGetUsersByStatus(t *testing.T) {
"expected to receive dnd users third",
)
usersByStatus, err = th.App.GetUsersInChannelPageByStatus(channel.Id, 1, 4, true)
usersByStatus, err = th.App.GetUsersInChannelPageByStatus(&model.UserGetOptions{
InChannelId: channel.Id,
Page: 1,
PerPage: 4,
}, true)
require.Nil(t, err)
require.Equal(t, 4, len(usersByStatus), "received too many users")