gancio-upstream/server/federation/users.js

94 lines
3.4 KiB
JavaScript
Raw Normal View History

2019-07-31 01:03:21 +02:00
const { user: User, event: Event } = require('../api/models')
2019-07-30 18:32:26 +02:00
const config = require('config')
2019-07-30 18:47:17 +02:00
const get = require('lodash/get')
2019-07-30 18:32:26 +02:00
module.exports = {
async get (req, res) {
const name = req.params.name
if (!name) return res.status(400).send('Bad request.')
const user = await User.findOne({where: { username: name }})
if (!user) return res.status(404).send(`No record found for ${name}`)
const ret = {
'@context': [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1'
],
id: `${config.baseurl}/federation/u/${name}`,
type: 'Person',
name: user.display_name || user.username,
preferredUsername: user.username,
2019-07-30 18:32:26 +02:00
inbox: `${config.baseurl}/federation/u/${name}/inbox`,
outbox: `${config.baseurl}/federation/u/${name}/outbox`,
followers: `${config.baseurl}/federation/u/${name}/followers`,
publicKey: {
id: `${config.baseurl}/federation/u/${name}#main-key`,
owner: `${config.baseurl}/federation/u/${name}`,
publicKeyPem: get(user, 'rsa.publicKey', '')
}
}
2019-08-01 15:18:45 +02:00
res.type('application/activity+json; charset=utf-8')
2019-07-30 18:32:26 +02:00
res.json(ret)
},
async followers (req, res) {
const name = req.params.name
if (!name) return res.status(400).send('Bad request.')
const user = await User.findOne({where: { username: name }})
if (!user) return res.status(404).send(`No record found for ${name}`)
const ret = {
'@context': [ 'https://www.w3.org/ns/activitystreams' ],
id: `${config.baseurl}/federation/u/${name}/followers`,
type: 'OrderedCollection',
totalItems: user.followers.length,
first: {
id: `${config.baseurl}/federation/u/${name}/followers?page=1`,
type: 'OrderedCollectionPage',
totalItems: user.followers.length,
partOf: `${config.baseurl}/federation/u/${name}/followers`,
orderedItems: user.followers,
}
}
2019-07-30 18:53:59 +02:00
res.json(ret)
2019-07-30 18:32:26 +02:00
},
2019-07-31 01:03:21 +02:00
async outbox (req, res) {
2019-07-30 18:53:59 +02:00
const name = req.params.name
2019-07-30 19:21:21 +02:00
const page = req.query.page
2019-07-30 18:53:59 +02:00
if (!name) return res.status(400).send('Bad request.')
2019-07-31 01:03:21 +02:00
const user = await User.findOne({
include: [ Event ],
where: { username: name }
})
if (!user) return res.status(404).send(`No record found for ${name}`)
2019-07-30 19:21:21 +02:00
2019-07-30 18:32:26 +02:00
console.error('Inside outbox, should return all events from this user')
2019-07-31 01:03:21 +02:00
// https://www.w3.org/TR/activitypub/#outbox
2019-07-30 19:21:21 +02:00
if (!page) {
const ret = {
'@context': 'https://www.w3.org/ns/activitystreams',
2019-07-30 18:53:59 +02:00
id: `${config.baseurl}/federation/u/${name}/outbox`,
2019-07-30 19:21:21 +02:00
type: 'OrderedCollection',
2019-07-31 01:03:21 +02:00
totalItems: user.events.length,
2019-07-31 01:46:55 +02:00
first: {
id: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
type: 'OrderedCollectionPage',
totalItem: user.events.length,
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
orderedItems: user.events.map(e => e.toAP(user.username))
}
2019-07-30 18:53:59 +02:00
}
2019-08-01 15:18:45 +02:00
res.type('application/activity+json; charset=utf-8')
2019-07-30 19:21:21 +02:00
return res.json(ret)
2019-07-30 18:53:59 +02:00
}
2019-07-30 19:23:04 +02:00
const ret = {
2019-07-30 19:21:21 +02:00
'@context': 'https://www.w3.org/ns/activitystreams',
id: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
type: 'OrderedCollectionPage',
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
2019-07-31 01:03:21 +02:00
orderedItems: user.events.map(e => e.toAP(user.username))
2019-07-30 19:23:04 +02:00
}
2019-08-01 15:18:45 +02:00
res.type('application/activity+json; charset=utf-8')
2019-07-30 19:23:04 +02:00
res.json(ret)
2019-07-30 18:32:26 +02:00
}
2019-07-30 18:47:17 +02:00
}