experimenting with AP

This commit is contained in:
les
2021-03-05 14:22:38 +01:00
parent ea97a53954
commit 8a648c91bd

View File

@@ -4,10 +4,14 @@ const APUser = require('../api/models/ap_user')
const Tag = require('../api/models/tag') const Tag = require('../api/models/tag')
const config = require('config') const config = require('config')
const debug = require('debug')('fediverse:user') const log = require('../log')
const utc = require('dayjs/plugin/utc')
const dayjs = require('dayjs')
dayjs.extend(utc)
module.exports = { module.exports = {
get (req, res) { get (req, res) {
log.debug('Get actor')
if (req.accepts('html')) { return res.redirect(301, '/') } if (req.accepts('html')) { return res.redirect(301, '/') }
const name = req.params.name const name = req.params.name
if (!name) { return res.status(400).send('Bad request.') } if (!name) { return res.status(400).send('Bad request.') }
@@ -54,12 +58,12 @@ module.exports = {
}, },
async followers (req, res) { async followers (req, res) {
// TODO
const name = req.params.name const name = req.params.name
const page = req.query.page const page = req.query.page
debug('Retrieve %s followers', name) log.debug(`Retrieve ${name} followers`)
if (!name) { return res.status(400).send('Bad request.') } if (!name) { return res.status(400).send('Bad request.') }
if (name !== req.settings.instance_name) { if (name !== req.settings.instance_name) {
log.warn('No record found')
return res.status(404).send(`No record found for ${name}`) return res.status(404).send(`No record found for ${name}`)
} }
const followers = await APUser.findAll({ where: { follower: true } }) const followers = await APUser.findAll({ where: { follower: true } })
@@ -67,15 +71,15 @@ module.exports = {
res.type('application/activity+json; charset=utf-8') res.type('application/activity+json; charset=utf-8')
if (!page) { if (!page) {
debug('No pagination') log.debug('No pagination')
return res.json({ return res.json({
'@context': 'https://www.w3.org/ns/activitystreams', '@context': 'https://www.w3.org/ns/activitystreams',
id: `${config.baseurl}/federation/u/${name}/followers`, id: `${config.baseurl}/federation/u/${name}/followers`,
type: 'OrderedCollection', type: 'OrderedCollection',
totalItems: followers.length, totalItems: followers.length,
// first: `${config.baseurl}/federation/u/${name}/followers?page=true`, first: `${config.baseurl}/federation/u/${name}/followers?page=true`
// last: `${config.baseurl}/federation/u/${name}/followers?page=true`, // last: `${config.baseurl}/federation/u/${name}/followers?page=true`,
orderedItems: followers.map(f => f.ap_id) // orderedItems: followers.map(f => f.ap_id)
}) })
} }
return res.json({ return res.json({
@@ -83,59 +87,81 @@ module.exports = {
id: `${config.baseurl}/federation/u/${name}/followers?page=${page}`, id: `${config.baseurl}/federation/u/${name}/followers?page=${page}`,
type: 'OrderedCollectionPage', type: 'OrderedCollectionPage',
totalItems: followers.length, totalItems: followers.length,
// partOf: `${config.baseurl}/federation/u/${name}/followers`, partOf: `${config.baseurl}/federation/u/${name}/followers`,
orderedItems: followers.map(f => f.ap_id) orderedItems: followers.map(f => f.ap_id)
}) })
}, },
async outbox (req, res) { async outbox (req, res) {
// TODO
const name = req.params.name const name = req.params.name
// const page = req.query.page const page = req.query.page
if (!name) { return res.status(400).send('Bad request.') } if (!name) {
if (name !== req.settings.instance_name) { return res.status(404).send(`No record found for ${name}`) } log.info('[AP] Bad /outbox request')
return res.status(400).send('Bad request.')
}
if (name !== req.settings.instance_name) {
log.info(`No record found for ${name}`)
return res.status(404).send(`No record found for ${name}`)
}
const events = await Event.findAll({ include: [{ model: Tag, required: false }, Place] }) const events = await Event.findAll({ include: [{ model: Tag, required: false }, Place] })
log.debug(`${config.baseurl} Inside ${name} outbox, should return all events from this instance: ${events.length}`)
debug('Inside outbox, should return all events from this user -> ', events.length)
// https://www.w3.org/TR/activitypub/#outbox // https://www.w3.org/TR/activitypub/#outbox
res.type('application/activity+json; charset=utf-8') res.type('application/activity+json; charset=utf-8')
// if (!page) { if (!page) {
// return res.json({ return res.json({
// '@context': 'https://www.w3.org/ns/activitystreams', '@context': 'https://www.w3.org/ns/activitystreams',
// id: `${config.baseurl}/federation/u/${name}/outbox`, id: `${config.baseurl}/federation/u/${name}/outbox`,
// type: 'OrderedCollection', type: 'OrderedCollection',
// totalItems: events.length, totalItems: events.length,
// first: `${config.baseurl}/federation/u/${name}/outbox?page=true`, first: {
// last: `${config.baseurl}/federation/u/${name}/outbox?page=true` id: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
// }) type: 'OrderedCollectionPage',
// } // totalItems: events.length,
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
// debug('With pagination %s', page) // prev: `${config.baseurl}/federation/u/${name}/outbox`,
return res.json({ // next: page !== 'last' && `${config.baseurl}/federation/u/${name}/outbox?page=last`,
'@context': [ orderedItems: page === 'last'
'https://www.w3.org/ns/activitystreams', ? []
'https://w3id.org/security/v1', : events.map(e => ({
{ id: `${config.baseurl}/federation/m/${e.id}#create`,
hashtag: 'as:Hashtag' type: 'Create',
to: ['https://www.w3.org/ns/activitystreams#Public'],
cc: [`${config.baseurl}/federation/u/${name}/followers`],
published: dayjs(e.createdAt).utc().format(),
actor: `${config.baseurl}/federation/u/${name}`,
object: e.toAPNote(name, req.settings.locale)
}))
} }
], })
id: `${config.baseurl}/federation/u/${name}/outbox`, }
type: 'OrderedCollectionPage',
totalItems: events.length,
// partOf: `${config.baseurl}/federation/u/${name}/outbox`,
orderedItems:
events.map(e => ({
id: `${config.baseurl}/federation/m/${e.id}#create`,
type: 'Create',
to: ['https://www.w3.org/ns/activitystreams#Public'],
cc: [`${config.baseurl}/federation/u/${name}/followers`],
published: e.createdAt,
actor: `${config.baseurl}/federation/u/${name}`,
object: e.toAPNote(name, req.settings.locale)
}))
})
} }
} }
// log.debug(`With pagination ${page}`)
// return res.json({
// '@context': [
// 'https://www.w3.org/ns/activitystreams'
// ],
// id: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
// type: 'OrderedCollectionPage',
// // totalItems: events.length,
// partOf: `${config.baseurl}/federation/u/${name}/outbox`,
// // prev: `${config.baseurl}/federation/u/${name}/outbox`,
// next: page !== 'last' && `${config.baseurl}/federation/u/${name}/outbox?page=last`,
// orderedItems: page === 'last'
// ? []
// : events.map(e => ({
// id: `${config.baseurl}/federation/m/${e.id}#create`,
// type: 'Create',
// to: ['https://www.w3.org/ns/activitystreams#Public'],
// cc: [`${config.baseurl}/federation/u/${name}/followers`],
// published: dayjs(e.createdAt).utc().format(),
// actor: `${config.baseurl}/federation/u/${name}`,
// object: e.toAPNote(name, req.settings.locale)
// }))
// })
// }
// }