summaryrefslogtreecommitdiff
path: root/src/api/serializers/post.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/serializers/post.ts')
-rw-r--r--src/api/serializers/post.ts142
1 files changed, 83 insertions, 59 deletions
diff --git a/src/api/serializers/post.ts b/src/api/serializers/post.ts
index df917a8595..03fd120772 100644
--- a/src/api/serializers/post.ts
+++ b/src/api/serializers/post.ts
@@ -8,9 +8,11 @@ import Reaction from '../models/post-reaction';
import { IUser } from '../models/user';
import Vote from '../models/poll-vote';
import serializeApp from './app';
+import serializeChannel from './channel';
import serializeUser from './user';
import serializeDriveFile from './drive-file';
import parse from '../common/text';
+import rap from '@prezzemolo/rap';
/**
* Serialize a post
@@ -20,13 +22,13 @@ import parse from '../common/text';
* @param options? serialize options
* @return response
*/
-const self = (
+const self = async (
post: string | mongo.ObjectID | IPost,
me?: string | mongo.ObjectID | IUser,
options?: {
detail: boolean
}
-) => new Promise<any>(async (resolve, reject) => {
+) => {
const opts = options || {
detail: true,
};
@@ -55,6 +57,8 @@ const self = (
_post = deepcopy(post);
}
+ if (!_post) throw 'invalid post arg.';
+
const id = _post._id;
// Rename _id to id
@@ -69,100 +73,120 @@ const self = (
}
// Populate user
- _post.user = await serializeUser(_post.user_id, meId);
+ _post.user = serializeUser(_post.user_id, meId);
// Populate app
if (_post.app_id) {
- _post.app = await serializeApp(_post.app_id);
+ _post.app = serializeApp(_post.app_id);
+ }
+
+ // Populate channel
+ if (_post.channel_id) {
+ _post.channel = serializeChannel(_post.channel_id);
}
+ // Populate media
if (_post.media_ids) {
- // Populate media
- _post.media = await Promise.all(_post.media_ids.map(async fileId =>
- await serializeDriveFile(fileId)
+ _post.media = Promise.all(_post.media_ids.map(fileId =>
+ serializeDriveFile(fileId)
));
}
// When requested a detailed post data
if (opts.detail) {
// Get previous post info
- const prev = await Post.findOne({
- user_id: _post.user_id,
- _id: {
- $lt: id
- }
- }, {
- fields: {
- _id: true
- },
- sort: {
- _id: -1
- }
- });
- _post.prev = prev ? prev._id : null;
+ _post.prev = (async () => {
+ const prev = await Post.findOne({
+ user_id: _post.user_id,
+ _id: {
+ $lt: id
+ }
+ }, {
+ fields: {
+ _id: true
+ },
+ sort: {
+ _id: -1
+ }
+ });
+ return prev ? prev._id : null;
+ })();
// Get next post info
- const next = await Post.findOne({
- user_id: _post.user_id,
- _id: {
- $gt: id
- }
- }, {
- fields: {
- _id: true
- },
- sort: {
- _id: 1
- }
- });
- _post.next = next ? next._id : null;
+ _post.next = (async () => {
+ const next = await Post.findOne({
+ user_id: _post.user_id,
+ _id: {
+ $gt: id
+ }
+ }, {
+ fields: {
+ _id: true
+ },
+ sort: {
+ _id: 1
+ }
+ });
+ return next ? next._id : null;
+ })();
- if (_post.reply_to_id) {
+ if (_post.reply_id) {
// Populate reply to post
- _post.reply_to = await self(_post.reply_to_id, meId, {
+ _post.reply = self(_post.reply_id, meId, {
detail: false
});
}
if (_post.repost_id) {
// Populate repost
- _post.repost = await self(_post.repost_id, meId, {
+ _post.repost = self(_post.repost_id, meId, {
detail: _post.text == null
});
}
// Poll
if (meId && _post.poll) {
- const vote = await Vote
- .findOne({
- user_id: meId,
- post_id: id
- });
+ _post.poll = (async (poll) => {
+ const vote = await Vote
+ .findOne({
+ user_id: meId,
+ post_id: id
+ });
+
+ if (vote != null) {
+ const myChoice = poll.choices
+ .filter(c => c.id == vote.choice)[0];
- if (vote != null) {
- const myChoice = _post.poll.choices
- .filter(c => c.id == vote.choice)[0];
+ myChoice.is_voted = true;
+ }
- myChoice.is_voted = true;
- }
+ return poll;
+ })(_post.poll);
}
// Fetch my reaction
if (meId) {
- const reaction = await Reaction
- .findOne({
- user_id: meId,
- post_id: id,
- deleted_at: { $exists: false }
- });
+ _post.my_reaction = (async () => {
+ const reaction = await Reaction
+ .findOne({
+ user_id: meId,
+ post_id: id,
+ deleted_at: { $exists: false }
+ });
- if (reaction) {
- _post.my_reaction = reaction.reaction;
- }
+ if (reaction) {
+ return reaction.reaction;
+ }
+
+ return null;
+ })();
}
}
- resolve(_post);
-});
+ // resolve promises in _post object
+ _post = await rap(_post);
+
+ return _post;
+};
export default self;