gancio-upstream/server/federation/users.js

133 lines
4.8 KiB
JavaScript
Raw Normal View History

2019-12-18 14:44:09 +01:00
const { event: Event, place: Place, tag: Tag, ap_user: APUser } = require('../api/models')
2019-07-30 18:32:26 +02:00
const config = require('config')
2019-09-11 13:12:05 +02:00
const debug = require('debug')('fediverse:user')
2019-07-30 18:32:26 +02:00
module.exports = {
2019-12-04 01:18:05 +01:00
get (req, res) {
if (req.accepts('html')) { return res.redirect(301, '/') }
2019-07-30 18:32:26 +02:00
const name = req.params.name
2019-10-28 17:33:20 +01:00
if (!name) { return res.status(400).send('Bad request.') }
2020-06-14 20:58:23 +02:00
2019-12-04 01:18:05 +01:00
// const user = await User.findOne({ where: { username: name } })
if (name !== req.settings.instance_name) { return res.status(404).send(`No record found for ${name}`) }
2019-07-30 18:32:26 +02:00
const ret = {
'@context': [
'https://www.w3.org/ns/activitystreams',
'https://w3id.org/security/v1',
{
toot: 'http://joinmastodon.org/ns#',
schema: 'http://schema.org#',
ProperyValue: 'schema:PropertyValue',
value: 'schema:value'
}
2019-07-30 18:32:26 +02:00
],
id: `${config.baseurl}/federation/u/${name}`,
type: 'Person',
summary: config.description,
name,
preferredUsername: name,
2019-07-30 18:32:26 +02:00
inbox: `${config.baseurl}/federation/u/${name}/inbox`,
2020-06-14 20:58:23 +02:00
outbox: `${config.baseurl}/federation/u/${name}/outbox`,
// followers: `${config.baseurl}/federation/u/${name}/followers`,
discoverable: true,
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-19 23:12:56 +02:00
mediaType: 'image/png',
url: config.baseurl + '/favicon.ico'
2019-09-11 19:12:24 +02:00
},
2019-07-30 18:32:26 +02:00
publicKey: {
id: `${config.baseurl}/federation/u/${name}#main-key`,
owner: `${config.baseurl}/federation/u/${name}`,
publicKeyPem: req.settings.publicKey
2019-07-30 18:32:26 +02:00
}
}
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)
},
2019-12-18 14:44:09 +01:00
async followers (req, res) {
// TODO
2019-07-30 18:32:26 +02:00
const name = req.params.name
2019-09-11 19:12:24 +02:00
const page = req.query.page
debug('Retrieve %s followers', name)
2019-10-28 17:33:20 +01:00
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}`)
}
const followers = await APUser.findAll({ where: { follower: true } })
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',
totalItems: 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`,
orderedItems: followers.map(f => f.ap_id)
2019-09-11 19:12:24 +02:00
})
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: followers.length,
2019-10-28 17:33:20 +01:00
partOf: `${config.baseurl}/federation/u/${name}/followers`,
orderedItems: followers.map(f => f.ap_id)
2019-09-11 19:12:24 +02:00
})
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-12-10 22:58:10 +01:00
// TODO
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-10-28 17:33:20 +01:00
if (!name) { return res.status(400).send('Bad request.') }
2019-12-18 14:44:09 +01:00
if (name !== req.settings.instance_name) { return res.status(404).send(`No record found for ${name}`) }
2019-07-31 01:03:21 +02:00
2020-02-20 20:50:59 +01:00
const events = await Event.findAll({ include: [Tag, Place] })
2019-09-11 19:12:24 +02:00
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
return res.json({
'@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-12-18 14:44:09 +01:00
totalItems: 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-10-28 17:33:20 +01:00
2019-09-11 19:12:24 +02:00
debug('With pagination %s', page)
return res.json({
'@context': ['https://www.w3.org/ns/activitystreams', { Hashtag: 'as:Hashtag' }],
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-12-18 14:44:09 +01:00
totalItems: events.length,
2019-10-28 17:33:20 +01:00
partOf: `${config.baseurl}/federation/u/${name}/outbox`,
2020-03-14 18:47:49 +01:00
orderedItems: events.map(e => ({ ...e.toAP(name, req.settings.locale), actor: `${config.baseurl}/federation/u/${name}` }))
// 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.toNoteAP(user.username)
// }))
2019-10-28 17:33:20 +01:00
})
2019-07-30 18:32:26 +02:00
}
2019-07-30 18:47:17 +02:00
}