2019-09-11 13:12:05 +02:00
|
|
|
const { user: User, event: Event, place: Place, tag: Tag } = 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-09-11 13:12:05 +02:00
|
|
|
const debug = require('debug')('fediverse:user')
|
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',
|
2019-09-11 11:58:42 +02:00
|
|
|
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`,
|
2019-09-11 19:12:24 +02:00
|
|
|
attachment: [{
|
|
|
|
type: 'PropertyValue',
|
|
|
|
name: 'Website',
|
|
|
|
value: `<a href='${config.baseurl}'>${config.baseurl}</a>`
|
|
|
|
}],
|
|
|
|
icon: {
|
|
|
|
type: 'Image',
|
2019-09-11 21:20:44 +02:00
|
|
|
mediaType: 'image/x-icon',
|
2019-09-11 19:12:24 +02:00
|
|
|
url: config.baseurl + '/favicon.ico'
|
|
|
|
},
|
2019-07-30 18:32:26 +02:00
|
|
|
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
|
2019-09-11 19:12:24 +02:00
|
|
|
const page = req.query.page
|
|
|
|
debug('Retrieve %s followers', name)
|
2019-07-30 18:32:26 +02:00
|
|
|
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}`)
|
2019-09-11 19:12:24 +02:00
|
|
|
|
|
|
|
res.type('application/activity+json; charset=utf-8')
|
|
|
|
|
|
|
|
if (!page) {
|
|
|
|
debug('No pagination')
|
|
|
|
return res.json({
|
|
|
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
|
|
|
id: `${config.baseurl}/federation/u/${name}/followers`,
|
|
|
|
type: 'OrderedCollection',
|
2019-07-30 18:32:26 +02:00
|
|
|
totalItems: user.followers.length,
|
2019-09-11 19:12:24 +02:00
|
|
|
first: `${config.baseurl}/federation/u/${name}/followers?page=true`,
|
|
|
|
last: `${config.baseurl}/federation/u/${name}/followers?page=true`,
|
|
|
|
})
|
2019-07-30 18:32:26 +02:00
|
|
|
}
|
2019-09-11 19:12:24 +02:00
|
|
|
return res.json({
|
|
|
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
|
|
|
id: `${config.baseurl}/federation/u/${name}/followers?page=${page}`,
|
|
|
|
type: 'OrderedCollectionPage',
|
|
|
|
totalItems: user.followers.length,
|
|
|
|
partOf: `${config.baseurl}/federation/u/${name}/followers` ,
|
|
|
|
orderedItems: user.followers
|
|
|
|
})
|
2019-07-30 18:32:26 +02:00
|
|
|
},
|
2019-09-11 19:12:24 +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-09-11 19:12:24 +02:00
|
|
|
|
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({
|
2019-09-11 13:12:05 +02:00
|
|
|
include: [ { model: Event, include: [ Place, Tag ] } ],
|
2019-07-31 01:03:21 +02:00
|
|
|
where: { username: name }
|
|
|
|
})
|
|
|
|
|
2019-09-11 19:12:24 +02:00
|
|
|
if (!user) return res.status(404).send(`No record found for ${name}`)
|
|
|
|
|
2019-09-11 13:12:05 +02:00
|
|
|
debug('Inside outbox, should return all events from this user')
|
2019-09-11 19:12:24 +02:00
|
|
|
|
2019-07-31 01:03:21 +02:00
|
|
|
// https://www.w3.org/TR/activitypub/#outbox
|
2019-09-11 19:12:24 +02:00
|
|
|
res.type('application/activity+json; charset=utf-8')
|
2019-07-30 19:21:21 +02:00
|
|
|
if (!page) {
|
2019-09-11 19:12:24 +02:00
|
|
|
debug('Without pagination ')
|
|
|
|
return res.json({
|
2019-07-30 19:21:21 +02:00
|
|
|
'@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-09-11 19:12:24 +02:00
|
|
|
first: `${config.baseurl}/federation/u/${name}/outbox?page=true`,
|
|
|
|
last: `${config.baseurl}/federation/u/${name}/outbox?page=true`
|
|
|
|
})
|
2019-07-30 18:53:59 +02:00
|
|
|
}
|
2019-09-11 19:12:24 +02:00
|
|
|
|
|
|
|
debug('With pagination %s', page)
|
|
|
|
return res.json({
|
2019-07-30 19:21:21 +02:00
|
|
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
2019-09-11 19:12:24 +02:00
|
|
|
id: `${config.baseurl}/federation/u/${name}/outbox?page=${page}`,
|
2019-07-30 19:21:21 +02:00
|
|
|
type: 'OrderedCollectionPage',
|
2019-09-11 19:12:24 +02:00
|
|
|
totalItems: user.followers.length,
|
|
|
|
partOf: `${config.baseurl}/federation/u/${name}/outbox` ,
|
|
|
|
orderedItems: user.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/${user.username}/followers`],
|
|
|
|
published: e.createdAt,
|
|
|
|
actor: `${config.baseurl}/federation/u/${user.username}`,
|
|
|
|
object: e.toAP(user.username)
|
|
|
|
}))
|
|
|
|
})
|
2019-07-30 18:32:26 +02:00
|
|
|
}
|
2019-07-30 18:47:17 +02:00
|
|
|
}
|