From 1c7e35c001a1dc4e79bdf5a3e3697a8a59a1ca4e Mon Sep 17 00:00:00 2001
From: Akihiko Odaki <nekomanma@pixiv.co.jp>
Date: Thu, 5 Apr 2018 01:57:18 +0900
Subject: [PATCH] Handle inReplyTo property

---
 src/remote/activitypub/create.ts | 25 +++++++++++++++++--------
 1 file changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/remote/activitypub/create.ts b/src/remote/activitypub/create.ts
index 31e9dba86..3bc0c66f3 100644
--- a/src/remote/activitypub/create.ts
+++ b/src/remote/activitypub/create.ts
@@ -48,11 +48,6 @@ class Creator {
 			throw new Error();
 		}
 
-		const mediaIds = 'attachment' in note &&
-			(await Promise.all(await this.create(resolver, note.attachment)))
-				.filter(media => media !== null && media.object.$ref === 'driveFiles.files')
-				.map(({ object }) => object.$id);
-
 		const { window } = new JSDOM(note.content);
 		const mentions = [];
 		const tags = [];
@@ -71,13 +66,27 @@ class Creator {
 			}
 		}
 
+		const [mediaIds, reply] = await Promise.all([
+			'attachment' in note && this.create(resolver, note.attachment)
+				.then(collection => Promise.all(collection))
+				.then(collection => collection
+					.filter(media => media !== null && media.object.$ref === 'driveFiles.files')
+					.map(({ object }: IResult) => object.$id)),
+
+			'inReplyTo' in note && this.create(resolver, note.inReplyTo)
+				.then(collection => Promise.all(collection.map(promise => promise.then(result => {
+					if (result !== null && result.object.$ref === 'posts') {
+						throw result.object;
+					}
+				}, () => { }))))
+				.then(() => null, ({ $id }) => Post.findOne({ _id: $id }))
+		]);
+
 		const inserted = await createPost({
 			channelId: undefined,
 			index: undefined,
 			createdAt: new Date(note.published),
 			mediaIds,
-			replyId: undefined,
-			repostId: undefined,
 			poll: undefined,
 			text: window.document.body.textContent,
 			textHtml: note.content && createDOMPurify(window).sanitize(note.content),
@@ -87,7 +96,7 @@ class Creator {
 			geo: undefined,
 			uri: note.id,
 			tags
-		}, null, null, await Promise.all(mentions));
+		}, reply, null, await Promise.all(mentions));
 
 		const promises = [];