rubberguppe/routes/inbox.js

79 lines
2.5 KiB
JavaScript
Raw Normal View History

const express = require('express')
const router = express.Router()
2019-09-21 21:20:14 +00:00
const pub = require('../pub')
const net = require('../net')
const request = require('request-promise-native')
2019-09-22 05:20:37 +00:00
const { ObjectId } = require('mongodb')
2018-09-15 07:01:19 +00:00
router.post('/', net.validators.activity, net.security.verifySignature, function (req, res) {
2019-09-22 05:20:37 +00:00
const db = req.app.get('db')
req.body._meta = { _target: pub.utils.usernameToIRI(req.user) }
// side effects
2019-09-22 05:20:37 +00:00
switch (req.body.type) {
case 'Accept':
// TODO - side effect ncessary for following collection?
break
case 'Follow':
req.body._meta._target = req.body.object.id
// send acceptance reply
Promise.all([
pub.actor.getOrCreateActor(req.user, db, true),
2019-09-22 05:20:37 +00:00
pub.object.resolveObject(pub.utils.actorFromActivity(req.body), db)
])
.then(([user, actor]) => {
if (!actor || !actor.inbox) {
throw new Error('unable to send follow request acceptance: actor inbox not retrievable')
}
const newID = new ObjectId()
const responseOpts = {
method: 'POST',
url: actor.inbox,
headers: {
2019-09-22 05:20:37 +00:00
'Content-Type': 'application/activity+json'
},
httpSignature: {
key: user._meta.privateKey,
keyId: user.id,
2019-09-22 05:20:37 +00:00
headers: ['(request-target)', 'host', 'date']
},
json: true,
2019-09-21 21:20:14 +00:00
body: pub.utils.toJSONLD({
_id: newID,
type: 'Accept',
id: `https://${req.app.get('domain')}/o/${newID.toHexString()}`,
actor: user.id,
2019-09-22 05:20:37 +00:00
object: req.body
})
}
return request(responseOpts)
})
.then(result => console.log('success', result))
.catch(e => console.log(e))
break
}
Promise.all([
db.collection('objects').insertOne(req.body.object),
db.collection('streams').insertOne(req.body)
]).then(() => res.status(200).send())
.catch(err => {
console.log(err)
res.status(500).send()
})
2019-09-22 05:20:37 +00:00
})
2018-09-15 07:01:19 +00:00
router.get('/', function (req, res) {
2019-09-22 05:20:37 +00:00
const db = req.app.get('db')
db.collection('streams')
2019-09-22 05:20:37 +00:00
.find({ '_meta._target': pub.utils.usernameToIRI(req.user) })
.sort({ _id: -1 })
.project({ _id: 0, _meta: 0, '@context': 0, 'object._id': 0, 'object.@context': 0, 'object._meta': 0 })
.toArray()
2019-09-21 21:20:14 +00:00
.then(stream => res.json(pub.utils.arrayToCollection(stream, true)))
.catch(err => {
console.log(err)
return res.status(500).send()
})
})
2019-09-22 05:20:37 +00:00
module.exports = router