diff options
Diffstat (limited to 'models/watchable.js')
-rw-r--r-- | models/watchable.js | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/models/watchable.js b/models/watchable.js new file mode 100644 index 00000000..6821f847 --- /dev/null +++ b/models/watchable.js @@ -0,0 +1,89 @@ +// simple version, only toggle watch / unwatch +const simpleWatchable = (collection) => { + collection.attachSchema({ + watchers: { + type: [String], + optional: true, + }, + }); + + collection.helpers({ + getWatchLevels() { + return [true, false]; + }, + + watcherIndex(userId) { + return this.watchers.indexOf(userId); + }, + + findWatcher(userId) { + return _.contains(this.watchers, userId); + }, + }); + + collection.mutations({ + setWatcher(userId, level) { + // if level undefined or null or false, then remove + if (!level) return { $pull: { watchers: userId }}; + return { $addToSet: { watchers: userId }}; + }, + }); +}; + +// more complex version of same interface, with 3 watching levels +const complexWatchOptions = ['watching', 'tracking', 'muted']; +const complexWatchDefault = 'muted'; + +const complexWatchable = (collection) => { + collection.attachSchema({ + 'watchers.$.userId': { + type: String, + }, + 'watchers.$.level': { + type: String, + allowedValues: complexWatchOptions, + }, + }); + + collection.helpers({ + getWatchOptions() { + return complexWatchOptions; + }, + + getWatchDefault() { + return complexWatchDefault; + }, + + watcherIndex(userId) { + return _.pluck(this.watchers, 'userId').indexOf(userId); + }, + + findWatcher(userId) { + return _.findWhere(this.watchers, { userId }); + }, + + getWatchLevel(userId) { + const watcher = this.findWatcher(userId); + return watcher ? watcher.level : complexWatchDefault; + }, + }); + + collection.mutations({ + setWatcher(userId, level) { + // if level undefined or null or false, then remove + if (level === complexWatchDefault) level = null; + if (!level) return { $pull: { watchers: { userId }}}; + const index = this.watcherIndex(userId); + if (index<0) return { $push: { watchers: { userId, level }}}; + return { + $set: { + [`watchers.${index}.level`]: level, + }, + }; + }, + }); +}; + +complexWatchable(Boards); +simpleWatchable(Lists); +simpleWatchable(Cards); |