summaryrefslogtreecommitdiff
path: root/src/processor/http
diff options
context:
space:
mode:
authorAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-04 20:29:26 +0900
committerAkihiko Odaki <nekomanma@pixiv.co.jp>2018-04-04 21:04:58 +0900
commitdf38c2f485937d72c495d3195804830b09aa3e09 (patch)
tree61c62cabc7e56fbb6e13577bd4a74c0fbb3b108f /src/processor/http
parentAllow to undo Create activity (diff)
downloadsharkey-df38c2f485937d72c495d3195804830b09aa3e09.tar.gz
sharkey-df38c2f485937d72c495d3195804830b09aa3e09.tar.bz2
sharkey-df38c2f485937d72c495d3195804830b09aa3e09.zip
Extract http request from post delivery job
Diffstat (limited to 'src/processor/http')
-rw-r--r--src/processor/http/deliver-post.ts100
1 files changed, 14 insertions, 86 deletions
diff --git a/src/processor/http/deliver-post.ts b/src/processor/http/deliver-post.ts
index c00ab912c9..48ad4f95a1 100644
--- a/src/processor/http/deliver-post.ts
+++ b/src/processor/http/deliver-post.ts
@@ -1,93 +1,21 @@
-import Channel from '../../models/channel';
-import Following from '../../models/following';
-import ChannelWatching from '../../models/channel-watching';
-import Post, { pack } from '../../models/post';
-import User, { isLocalUser } from '../../models/user';
-import stream, { publishChannelStream } from '../../publishers/stream';
+import Post from '../../models/post';
+import User, { IRemoteUser } from '../../models/user';
import context from '../../remote/activitypub/renderer/context';
import renderCreate from '../../remote/activitypub/renderer/create';
import renderNote from '../../remote/activitypub/renderer/note';
import request from '../../remote/request';
-export default ({ data }) => Post.findOne({ _id: data.id }).then(post => {
- const promisedPostObj = pack(post);
- const promises = [];
+export default async ({ data }) => {
+ const promisedTo = User.findOne({ _id: data.toId }) as Promise<IRemoteUser>;
+ const [from, post] = await Promise.all([
+ User.findOne({ _id: data.fromId }),
+ Post.findOne({ _id: data.postId })
+ ]);
+ const note = await renderNote(from, post);
+ const to = await promisedTo;
+ const create = renderCreate(note);
- // タイムラインへの投稿
- if (!post.channelId) {
- promises.push(
- // Publish event to myself's stream
- promisedPostObj.then(postObj => {
- stream(post.userId, 'post', postObj);
- }),
+ create['@context'] = context;
- Promise.all([
- User.findOne({ _id: post.userId }),
-
- // Fetch all followers
- Following.aggregate([{
- $lookup: {
- from: 'users',
- localField: 'followerId',
- foreignField: '_id',
- as: 'follower'
- }
- }, {
- $match: {
- followeeId: post.userId
- }
- }], {
- _id: false
- })
- ]).then(([user, followers]) => Promise.all(followers.map(following => {
- if (isLocalUser(following.follower)) {
- // Publish event to followers stream
- return promisedPostObj.then(postObj => {
- stream(following.followerId, 'post', postObj);
- });
- }
-
- return renderNote(user, post).then(note => {
- const create = renderCreate(note);
- create['@context'] = context;
- return request(user, following.follower[0].account.inbox, create);
- });
- })))
- );
- }
-
- // チャンネルへの投稿
- if (post.channelId) {
- promises.push(
- // Increment channel index(posts count)
- Channel.update({ _id: post.channelId }, {
- $inc: {
- index: 1
- }
- }),
-
- // Publish event to channel
- promisedPostObj.then(postObj => {
- publishChannelStream(post.channelId, 'post', postObj);
- }),
-
- Promise.all([
- promisedPostObj,
-
- // Get channel watchers
- ChannelWatching.find({
- channelId: post.channelId,
- // 削除されたドキュメントは除く
- deletedAt: { $exists: false }
- })
- ]).then(([postObj, watches]) => {
- // チャンネルの視聴者(のタイムライン)に配信
- watches.forEach(w => {
- stream(w.userId, 'post', postObj);
- });
- })
- );
- }
-
- return Promise.all(promises);
-});
+ return request(from, to.account.inbox, create);
+};