summaryrefslogtreecommitdiff
path: root/src/remote/activitypub/renderer
diff options
context:
space:
mode:
Diffstat (limited to 'src/remote/activitypub/renderer')
-rw-r--r--src/remote/activitypub/renderer/context.ts5
-rw-r--r--src/remote/activitypub/renderer/document.ts7
-rw-r--r--src/remote/activitypub/renderer/follow.ts8
-rw-r--r--src/remote/activitypub/renderer/hashtag.ts7
-rw-r--r--src/remote/activitypub/renderer/image.ts6
-rw-r--r--src/remote/activitypub/renderer/key.ts10
-rw-r--r--src/remote/activitypub/renderer/note.ts44
-rw-r--r--src/remote/activitypub/renderer/ordered-collection.ts6
-rw-r--r--src/remote/activitypub/renderer/person.ts20
9 files changed, 113 insertions, 0 deletions
diff --git a/src/remote/activitypub/renderer/context.ts b/src/remote/activitypub/renderer/context.ts
new file mode 100644
index 0000000000..b56f727ae7
--- /dev/null
+++ b/src/remote/activitypub/renderer/context.ts
@@ -0,0 +1,5 @@
+export default [
+ 'https://www.w3.org/ns/activitystreams',
+ 'https://w3id.org/security/v1',
+ { Hashtag: 'as:Hashtag' }
+];
diff --git a/src/remote/activitypub/renderer/document.ts b/src/remote/activitypub/renderer/document.ts
new file mode 100644
index 0000000000..fdd52c1b6c
--- /dev/null
+++ b/src/remote/activitypub/renderer/document.ts
@@ -0,0 +1,7 @@
+import config from '../../../conf';
+
+export default ({ _id, contentType }) => ({
+ type: 'Document',
+ mediaType: contentType,
+ url: `${config.drive_url}/${_id}`
+});
diff --git a/src/remote/activitypub/renderer/follow.ts b/src/remote/activitypub/renderer/follow.ts
new file mode 100644
index 0000000000..c99bc375a2
--- /dev/null
+++ b/src/remote/activitypub/renderer/follow.ts
@@ -0,0 +1,8 @@
+import config from '../../../conf';
+import { IRemoteUser } from '../../../models/user';
+
+export default ({ username }, followee: IRemoteUser) => ({
+ type: 'Follow',
+ actor: `${config.url}/@${username}`,
+ object: followee.account.uri
+});
diff --git a/src/remote/activitypub/renderer/hashtag.ts b/src/remote/activitypub/renderer/hashtag.ts
new file mode 100644
index 0000000000..c2d261ed21
--- /dev/null
+++ b/src/remote/activitypub/renderer/hashtag.ts
@@ -0,0 +1,7 @@
+import config from '../../../conf';
+
+export default tag => ({
+ type: 'Hashtag',
+ href: `${config.url}/search?q=#${encodeURIComponent(tag)}`,
+ name: '#' + tag
+});
diff --git a/src/remote/activitypub/renderer/image.ts b/src/remote/activitypub/renderer/image.ts
new file mode 100644
index 0000000000..3d1c71cb95
--- /dev/null
+++ b/src/remote/activitypub/renderer/image.ts
@@ -0,0 +1,6 @@
+import config from '../../../conf';
+
+export default ({ _id }) => ({
+ type: 'Image',
+ url: `${config.drive_url}/${_id}`
+});
diff --git a/src/remote/activitypub/renderer/key.ts b/src/remote/activitypub/renderer/key.ts
new file mode 100644
index 0000000000..904a69e081
--- /dev/null
+++ b/src/remote/activitypub/renderer/key.ts
@@ -0,0 +1,10 @@
+import config from '../../../conf';
+import { extractPublic } from '../../../crypto_key';
+import { ILocalUser } from '../../../models/user';
+
+export default (user: ILocalUser) => ({
+ id: `${config.url}/@${user.username}/publickey`,
+ type: 'Key',
+ owner: `${config.url}/@${user.username}`,
+ publicKeyPem: extractPublic(user.account.keypair)
+});
diff --git a/src/remote/activitypub/renderer/note.ts b/src/remote/activitypub/renderer/note.ts
new file mode 100644
index 0000000000..74806f14b4
--- /dev/null
+++ b/src/remote/activitypub/renderer/note.ts
@@ -0,0 +1,44 @@
+import renderDocument from './document';
+import renderHashtag from './hashtag';
+import config from '../../../conf';
+import DriveFile from '../../../models/drive-file';
+import Post from '../../../models/post';
+import User from '../../../models/user';
+
+export default async (user, post) => {
+ const promisedFiles = DriveFile.find({ _id: { $in: post.mediaIds } });
+ let inReplyTo;
+
+ if (post.replyId) {
+ const inReplyToPost = await Post.findOne({
+ _id: post.replyId,
+ });
+
+ if (inReplyToPost !== null) {
+ const inReplyToUser = await User.findOne({
+ _id: post.userId,
+ });
+
+ if (inReplyToUser !== null) {
+ inReplyTo = `${config.url}@${inReplyToUser.username}/${inReplyToPost._id}`;
+ }
+ }
+ } else {
+ inReplyTo = null;
+ }
+
+ const attributedTo = `${config.url}/@${user.username}`;
+
+ return {
+ id: `${attributedTo}/${post._id}`,
+ type: 'Note',
+ attributedTo,
+ content: post.textHtml,
+ published: post.createdAt.toISOString(),
+ to: 'https://www.w3.org/ns/activitystreams#Public',
+ cc: `${attributedTo}/followers`,
+ inReplyTo,
+ attachment: (await promisedFiles).map(renderDocument),
+ tag: post.tags.map(renderHashtag)
+ };
+};
diff --git a/src/remote/activitypub/renderer/ordered-collection.ts b/src/remote/activitypub/renderer/ordered-collection.ts
new file mode 100644
index 0000000000..2ca0f77354
--- /dev/null
+++ b/src/remote/activitypub/renderer/ordered-collection.ts
@@ -0,0 +1,6 @@
+export default (id, totalItems, orderedItems) => ({
+ id,
+ type: 'OrderedCollection',
+ totalItems,
+ orderedItems
+});
diff --git a/src/remote/activitypub/renderer/person.ts b/src/remote/activitypub/renderer/person.ts
new file mode 100644
index 0000000000..c6c7893165
--- /dev/null
+++ b/src/remote/activitypub/renderer/person.ts
@@ -0,0 +1,20 @@
+import renderImage from './image';
+import renderKey from './key';
+import config from '../../../conf';
+
+export default user => {
+ const id = `${config.url}/@${user.username}`;
+
+ return {
+ type: 'Person',
+ id,
+ inbox: `${id}/inbox`,
+ outbox: `${id}/outbox`,
+ preferredUsername: user.username,
+ name: user.name,
+ summary: user.description,
+ icon: user.avatarId && renderImage({ _id: user.avatarId }),
+ image: user.bannerId && renderImage({ _id: user.bannerId }),
+ publicKey: renderKey(user)
+ };
+};