From f4ae9391248d9ba366210be215681537ce9ecb49 Mon Sep 17 00:00:00 2001 From: syuilo Date: Sun, 24 Feb 2019 17:57:49 +0900 Subject: ハイフンに統一 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../users/get-frequently-replied-users.ts | 115 +++++++++++++++++++++ .../users/get_frequently_replied_users.ts | 115 --------------------- 2 files changed, 115 insertions(+), 115 deletions(-) create mode 100644 src/server/api/endpoints/users/get-frequently-replied-users.ts delete mode 100644 src/server/api/endpoints/users/get_frequently_replied_users.ts (limited to 'src/server/api/endpoints/users') diff --git a/src/server/api/endpoints/users/get-frequently-replied-users.ts b/src/server/api/endpoints/users/get-frequently-replied-users.ts new file mode 100644 index 0000000000..6f9c746acd --- /dev/null +++ b/src/server/api/endpoints/users/get-frequently-replied-users.ts @@ -0,0 +1,115 @@ +import $ from 'cafy'; +import ID, { transform } from '../../../../misc/cafy-id'; +import Note from '../../../../models/note'; +import { pack } from '../../../../models/user'; +import define from '../../define'; +import { maximum } from '../../../../prelude/array'; +import { getHideUserIds } from '../../common/get-hide-users'; +import { ApiError } from '../../error'; +import { getUser } from '../../common/getters'; + +export const meta = { + tags: ['users'], + + requireCredential: false, + + params: { + userId: { + validator: $.type(ID), + transform: transform, + desc: { + 'ja-JP': '対象のユーザーのID', + 'en-US': 'Target user ID' + } + }, + + limit: { + validator: $.optional.num.range(1, 100), + default: 10 + }, + }, + + errors: { + noSuchUser: { + message: 'No such user.', + code: 'NO_SUCH_USER', + id: 'e6965129-7b2a-40a4-bae2-cd84cd434822' + } + } +}; + +export default define(meta, async (ps, me) => { + // Lookup user + const user = await getUser(ps.userId).catch(e => { + if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); + throw e; + }); + + // Fetch recent notes + const recentNotes = await Note.find({ + userId: user._id, + replyId: { + $exists: true, + $ne: null + } + }, { + sort: { + _id: -1 + }, + limit: 1000, + fields: { + _id: false, + replyId: true + } + }); + + // 投稿が少なかったら中断 + if (recentNotes.length === 0) { + return []; + } + + const hideUserIds = await getHideUserIds(me); + hideUserIds.push(user._id); + + const replyTargetNotes = await Note.find({ + _id: { + $in: recentNotes.map(p => p.replyId) + }, + userId: { + $nin: hideUserIds + } + }, { + fields: { + _id: false, + userId: true + } + }); + + const repliedUsers: any = {}; + + // Extract replies from recent notes + for (const userId of replyTargetNotes.map(x => x.userId.toString())) { + if (repliedUsers[userId]) { + repliedUsers[userId]++; + } else { + repliedUsers[userId] = 1; + } + } + + // Calc peak + const peak = maximum(Object.values(repliedUsers)); + + // Sort replies by frequency + const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]); + + // Extract top replied users + const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit); + + // Make replies object (includes weights) + const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({ + user: await pack(user, me, { detail: true }), + weight: repliedUsers[user] / peak + }))); + + return repliesObj; +}); diff --git a/src/server/api/endpoints/users/get_frequently_replied_users.ts b/src/server/api/endpoints/users/get_frequently_replied_users.ts deleted file mode 100644 index 6f9c746acd..0000000000 --- a/src/server/api/endpoints/users/get_frequently_replied_users.ts +++ /dev/null @@ -1,115 +0,0 @@ -import $ from 'cafy'; -import ID, { transform } from '../../../../misc/cafy-id'; -import Note from '../../../../models/note'; -import { pack } from '../../../../models/user'; -import define from '../../define'; -import { maximum } from '../../../../prelude/array'; -import { getHideUserIds } from '../../common/get-hide-users'; -import { ApiError } from '../../error'; -import { getUser } from '../../common/getters'; - -export const meta = { - tags: ['users'], - - requireCredential: false, - - params: { - userId: { - validator: $.type(ID), - transform: transform, - desc: { - 'ja-JP': '対象のユーザーのID', - 'en-US': 'Target user ID' - } - }, - - limit: { - validator: $.optional.num.range(1, 100), - default: 10 - }, - }, - - errors: { - noSuchUser: { - message: 'No such user.', - code: 'NO_SUCH_USER', - id: 'e6965129-7b2a-40a4-bae2-cd84cd434822' - } - } -}; - -export default define(meta, async (ps, me) => { - // Lookup user - const user = await getUser(ps.userId).catch(e => { - if (e.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); - throw e; - }); - - // Fetch recent notes - const recentNotes = await Note.find({ - userId: user._id, - replyId: { - $exists: true, - $ne: null - } - }, { - sort: { - _id: -1 - }, - limit: 1000, - fields: { - _id: false, - replyId: true - } - }); - - // 投稿が少なかったら中断 - if (recentNotes.length === 0) { - return []; - } - - const hideUserIds = await getHideUserIds(me); - hideUserIds.push(user._id); - - const replyTargetNotes = await Note.find({ - _id: { - $in: recentNotes.map(p => p.replyId) - }, - userId: { - $nin: hideUserIds - } - }, { - fields: { - _id: false, - userId: true - } - }); - - const repliedUsers: any = {}; - - // Extract replies from recent notes - for (const userId of replyTargetNotes.map(x => x.userId.toString())) { - if (repliedUsers[userId]) { - repliedUsers[userId]++; - } else { - repliedUsers[userId] = 1; - } - } - - // Calc peak - const peak = maximum(Object.values(repliedUsers)); - - // Sort replies by frequency - const repliedUsersSorted = Object.keys(repliedUsers).sort((a, b) => repliedUsers[b] - repliedUsers[a]); - - // Extract top replied users - const topRepliedUsers = repliedUsersSorted.slice(0, ps.limit); - - // Make replies object (includes weights) - const repliesObj = await Promise.all(topRepliedUsers.map(async (user) => ({ - user: await pack(user, me, { detail: true }), - weight: repliedUsers[user] / peak - }))); - - return repliesObj; -}); -- cgit v1.2.3-freya