tag/obs/tagged.jsView |
---|
1 | 1 … | var { Value, computed } = require('mutant') |
2 | 2 … | var pull = require('pull-stream') |
3 | 3 … | var nest = require('depnest') |
4 | 4 … | var ref = require('ssb-ref') |
| 5 … | +var set = require('lodash/set') |
5 | 6 … | |
6 | 7 … | exports.needs = nest({ |
7 | 8 … | 'sbot.pull.stream': 'first' |
8 | 9 … | }) |
9 | 10 … | |
10 | 11 … | exports.gives = nest({ |
11 | 12 … | 'tag.obs': [ |
12 | 13 … | 'taggedMessages', |
13 | | - 'messagesTagged' |
| 14 … | + 'messageTags', |
| 15 … | + 'allTagsFrom' |
14 | 16 … | ] |
15 | 17 … | }) |
16 | 18 … | |
17 | 19 … | exports.create = function(api) { |
21 | 23 … | |
22 | 24 … | return nest({ |
23 | 25 … | 'tag.obs': { |
24 | 26 … | taggedMessages, |
25 | | - messageTags |
| 27 … | + messageTags, |
| 28 … | + allTagsFrom |
26 | 29 … | } |
27 | 30 … | }) |
28 | 31 … | |
29 | 32 … | function taggedMessages(author, tagId) { |
35 | 38 … | if (!ref.isLink(tagId) || !ref.isLink(msgId)) throw new Error('Requires an ssb ref!') |
36 | 39 … | return withSync(computed([get(msgId, messagesCache), tagId], getMessageTags)) |
37 | 40 … | } |
38 | 41 … | |
| 42 … | + function allTagsFrom(author) { |
| 43 … | + if (!ref.isLink(author)) throw new Error('Requires an ssb ref!') |
| 44 … | + return withSync(computed(get(author, tagsCache), lookup => Object.keys(lookup))) |
| 45 … | + } |
| 46 … | + |
39 | 47 … | function withSync(obs) { |
40 | 48 … | obs.sync = sync |
41 | 49 … | return obs |
42 | 50 … | } |
57 | 65 … | pull( |
|
58 | 66 … | api.sbot.pull.stream(sbot => sbot.tags.stream({ live: true })), |
59 | 67 … | pull.drain(item => { |
60 | 68 … | if (!sync()) { |
61 | | - |
62 | | - for (const author in item.tags) { |
63 | | - update(author, item.tags[author], tagsCache) |
| 69 … | + |
| 70 … | + const messageLookup = {} |
| 71 … | + for (const author in item) { |
| 72 … | + update(author, item[author], tagsCache) |
| 73 … | + |
| 74 … | + |
| 75 … | + for (const tag in item[author]) { |
| 76 … | + for (const message in item[author][tag]) { |
| 77 … | + set(messageLookup, [message, tag, author], item[message][author][tag]) |
| 78 … | + } |
| 79 … | + } |
64 | 80 … | } |
65 | | - for (const message in item.messages) { |
66 | | - update(message, item.messages[message], messagesCache) |
| 81 … | + |
| 82 … | + |
| 83 … | + for (const message in messageLookup) { |
| 84 … | + update(message, messageLookup[message], messagesCache) |
67 | 85 … | } |
| 86 … | + |
68 | 87 … | if (!sync()) { |
69 | 88 … | sync.set(true) |
70 | 89 … | } |
71 | 90 … | } else if (item && ref.isLink(item.tag) && ref.isLink(item.author) && ref.isLink(item.message)) { |
72 | 91 … | |
73 | 92 … | const { tag, author, message, tagged, timestamp } = item |
74 | | - update(author, { [tag]: { [message]: { timestamp, tagged } } }, tagsCache) |
75 | | - update(message, { [tag]: { [author]: { timestamp, tagged } } }, messagesCache) |
| 93 … | + update(author, { [tag]: { [message]: timestamp } }, tagsCache) |
| 94 … | + update(message, { [tag]: { [author]: timestamp } }, messagesCache) |
76 | 95 … | } |
77 | 96 … | }) |
78 | 97 … | ) |
79 | 98 … | } |
111 | 130 … | |
112 | 131 … | function getMessageTags(lookup, tagId) { |
113 | 132 … | const tags = {} |
114 | 133 … | for (const author in lookup[tagId]) { |
115 | | - if (lookup[tagId][author].tagged) { |
| 134 … | + if (lookup[tagId][author]) { |
116 | 135 … | if (!tags[tagId]) tags[tagId] = {} |
117 | | - tags[tagId][author] = lookup[tagId][author].timestamp |
| 136 … | + tags[tagId][author] = lookup[tagId][author] |
118 | 137 … | } |
119 | 138 … | } |
120 | 139 … | return tags |
121 | 140 … | } |