summaryrefslogtreecommitdiff
path: root/src/common/remote/activitypub/renderer
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2018-04-01 19:53:38 +0900
committersyuilo <syuilotan@yahoo.co.jp>2018-04-01 19:53:38 +0900
commiteea3efccc4dd09e0a9d22ea9e72bbbf44f851490 (patch)
tree47fe256b5ccd872a440646bcf44254300bf8f9cf /src/common/remote/activitypub/renderer
parentClean up (diff)
parentUpdate README.md (diff)
downloadmisskey-eea3efccc4dd09e0a9d22ea9e72bbbf44f851490.tar.gz
misskey-eea3efccc4dd09e0a9d22ea9e72bbbf44f851490.tar.bz2
misskey-eea3efccc4dd09e0a9d22ea9e72bbbf44f851490.zip
Merge branch 'master' of https://github.com/syuilo/misskey
Diffstat (limited to 'src/common/remote/activitypub/renderer')
-rw-r--r--src/common/remote/activitypub/renderer/context.ts5
-rw-r--r--src/common/remote/activitypub/renderer/document.ts7
-rw-r--r--src/common/remote/activitypub/renderer/hashtag.ts7
-rw-r--r--src/common/remote/activitypub/renderer/image.ts6
-rw-r--r--src/common/remote/activitypub/renderer/key.ts9
-rw-r--r--src/common/remote/activitypub/renderer/note.ts44
-rw-r--r--src/common/remote/activitypub/renderer/ordered-collection.ts6
-rw-r--r--src/common/remote/activitypub/renderer/person.ts20
8 files changed, 104 insertions, 0 deletions
diff --git a/src/common/remote/activitypub/renderer/context.ts b/src/common/remote/activitypub/renderer/context.ts
new file mode 100644
index 0000000000..b56f727ae7
--- /dev/null
+++ b/src/common/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/common/remote/activitypub/renderer/document.ts b/src/common/remote/activitypub/renderer/document.ts
new file mode 100644
index 0000000000..4a456416a9
--- /dev/null
+++ b/src/common/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/common/remote/activitypub/renderer/hashtag.ts b/src/common/remote/activitypub/renderer/hashtag.ts
new file mode 100644
index 0000000000..ad42700204
--- /dev/null
+++ b/src/common/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/common/remote/activitypub/renderer/image.ts b/src/common/remote/activitypub/renderer/image.ts
new file mode 100644
index 0000000000..345fbbec59
--- /dev/null
+++ b/src/common/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/common/remote/activitypub/renderer/key.ts b/src/common/remote/activitypub/renderer/key.ts
new file mode 100644
index 0000000000..7148c59745
--- /dev/null
+++ b/src/common/remote/activitypub/renderer/key.ts
@@ -0,0 +1,9 @@
+import config from '../../../../conf';
+import { extractPublic } from '../../../../crypto_key';
+import { ILocalAccount } from '../../../../models/user';
+
+export default ({ username, account }) => ({
+ type: 'Key',
+ owner: `${config.url}/@${username}`,
+ publicKeyPem: extractPublic((account as ILocalAccount).keypair)
+});
diff --git a/src/common/remote/activitypub/renderer/note.ts b/src/common/remote/activitypub/renderer/note.ts
new file mode 100644
index 0000000000..2fe20b2136
--- /dev/null
+++ b/src/common/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/common/remote/activitypub/renderer/ordered-collection.ts b/src/common/remote/activitypub/renderer/ordered-collection.ts
new file mode 100644
index 0000000000..2ca0f77354
--- /dev/null
+++ b/src/common/remote/activitypub/renderer/ordered-collection.ts
@@ -0,0 +1,6 @@
+export default (id, totalItems, orderedItems) => ({
+ id,
+ type: 'OrderedCollection',
+ totalItems,
+ orderedItems
+});
diff --git a/src/common/remote/activitypub/renderer/person.ts b/src/common/remote/activitypub/renderer/person.ts
new file mode 100644
index 0000000000..7303b30385
--- /dev/null
+++ b/src/common/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)
+ };
+};