summaryrefslogtreecommitdiffstats
path: root/models/watchable.js
blob: 7dbacb5949719bb0c89322c7da50a2bf6b50d4a0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
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);