From cbb586300896002d22da7fcb9b8f86ede9745e8a Mon Sep 17 00:00:00 2001 From: cel Date: Wed, 18 Oct 2017 10:52:56 -1000 Subject: Render blocks and blockers on contacts pages --- lib/app.js | 7 ++--- lib/contact.js | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/serve.js | 55 +++++++++++++++++++++++------------- 3 files changed, 127 insertions(+), 24 deletions(-) create mode 100644 lib/contact.js (limited to 'lib') diff --git a/lib/app.js b/lib/app.js index bcbc118..e1383a8 100644 --- a/lib/app.js +++ b/lib/app.js @@ -6,7 +6,7 @@ var u = require('./util') var pull = require('pull-stream') var multicb = require('multicb') var paramap = require('pull-paramap') -var Contacts = require('ssb-contact') +var getContacts = require('./contact') var About = require('./about') var Serve = require('./serve') var Render = require('./render') @@ -51,6 +51,7 @@ function App(sbot, config) { sbot.blobs.size.bind(sbot.blobs)) this.getFollows = memo(this._getFollows.bind(this)) this.getVotes = memo({cache: lru(100)}, this._getVotes.bind(this)) + this.getContacts = getContacts.bind(null, this.sbot) this.unboxMsg = this.unboxMsg.bind(this) @@ -462,10 +463,6 @@ App.prototype.streamMyChannels = function (id, opts) { ) } -App.prototype.createContactStreams = function (id) { - return new Contacts(this.sbot).createContactStreams(id) -} - function compareVoted(a, b) { return b.value - a.value } diff --git a/lib/contact.js b/lib/contact.js new file mode 100644 index 0000000..676c84a --- /dev/null +++ b/lib/contact.js @@ -0,0 +1,89 @@ +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({ + 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({ + 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 + }) + }) +} diff --git a/lib/serve.js b/lib/serve.js index 2bbc80d..e8313f4 100644 --- a/lib/serve.js +++ b/lib/serve.js @@ -794,10 +794,10 @@ Serve.prototype.channels = function (ext) { Serve.prototype.contacts = function (path) { var self = this var id = String(path).substr(1) - var contacts = self.app.createContactStreams(id) - function renderFriendsList() { + function renderFriendsList(ids) { return pull( + pull.values(ids), paramap(function (id, cb) { self.app.getAbout(id, function (err, about) { var name = about && about.name || id.substr(0, 8) + '…' @@ -812,23 +812,40 @@ Serve.prototype.contacts = function (path) { ) } - pull( - cat([ - ph('section', {}, [ - ph('h3', {}, ['Contacts: ', self.phIdLink(id)]), - ph('h4', {}, 'Friends'), - renderFriendsList()(contacts.friends), - ph('h4', {}, 'Follows'), - renderFriendsList()(contacts.follows), - ph('h4', {}, 'Followers'), - renderFriendsList()(contacts.followers) - ]) - ]), - this.wrapPage('contacts: ' + id), - this.respondSink(200, { - 'Content-Type': ctype('html') - }) - ) + self.app.getContacts(id, function (err, contacts) { + if (err) return self.respond(500, err.stack || err) + pull( + cat([ + ph('section', {}, [ + ph('h3', {}, ['Contacts: ', self.phIdLink(id)]), + contacts.friends.length ? [ + ph('h4', {}, 'Friends'), + renderFriendsList(contacts.friends), + ] : [], + contacts.follows.length ? [ + ph('h4', {}, 'Follows'), + renderFriendsList(contacts.follows), + ] : [], + contacts.followers.length ? [ + ph('h4', {}, 'Followers'), + renderFriendsList(contacts.followers), + ] : [], + contacts.blocks.length ? [ + ph('h4', {}, 'Blocks'), + renderFriendsList(contacts.blocks), + ] : [], + contacts.blockers.length ? [ + ph('h4', {}, 'Blocked by'), + renderFriendsList(contacts.blockers), + ] : [], + ]) + ]), + self.wrapPage('contacts: ' + id), + self.respondSink(200, { + 'Content-Type': ctype('html') + }) + ) + }) } Serve.prototype.about = function (path) { -- cgit v1.2.3