// Cleans up the Value property, and removes rows that aren't visible to the current user func filterViewResult(input walrus.ViewResult, user auth.User) (result walrus.ViewResult) { checkChannels := false var visibleChannels ch.TimedSet if user != nil { visibleChannels = user.InheritedChannels() checkChannels = !visibleChannels.Contains("*") } result.TotalRows = input.TotalRows result.Rows = make([]*walrus.ViewRow, 0, len(input.Rows)/2) for _, row := range input.Rows { value := row.Value.([]interface{}) // value[0] is the array of channels; value[1] is the actual value if !checkChannels || channelsIntersect(visibleChannels, value[0].([]interface{})) { // Add this row: stripSyncProperty(row) result.Rows = append(result.Rows, &walrus.ViewRow{ Key: row.Key, Value: value[1], ID: row.ID, Doc: row.Doc, }) } } return }
// Creates a userCtx object to be passed to the sync function func makeUserCtx(user auth.User) map[string]interface{} { if user == nil { return nil } return map[string]interface{}{ "name": user.Name(), "roles": user.RoleNames(), "channels": user.InheritedChannels().AllChannels(), } }
// Cleans up the Value property, and removes rows that aren't visible to the current user func filterViewResult(input sgbucket.ViewResult, user auth.User, applyChannelFiltering bool) (result sgbucket.ViewResult) { hasStarChannel := false var visibleChannels ch.TimedSet if user != nil { visibleChannels = user.InheritedChannels() hasStarChannel = !visibleChannels.Contains("*") if !applyChannelFiltering { return // this is an error } } result.TotalRows = input.TotalRows result.Rows = make([]*sgbucket.ViewRow, 0, len(input.Rows)/2) for _, row := range input.Rows { if applyChannelFiltering { value, ok := row.Value.([]interface{}) if ok { // value[0] is the array of channels; value[1] is the actual value if !hasStarChannel || channelsIntersect(visibleChannels, value[0].([]interface{})) { // Add this row: stripSyncProperty(row) result.Rows = append(result.Rows, &sgbucket.ViewRow{ Key: row.Key, Value: value[1], ID: row.ID, Doc: row.Doc, }) } } } else { // Add the raw row: stripSyncProperty(row) result.Rows = append(result.Rows, &sgbucket.ViewRow{ Key: row.Key, Value: row.Value, ID: row.ID, Doc: row.Doc, }) } } result.TotalRows = len(result.Rows) return }