Files: 05e5e97a80eb654ea1c48fa695db2c863c34a3c5 / gathering / async / get.js
1531 bytesRaw
1 | const { isUpdate, isAttendee } = require('ssb-gathering-schema') |
2 | const merge = require('lodash.merge') |
3 | const getBacklinks = require('../../lib/get-backlinks') |
4 | const permittedOpts = require('../../lib/permitted-opts') |
5 | |
6 | module.exports = function (server) { |
7 | return function getGathering (key, cb) { |
8 | server.get(key, (err, value) => { |
9 | if (err) return cb(err) |
10 | |
11 | const doc = { key, value } |
12 | |
13 | getBacklinks(server)(doc, (err, backlinks) => { |
14 | if (err) return cb(err) |
15 | |
16 | const updates = backlinks |
17 | .filter(isUpdate) |
18 | .map(m => permittedOpts(m.value.content)) |
19 | .reduce((acc, update) => { |
20 | const { image } = update |
21 | if (image) { |
22 | acc.image = image |
23 | if (!acc.images.find(i => i.link === image.link)) acc.images.push(image) |
24 | delete update.image |
25 | } |
26 | |
27 | return merge(acc, update) |
28 | }, { images: [] }) |
29 | |
30 | const attendees = backlinks |
31 | .filter(isAttendee) |
32 | .reduce((acc, msg) => { |
33 | const { link, remove } = msg.value.content.attendee |
34 | // only trust attendee calls from people themselves for now |
35 | if (msg.value.author !== link) return acc |
36 | |
37 | if (remove) { |
38 | return acc.filter(feedId => feedId !== link) |
39 | } else { |
40 | if (acc.includes(link)) return acc |
41 | else return [...acc, link] |
42 | } |
43 | }, []) |
44 | |
45 | cb(null, merge(doc, updates, { attendees })) |
46 | }) |
47 | }) |
48 | } |
49 | } |
50 |
Built with git-ssb-web