commenting from federation

This commit is contained in:
lesion
2019-08-01 15:18:45 +02:00
parent 37b63fc767
commit 5b013829fe
11 changed files with 137 additions and 21 deletions

View File

@@ -0,0 +1,24 @@
const { event: Event, comment: Comment } = require('../api/models')
const config = require('config')
module.exports = {
async create (body) {
//search for related event
const inReplyTo = body.object.inReplyTo
const event_id = inReplyTo.match(`${config.baseurl}/federation/m/(.*)`)[1]
console.error(event_id)
const event = await Event.findByPk(event_id)
if (!event) {
return console.error('event not found!')
}
await Comment.create({
activitypub_id: body.object.id,
data: body.object,
eventId: event.id
})
}
}

View File

@@ -23,12 +23,15 @@ const Helpers = {
const signature_b64 = signature.toString('base64')
const header = `keyId="${config.baseurl}/federation/u/${user.username}",headers="(request-target) host date",signature="${signature_b64}"`
console.error('header ', header)
console.error('requestTo ', toInbox)
console.error('host ', toOrigin.hostname)
request({
url: toInbox,
headers: {
'Host': toOrigin.hostname,
'Date': d.toUTCString(),
'Signature': header
'Signature': header,
'Content-Type': 'application/activity+json; charset=utf-8'
},
method: 'POST',
json: true,

View File

@@ -1,17 +1,29 @@
const express = require('express')
const router = express.Router()
const config = require('config')
const bodyParser = require('body-parser')
const cors = require('cors')
const Follows = require('./follows')
const Users = require('./users')
const { event: Event, user: User } = require('../api/models')
const Comments = require('./comments')
/**
* Federation is calling!
* ref: https://www.w3.org/TR/activitypub/#Overview
*/
router.use(cors())
router.use(bodyParser.json({type: 'application/activity+json'}))
router.use(express.json({type: ['application/json', 'application/activity+json', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"']}))
router.get('/m/:event_id', async (req, res) => {
const event_id = req.params.event_id
if (req.accepts('html')) return res.redirect(301, `/event/${event_id}`)
console.error('Not asked for html!')
const event = await Event.findByPk(req.params.event_id, { include: [ User ] })
if (!event) return res.status(404).send('Not found')
return res.json(event.toAP(event.user.username))
})
// get any message coming from federation
// Federation is calling!
@@ -26,16 +38,40 @@ router.post('/u/:name/inbox', async (req, res) => {
Follows.follow(req, res, b, targetOrigin, domain)
break
case 'Undo':
Follows.unfollow(req, res, b, targetOrigin, domain)
// unfollow || unlike
if (b.object.type === 'Follow') {
Follows.unfollow(req, res, b, targetOrigin, domain)
} else if (b.object.type === 'Like') {
console.error('Unlike!')
} else if (b.object.type === 'Announce') {
console.error('Unboost')
}
break
case 'Announce':
console.error('This is a boost ?')
break
case 'Note':
console.error('this is a note ! I should not receive this')
console.error('This is a note ! I probably should not receive this')
break
case 'Like':
console.error('This is a like!')
break
case 'Delete':
console.error('Delete a comment ?!?!')
break
case 'Announce':
console.error('Boost!')
break
case 'Create':
console.error('Create what? This is probably a reply', b.object.type)
// this is a reply
if (b.object.type === 'Note' && b.object.inReplyTo) {
console.error('this is a reply to an event')
Comments.create(b)
} else {
console.error('Create what? ', b.object.type)
}
break
}
})

View File

@@ -16,7 +16,6 @@ module.exports = {
id: `${config.baseurl}/federation/u/${name}`,
type: 'Person',
preferredUsername: name,
nodeInfo2Url: `${config.baseurl}/.well-known/x-nodeinfo2`,
inbox: `${config.baseurl}/federation/u/${name}/inbox`,
outbox: `${config.baseurl}/federation/u/${name}/outbox`,
followers: `${config.baseurl}/federation/u/${name}/followers`,
@@ -26,6 +25,7 @@ module.exports = {
publicKeyPem: get(user, 'rsa.publicKey', '')
}
}
res.type('application/activity+json; charset=utf-8')
res.json(ret)
},
async followers (req, res) {
@@ -80,6 +80,7 @@ module.exports = {
}
// last: `${config.baseurl}/federation/u/${name}/outbox?page=true`
}
res.type('application/activity+json; charset=utf-8')
return res.json(ret)
}
const ret = {
@@ -89,6 +90,7 @@ module.exports = {
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
orderedItems: user.events.map(e => e.toAP(user.username))
}
res.type('application/activity+json; charset=utf-8')
res.json(ret)
}
}

View File

@@ -11,7 +11,7 @@ router.get('/', async (req, res) => {
}
const name = resource.match(/acct:(.*)@/)[1]
const domain = new URL(config.baseurl).host
const user = await User.findOne({where: { username: name } })
const user = await User.findOne({where: { username: name } })
if (!user) return res.status(404).send(`No record found for ${name}`)
const ret = {
subject: `acct:${name}@${domain}`,
@@ -23,6 +23,7 @@ router.get('/', async (req, res) => {
}
]
}
res.set('Content-Type', 'application/jrd+json; charset=utf-8')
res.json(ret)
})
module.exports = router