aboutsummaryrefslogtreecommitdiff
path: root/lib/contact.js
blob: c4199215bb0b443059aabf990af34d612932985b (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
90
91
var pull = require('pull-stream')
var multicb = require('multicb')

function accumulateNonNull(a, b) {
  return b == null ? a : b
}

module.exports = function (sbot, id, cb) {
  var followed = {}, followedBy = {}, blocked = {}, blockedBy = {}
  var done = multicb({pluck: 1})
  pull(
    sbot.links2.read({
      reverse: true, // oldest first. ssb-links has this switched
      query: [
        {$filter: {
          source: id,
          rel: [{$prefix: 'contact'}]
        }},
        {$reduce: {
          id: 'dest',
          following: {$collect: ['rel', 1]},
          blocking: {$collect: ['rel', 2]}
        }}
      ]
    }),
    pull.drain(function (op) {
      var following = op.following.reduce(accumulateNonNull, null)
      var blocking = op.blocking.reduce(accumulateNonNull, null)
      if (following != null) followed[op.id] = following
      if (blocking != null) blocked[op.id] = blocking
    }, done())
  )
  pull(
    sbot.links2.read({
      reverse: true, // oldest first. ssb-links has this switched
      query: [
        {$filter: {
          dest: id,
          rel: [{$prefix: 'contact'}]
        }},
        {$reduce: {
          id: 'source',
          following: {$collect: ['rel', 1]},
          blocking: {$collect: ['rel', 2]}
        }}
      ]
    }),
    pull.drain(function (op) {
      var following = op.following.reduce(accumulateNonNull, null)
      var blocking = op.blocking.reduce(accumulateNonNull, null)
      if (following != null) followedBy[op.id] = following
      if (blocking != null) blockedBy[op.id] = blocking
    }, done())
  )

  done(function (err) {
    if (err) return cb(new Error(err.stack || err))
    var id
    var friendsList = []
    var followingList = []
    var blockingList = []
    var followedByList = []
    var blockedByList = []

    for (id in followed) {
      if (followed[id]) {
        if (followedBy[id]) friendsList.push(id)
        else followingList.push(id)
      }
    }
    for (id in followedBy) {
      if (followedBy[id] && !followed[id]) {
        followedByList.push(id)
      }
    }
    for (id in blocked) {
      if (blocked[id]) blockingList.push(id)
    }
    for (id in blockedBy) {
      if (blockedBy[id]) blockedByList.push(id)
    }

    cb(null, {
      follows: followingList,
      followers: followedByList,
      friends: friendsList,
      blocks: blockingList,
      blockers: blockedByList
    })
  })
}