From 8a648c91bd0c3f7757e7419475c7f1f0bd3e022c Mon Sep 17 00:00:00 2001 From: les Date: Fri, 5 Mar 2021 14:22:38 +0100 Subject: [PATCH] experimenting with AP --- server/federation/users.js | 120 ++++++++++++++++++++++--------------- 1 file changed, 73 insertions(+), 47 deletions(-) diff --git a/server/federation/users.js b/server/federation/users.js index d1eeb42c..618994c9 100644 --- a/server/federation/users.js +++ b/server/federation/users.js @@ -4,10 +4,14 @@ const APUser = require('../api/models/ap_user') const Tag = require('../api/models/tag') 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 = { get (req, res) { + log.debug('Get actor') if (req.accepts('html')) { return res.redirect(301, '/') } const name = req.params.name if (!name) { return res.status(400).send('Bad request.') } @@ -54,12 +58,12 @@ module.exports = { }, async followers (req, res) { - // TODO const name = req.params.name 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 !== req.settings.instance_name) { + log.warn('No record found') return res.status(404).send(`No record found for ${name}`) } const followers = await APUser.findAll({ where: { follower: true } }) @@ -67,15 +71,15 @@ module.exports = { res.type('application/activity+json; charset=utf-8') if (!page) { - debug('No pagination') + log.debug('No pagination') return res.json({ '@context': 'https://www.w3.org/ns/activitystreams', id: `${config.baseurl}/federation/u/${name}/followers`, type: 'OrderedCollection', 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`, - orderedItems: followers.map(f => f.ap_id) + // orderedItems: followers.map(f => f.ap_id) }) } return res.json({ @@ -83,59 +87,81 @@ module.exports = { id: `${config.baseurl}/federation/u/${name}/followers?page=${page}`, type: 'OrderedCollectionPage', totalItems: followers.length, - // partOf: `${config.baseurl}/federation/u/${name}/followers`, + partOf: `${config.baseurl}/federation/u/${name}/followers`, orderedItems: followers.map(f => f.ap_id) }) }, async outbox (req, res) { - // TODO 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 !== req.settings.instance_name) { return res.status(404).send(`No record found for ${name}`) } + if (!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] }) - - debug('Inside outbox, should return all events from this user -> ', events.length) + log.debug(`${config.baseurl} Inside ${name} outbox, should return all events from this instance: ${events.length}`) // https://www.w3.org/TR/activitypub/#outbox res.type('application/activity+json; charset=utf-8') - // if (!page) { - // return res.json({ - // '@context': 'https://www.w3.org/ns/activitystreams', - // id: `${config.baseurl}/federation/u/${name}/outbox`, - // type: 'OrderedCollection', - // totalItems: events.length, - // first: `${config.baseurl}/federation/u/${name}/outbox?page=true`, - // last: `${config.baseurl}/federation/u/${name}/outbox?page=true` - // }) - // } - - // debug('With pagination %s', page) - return res.json({ - '@context': [ - 'https://www.w3.org/ns/activitystreams', - 'https://w3id.org/security/v1', - { - hashtag: 'as:Hashtag' + if (!page) { + return res.json({ + '@context': 'https://www.w3.org/ns/activitystreams', + id: `${config.baseurl}/federation/u/${name}/outbox`, + type: 'OrderedCollection', + totalItems: events.length, + first: { + 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) + })) } - ], - 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) +// })) +// }) +// } +// }