git ssb

0+

Josiah / ssb-tags



Tree: 61c7de212f2f9e5ff13ceea09919dcb6d3774c27

Files: 61c7de212f2f9e5ff13ceea09919dcb6d3774c27 / index.js

2137 bytesRaw
1var FlumeReduce = require('flumeview-reduce')
2var ref = require('ssb-ref')
3var get = require('lodash/get')
4var merge = require('lodash/merge')
5
6exports.name = 'tags'
7exports.version = require('./package.json').version
8exports.manifest = {
9 stream: 'source',
10 get: 'async'
11}
12
13var initialState = {}
14
15exports.init = function(ssb, config) {
16 return ssb._flumeUse('tags', FlumeReduce('test', reduce, map, null, initialState))
17
18 function reduce(result, item) {
19 if (!item) return result
20
21 var { root, tagKey, author, message, tagged, timestamp } = item
22 var storedTimestamp = get(result, [author, tagKey, message])
23 var shouldAddTag = tagged && (!storedTimestamp || timestamp > storedTimestamp)
24 var shouldRemoveTag = storedTimestamp && tagged === false
25
26 if (root) {
27 var rootTag = {
28 [author]: {
29 [tagKey]: {}
30 }
31 }
32 result = merge(result, rootTag)
33 } else if (shouldAddTag) {
34 var newTag = {
35 [author]: {
36 [tagKey]: {
37 [message]: timestamp
38 }
39 }
40 }
41 result = merge(result, newTag)
42 } else if (shouldRemoveTag) {
43 delete result[author][tagKey][message]
44 }
45
46 return result
47 }
48
49 function map(msg) {
50 // only include your own tags (for now)
51 if (msg.value.author !== ssb.id) return
52
53 // unbox private message
54 if (msg.value.content === 'string') {
55 // unbox private message (requires ssb-private plugin)
56 msg = ssb.private.unbox(msg)
57 }
58
59 if (isTag(msg)) {
60 return {
61 tagKey: msg.value.content.root,
62 author: msg.value.author,
63 message: msg.value.content.message,
64 tagged: msg.value.content.tagged,
65 timestamp: msg.value.timestamp
66 }
67 } else if (isRootTag(msg)) {
68 return {
69 tagKey: msg.key,
70 author: msg.value.author,
71 timestamp: msg.value.timestamp,
72 root: true
73 }
74 }
75 }
76}
77
78function isRootTag(msg) {
79 return get(msg, 'value.content.type') === 'tag'
80}
81
82function isTag(msg) {
83 return get(msg, 'value.content.type') === 'tag'
84 && ref.isLink(get(msg, 'value.content.message'))
85}
86

Built with git-ssb-web