diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2017-03-25 23:23:22 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2017-03-25 23:23:22 +0900 |
| commit | a501a3cbc4293fbf5a3558a613ff91e89f9cb28f (patch) | |
| tree | 8c33ad55b3f98d64f14e52c5acea240b0e1e6775 /src/api | |
| parent | v1473 (diff) | |
| download | sharkey-a501a3cbc4293fbf5a3558a613ff91e89f9cb28f.tar.gz sharkey-a501a3cbc4293fbf5a3558a613ff91e89f9cb28f.tar.bz2 sharkey-a501a3cbc4293fbf5a3558a613ff91e89f9cb28f.zip | |
#322
Diffstat (limited to 'src/api')
| -rw-r--r-- | src/api/endpoints.ts | 4 | ||||
| -rw-r--r-- | src/api/endpoints/posts/trend.ts | 76 |
2 files changed, 80 insertions, 0 deletions
diff --git a/src/api/endpoints.ts b/src/api/endpoints.ts index f0031b82a2..b72392db64 100644 --- a/src/api/endpoints.ts +++ b/src/api/endpoints.ts @@ -361,6 +361,10 @@ const endpoints: Endpoint[] = [ } }, { + name: 'posts/trend', + withCredential: true + }, + { name: 'posts/reactions', withCredential: true }, diff --git a/src/api/endpoints/posts/trend.ts b/src/api/endpoints/posts/trend.ts new file mode 100644 index 0000000000..0f0ea4876c --- /dev/null +++ b/src/api/endpoints/posts/trend.ts @@ -0,0 +1,76 @@ +/** + * Module dependencies + */ +const ms = require('ms'); +import $ from 'cafy'; +import Post from '../../models/post'; +import serialize from '../../serializers/post'; + +/** + * Get trend posts + * + * @param {any} params + * @param {any} user + * @return {Promise<any>} + */ +module.exports = (params, user) => new Promise(async (res, rej) => { + // Get 'limit' parameter + const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; + if (limitErr) return rej('invalid limit param'); + + // Get 'offset' parameter + const [offset = 0, offsetErr] = $(params.offset).optional.number().min(0).$; + if (offsetErr) return rej('invalid offset param'); + + // Get 'reply' parameter + const [reply, replyErr] = $(params.reply).optional.boolean().$; + if (replyErr) return rej('invalid reply param'); + + // Get 'repost' parameter + const [repost, repostErr] = $(params.repost).optional.boolean().$; + if (repostErr) return rej('invalid repost param'); + + // Get 'media' parameter + const [media, mediaErr] = $(params.media).optional.boolean().$; + if (mediaErr) return rej('invalid media param'); + + // Get 'poll' parameter + const [poll, pollErr] = $(params.poll).optional.boolean().$; + if (pollErr) return rej('invalid poll param'); + + const query = { + created_at: { + $gte: new Date(Date.now() - ms('1days')) + } + } as any; + + if (reply != undefined) { + query.reply_to_id = reply ? { $exists: true, $ne: null } : null; + } + + if (repost != undefined) { + query.repost_id = repost ? { $exists: true, $ne: null } : null; + } + + if (media != undefined) { + query.media_ids = media ? { $exists: true, $ne: null } : null; + } + + if (poll != undefined) { + query.poll = poll ? { $exists: true, $ne: null } : null; + } + + // Issue query + const posts = await Post + .find(query, { + limit: limit, + skip: offset, + sort: { + repost_count: -1 + } + }); + + // Serialize + res(await Promise.all(posts.map(async post => + await serialize(post, user, { detail: true })))); +}); |