serializers/post - run promises in parallel

now w/ opts.detail, returns my_reaction field as 'null' w/ no reaction
(before: field appears w/ some reaction)
This commit is contained in:
otofune 2017-11-05 22:13:28 +09:00
parent 717a7ccb3a
commit 2e1887d081
2 changed files with 70 additions and 53 deletions

View File

@ -95,6 +95,7 @@
"webpack": "3.8.1" "webpack": "3.8.1"
}, },
"dependencies": { "dependencies": {
"@prezzemolo/rap": "^0.1.0",
"accesses": "2.5.0", "accesses": "2.5.0",
"animejs": "2.2.0", "animejs": "2.2.0",
"autwh": "0.0.1", "autwh": "0.0.1",

View File

@ -12,6 +12,7 @@ import serializeChannel from './channel';
import serializeUser from './user'; import serializeUser from './user';
import serializeDriveFile from './drive-file'; import serializeDriveFile from './drive-file';
import parse from '../common/text'; import parse from '../common/text';
import rap from '@prezzemolo/rap'
/** /**
* Serialize a post * Serialize a post
@ -70,21 +71,21 @@ const self = (
} }
// Populate user // Populate user
_post.user = await serializeUser(_post.user_id, meId); _post.user = serializeUser(_post.user_id, meId);
// Populate app // Populate app
if (_post.app_id) { if (_post.app_id) {
_post.app = await serializeApp(_post.app_id); _post.app = serializeApp(_post.app_id);
} }
// Populate channel // Populate channel
if (_post.channel_id) { if (_post.channel_id) {
_post.channel = await serializeChannel(_post.channel_id); _post.channel = serializeChannel(_post.channel_id);
} }
// Populate media // Populate media
if (_post.media_ids) { if (_post.media_ids) {
_post.media = await Promise.all(_post.media_ids.map(fileId => _post.media = Promise.all(_post.media_ids.map(fileId =>
serializeDriveFile(fileId) serializeDriveFile(fileId)
)); ));
} }
@ -92,82 +93,97 @@ const self = (
// When requested a detailed post data // When requested a detailed post data
if (opts.detail) { if (opts.detail) {
// Get previous post info // Get previous post info
const prev = await Post.findOne({ _post.prev = (async () => {
user_id: _post.user_id, const prev = Post.findOne({
_id: { user_id: _post.user_id,
$lt: id _id: {
} $lt: id
}, { }
fields: { }, {
_id: true fields: {
}, _id: true
sort: { },
_id: -1 sort: {
} _id: -1
}); }
_post.prev = prev ? prev._id : null; });
return prev ? prev._id : null;
})()
// Get next post info // Get next post info
const next = await Post.findOne({ _post.next = (async () => {
user_id: _post.user_id, const next = await Post.findOne({
_id: { user_id: _post.user_id,
$gt: id _id: {
} $gt: id
}, { }
fields: { }, {
_id: true fields: {
}, _id: true
sort: { },
_id: 1 sort: {
} _id: 1
}); }
_post.next = next ? next._id : null; });
return next ? next._id : null;
})()
if (_post.reply_id) { if (_post.reply_id) {
// Populate reply to post // Populate reply to post
_post.reply = await self(_post.reply_id, meId, { _post.reply = self(_post.reply_id, meId, {
detail: false detail: false
}); });
} }
if (_post.repost_id) { if (_post.repost_id) {
// Populate repost // Populate repost
_post.repost = await self(_post.repost_id, meId, { _post.repost = self(_post.repost_id, meId, {
detail: _post.text == null detail: _post.text == null
}); });
} }
// Poll // Poll
if (meId && _post.poll) { if (meId && _post.poll) {
const vote = await Vote _post.poll = (async (poll) => {
.findOne({ const vote = await Vote
user_id: meId, .findOne({
post_id: id user_id: meId,
}); post_id: id
});
if (vote != null) { if (vote != null) {
const myChoice = _post.poll.choices const myChoice = poll.choices
.filter(c => c.id == vote.choice)[0]; .filter(c => c.id == vote.choice)[0];
myChoice.is_voted = true; myChoice.is_voted = true;
} }
return poll
})(_post.poll)
} }
// Fetch my reaction // Fetch my reaction
if (meId) { if (meId) {
const reaction = await Reaction _post.my_reaction = (async () => {
.findOne({ const reaction = await Reaction
user_id: meId, .findOne({
post_id: id, user_id: meId,
deleted_at: { $exists: false } post_id: id,
}); deleted_at: { $exists: false }
});
if (reaction) { if (reaction) {
_post.my_reaction = reaction.reaction; return reaction.reaction;
} }
return null
})();
} }
} }
// resolve promises in _post object
_post = await rap(_post)
resolve(_post); resolve(_post);
}); });