// Updates the Channels property of a document object with current & past channels. // Returns the set of channels that have changed (document joined or left in this revision) func (doc *document) updateChannels(newChannels base.Set) (changedChannels base.Set) { var changed []string oldChannels := doc.Channels if oldChannels == nil { oldChannels = ChannelMap{} doc.Channels = oldChannels } else { // Mark every no-longer-current channel as unsubscribed: curSequence := doc.Sequence for channel, removal := range oldChannels { if removal == nil && !newChannels.Contains(channel) { oldChannels[channel] = &ChannelRemoval{ Seq: curSequence, RevID: doc.CurrentRev, Deleted: doc.Deleted} changed = append(changed, channel) } } } // Mark every current channel as subscribed: for channel, _ := range newChannels { if value, exists := oldChannels[channel]; value != nil || !exists { oldChannels[channel] = nil changed = append(changed, channel) } } if changed != nil { base.LogTo("CRUD", "\tDoc %q in channels %q", doc.ID, newChannels) changedChannels = channels.SetOf(changed...) } return }
// Updates membership to match the given Set. Newly added members will have the given sequence. func (set TimedSet) UpdateAtSequence(other base.Set, sequence uint64) bool { changed := false for name, _ := range set { if !other.Contains(name) { delete(set, name) changed = true } } for name, _ := range other { if !set.Contains(name) { set[name] = sequence changed = true } } return changed }
// If a channel list contains a wildcard ("*"), replace it with all the user's accessible channels. func (user *userImpl) ExpandWildCardChannel(channels base.Set) base.Set { if channels.Contains("*") { channels = user.InheritedChannels().AsSet() } return channels }