summaryrefslogtreecommitdiff
path: root/src/api/endpoints/users
diff options
context:
space:
mode:
authorこぴなたみぽ <Syuilotan@yahoo.co.jp>2017-11-06 19:11:23 +0900
committerGitHub <noreply@github.com>2017-11-06 19:11:23 +0900
commitcb7e70dee3aa47807d33757d4ecd07e2793540d0 (patch)
treec6795a6c0aa200195748c364d4ab990c6a160150 /src/api/endpoints/users
parentchore(package): update @types/rimraf to version 2.0.2 (diff)
parentMerge pull request #871 from syuilo/greenkeeper/@types/elasticsearch-5.0.17 (diff)
downloadmisskey-cb7e70dee3aa47807d33757d4ecd07e2793540d0.tar.gz
misskey-cb7e70dee3aa47807d33757d4ecd07e2793540d0.tar.bz2
misskey-cb7e70dee3aa47807d33757d4ecd07e2793540d0.zip
Merge branch 'master' into greenkeeper/@types/rimraf-2.0.2
Diffstat (limited to 'src/api/endpoints/users')
-rw-r--r--src/api/endpoints/users/get_frequently_replied_users.ts96
-rw-r--r--src/api/endpoints/users/posts.ts2
2 files changed, 97 insertions, 1 deletions
diff --git a/src/api/endpoints/users/get_frequently_replied_users.ts b/src/api/endpoints/users/get_frequently_replied_users.ts
new file mode 100644
index 0000000000..bb0f3b4cea
--- /dev/null
+++ b/src/api/endpoints/users/get_frequently_replied_users.ts
@@ -0,0 +1,96 @@
+/**
+ * Module dependencies
+ */
+import $ from 'cafy';
+import Post from '../../models/post';
+import User from '../../models/user';
+import serialize from '../../serializers/user';
+
+module.exports = (params, me) => new Promise(async (res, rej) => {
+ // Get 'user_id' parameter
+ const [userId, userIdErr] = $(params.user_id).id().$;
+ if (userIdErr) return rej('invalid user_id param');
+
+ // Lookup user
+ const user = await User.findOne({
+ _id: userId
+ }, {
+ fields: {
+ _id: true
+ }
+ });
+
+ if (user === null) {
+ return rej('user not found');
+ }
+
+ // Fetch recent posts
+ const recentPosts = await Post.find({
+ user_id: user._id,
+ reply_id: {
+ $exists: true,
+ $ne: null
+ }
+ }, {
+ sort: {
+ _id: -1
+ },
+ limit: 1000,
+ fields: {
+ _id: false,
+ reply_id: true
+ }
+ });
+
+ // 投稿が少なかったら中断
+ if (recentPosts.length === 0) {
+ return res([]);
+ }
+
+ const replyTargetPosts = await Post.find({
+ _id: {
+ $in: recentPosts.map(p => p.reply_id)
+ },
+ user_id: {
+ $ne: user._id
+ }
+ }, {
+ fields: {
+ _id: false,
+ user_id: true
+ }
+ });
+
+ const repliedUsers = {};
+
+ // Extract replies from recent posts
+ replyTargetPosts.forEach(post => {
+ const userId = post.user_id.toString();
+ if (repliedUsers[userId]) {
+ repliedUsers[userId]++;
+ } else {
+ repliedUsers[userId] = 1;
+ }
+ });
+
+ // Calc peak
+ let peak = 0;
+ Object.keys(repliedUsers).forEach(user => {
+ if (repliedUsers[user] > peak) peak = repliedUsers[user];
+ });
+
+ // Sort replies by frequency
+ const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]);
+
+ // Lookup top 10 replies
+ const topRepliedUsers = repliedUsersSorted.slice(0, 10);
+
+ // Make replies object (includes weights)
+ const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({
+ user: await serialize(user, me, { detail: true }),
+ weight: repliedUsers[user] / peak
+ })));
+
+ // Response
+ res(repliesObj);
+});
diff --git a/src/api/endpoints/users/posts.ts b/src/api/endpoints/users/posts.ts
index e37b660773..d8204b8b80 100644
--- a/src/api/endpoints/users/posts.ts
+++ b/src/api/endpoints/users/posts.ts
@@ -85,7 +85,7 @@ module.exports = (params, me) => new Promise(async (res, rej) => {
}
if (!includeReplies) {
- query.reply_to_id = null;
+ query.reply_id = null;
}
if (withMedia) {