diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts index 7cee2be22..209e74392 100644 --- a/src/remote/activitypub/renderer/note.ts +++ b/src/remote/activitypub/renderer/note.ts @@ -50,9 +50,21 @@ export default async function renderNote(note: INote, dive = true): Promise ? note.mentionedRemoteUsers.map(x => x.uri) : []; - const cc = ['public', 'home', 'followers'].includes(note.visibility) - ? [`${attributedTo}/followers`].concat(mentions) - : []; + let to: string[] = []; + let cc: string[] = []; + + if (note.visibility == 'public') { + to = ['https://www.w3.org/ns/activitystreams#Public']; + cc = [`${attributedTo}/followers`].concat(mentions); + } else if (note.visibility == 'home') { + to = [`${attributedTo}/followers`]; + cc = ['https://www.w3.org/ns/activitystreams#Public'].concat(mentions); + } else if (note.visibility == 'followers') { + to = [`${attributedTo}/followers`]; + cc = mentions; + } else { + to = mentions; + } const mentionedUsers = note.mentions ? await User.find({ _id: { @@ -74,7 +86,7 @@ export default async function renderNote(note: INote, dive = true): Promise summary: note.cw, content: toHtml(note), published: note.createdAt.toISOString(), - to: 'https://www.w3.org/ns/activitystreams#Public', + to, cc, inReplyTo, attachment: (await promisedFiles).map(renderDocument), diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts index 7d828f97a..0d227303c 100644 --- a/src/remote/activitypub/renderer/person.ts +++ b/src/remote/activitypub/renderer/person.ts @@ -19,6 +19,8 @@ export default async (user: ILocalUser) => { id, inbox: `${id}/inbox`, outbox: `${id}/outbox`, + followers: `${id}/followers`, + following: `${id}/following`, sharedInbox: `${config.url}/inbox`, url: `${config.url}/@${user.username}`, preferredUsername: user.username, diff --git a/src/server/activitypub.ts b/src/server/activitypub.ts index 2d9a4746c..7d6fe0926 100644 --- a/src/server/activitypub.ts +++ b/src/server/activitypub.ts @@ -89,6 +89,48 @@ router.get('/users/:user/outbox', async ctx => { ctx.body = pack(rendered); }); +// followers +router.get('/users/:user/followers', async ctx => { + const userId = new mongo.ObjectID(ctx.params.user); + + const user = await User.findOne({ + _id: userId, + host: null + }); + + if (user === null) { + ctx.status = 404; + return; + } + + // TODO: Implement fetch and render + + const rendered = renderOrderedCollection(`${config.url}/users/${userId}/followers`, 0, []); + + ctx.body = pack(rendered); +}); + +// following +router.get('/users/:user/following', async ctx => { + const userId = new mongo.ObjectID(ctx.params.user); + + const user = await User.findOne({ + _id: userId, + host: null + }); + + if (user === null) { + ctx.status = 404; + return; + } + + // TODO: Implement fetch and render + + const rendered = renderOrderedCollection(`${config.url}/users/${userId}/following`, 0, []); + + ctx.body = pack(rendered); +}); + // publickey router.get('/users/:user/publickey', async ctx => { const userId = new mongo.ObjectID(ctx.params.user);