diff options
Diffstat (limited to 'src/api/endpoints/users')
| -rw-r--r-- | src/api/endpoints/users/followers.ts | 92 | ||||
| -rw-r--r-- | src/api/endpoints/users/following.ts | 92 | ||||
| -rw-r--r-- | src/api/endpoints/users/get_frequently_replied_users.ts | 100 | ||||
| -rw-r--r-- | src/api/endpoints/users/posts.ts | 129 | ||||
| -rw-r--r-- | src/api/endpoints/users/recommendation.ts | 48 | ||||
| -rw-r--r-- | src/api/endpoints/users/search.ts | 99 | ||||
| -rw-r--r-- | src/api/endpoints/users/search_by_username.ts | 39 | ||||
| -rw-r--r-- | src/api/endpoints/users/show.ts | 47 |
8 files changed, 0 insertions, 646 deletions
diff --git a/src/api/endpoints/users/followers.ts b/src/api/endpoints/users/followers.ts deleted file mode 100644 index 4905323ba5..0000000000 --- a/src/api/endpoints/users/followers.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; -import User from '../../models/user'; -import Following from '../../models/following'; -import serialize from '../../serializers/user'; -import getFriends from '../../common/get-friends'; - -/** - * Get followers of a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -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'); - - // Get 'iknow' parameter - const [iknow = false, iknowErr] = $(params.iknow).optional.boolean().$; - if (iknowErr) return rej('invalid iknow param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; - if (limitErr) return rej('invalid limit param'); - - // Get 'cursor' parameter - const [cursor = null, cursorErr] = $(params.cursor).optional.id().$; - if (cursorErr) return rej('invalid cursor param'); - - // Lookup user - const user = await User.findOne({ - _id: userId - }, { - fields: { - _id: true - } - }); - - if (user === null) { - return rej('user not found'); - } - - // Construct query - const query = { - followee_id: user._id, - deleted_at: { $exists: false } - } as any; - - // ログインしていてかつ iknow フラグがあるとき - if (me && iknow) { - // Get my friends - const myFriends = await getFriends(me._id); - - query.follower_id = { - $in: myFriends - }; - } - - // カーソルが指定されている場合 - if (cursor) { - query._id = { - $lt: cursor - }; - } - - // Get followers - const following = await Following - .find(query, { - limit: limit + 1, - sort: { _id: -1 } - }); - - // 「次のページ」があるかどうか - const inStock = following.length === limit + 1; - if (inStock) { - following.pop(); - } - - // Serialize - const users = await Promise.all(following.map(async f => - await serialize(f.follower_id, me, { detail: true }))); - - // Response - res({ - users: users, - next: inStock ? following[following.length - 1]._id : null, - }); -}); diff --git a/src/api/endpoints/users/following.ts b/src/api/endpoints/users/following.ts deleted file mode 100644 index dc2ff49bbe..0000000000 --- a/src/api/endpoints/users/following.ts +++ /dev/null @@ -1,92 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; -import User from '../../models/user'; -import Following from '../../models/following'; -import serialize from '../../serializers/user'; -import getFriends from '../../common/get-friends'; - -/** - * Get following users of a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -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'); - - // Get 'iknow' parameter - const [iknow = false, iknowErr] = $(params.iknow).optional.boolean().$; - if (iknowErr) return rej('invalid iknow param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; - if (limitErr) return rej('invalid limit param'); - - // Get 'cursor' parameter - const [cursor = null, cursorErr] = $(params.cursor).optional.id().$; - if (cursorErr) return rej('invalid cursor param'); - - // Lookup user - const user = await User.findOne({ - _id: userId - }, { - fields: { - _id: true - } - }); - - if (user === null) { - return rej('user not found'); - } - - // Construct query - const query = { - follower_id: user._id, - deleted_at: { $exists: false } - } as any; - - // ログインしていてかつ iknow フラグがあるとき - if (me && iknow) { - // Get my friends - const myFriends = await getFriends(me._id); - - query.followee_id = { - $in: myFriends - }; - } - - // カーソルが指定されている場合 - if (cursor) { - query._id = { - $lt: cursor - }; - } - - // Get followers - const following = await Following - .find(query, { - limit: limit + 1, - sort: { _id: -1 } - }); - - // 「次のページ」があるかどうか - const inStock = following.length === limit + 1; - if (inStock) { - following.pop(); - } - - // Serialize - const users = await Promise.all(following.map(async f => - await serialize(f.followee_id, me, { detail: true }))); - - // Response - res({ - users: users, - next: inStock ? following[following.length - 1]._id : null, - }); -}); diff --git a/src/api/endpoints/users/get_frequently_replied_users.ts b/src/api/endpoints/users/get_frequently_replied_users.ts deleted file mode 100644 index a8add623d4..0000000000 --- a/src/api/endpoints/users/get_frequently_replied_users.ts +++ /dev/null @@ -1,100 +0,0 @@ -/** - * 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'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; - if (limitErr) return rej('invalid limit 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]); - - // Extract top replied users - const topRepliedUsers = repliedUsersSorted.slice(0, limit); - - // 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 deleted file mode 100644 index fe821cf17a..0000000000 --- a/src/api/endpoints/users/posts.ts +++ /dev/null @@ -1,129 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; -import Post from '../../models/post'; -import User from '../../models/user'; -import serialize from '../../serializers/post'; - -/** - * Get posts of a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => new Promise(async (res, rej) => { - // Get 'user_id' parameter - const [userId, userIdErr] = $(params.user_id).optional.id().$; - if (userIdErr) return rej('invalid user_id param'); - - // Get 'username' parameter - const [username, usernameErr] = $(params.username).optional.string().$; - if (usernameErr) return rej('invalid username param'); - - if (userId === undefined && username === undefined) { - return rej('user_id or username is required'); - } - - // Get 'include_replies' parameter - const [includeReplies = true, includeRepliesErr] = $(params.include_replies).optional.boolean().$; - if (includeRepliesErr) return rej('invalid include_replies param'); - - // Get 'with_media' parameter - const [withMedia = false, withMediaErr] = $(params.with_media).optional.boolean().$; - if (withMediaErr) return rej('invalid with_media param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; - if (limitErr) return rej('invalid limit param'); - - // Get 'since_id' parameter - const [sinceId, sinceIdErr] = $(params.since_id).optional.id().$; - if (sinceIdErr) return rej('invalid since_id param'); - - // Get 'max_id' parameter - const [maxId, maxIdErr] = $(params.max_id).optional.id().$; - if (maxIdErr) return rej('invalid max_id param'); - - // Get 'since_date' parameter - const [sinceDate, sinceDateErr] = $(params.since_date).optional.number().$; - if (sinceDateErr) throw 'invalid since_date param'; - - // Get 'max_date' parameter - const [maxDate, maxDateErr] = $(params.max_date).optional.number().$; - if (maxDateErr) throw 'invalid max_date param'; - - // Check if only one of since_id, max_id, since_date, max_date specified - if ([sinceId, maxId, sinceDate, maxDate].filter(x => x != null).length > 1) { - throw 'only one of since_id, max_id, since_date, max_date can be specified'; - } - - const q = userId !== undefined - ? { _id: userId } - : { username_lower: username.toLowerCase() } ; - - // Lookup user - const user = await User.findOne(q, { - fields: { - _id: true - } - }); - - if (user === null) { - return rej('user not found'); - } - - //#region Construct query - const sort = { - _id: -1 - }; - - const query = { - user_id: user._id - } as any; - - if (sinceId) { - sort._id = 1; - query._id = { - $gt: sinceId - }; - } else if (maxId) { - query._id = { - $lt: maxId - }; - } else if (sinceDate) { - sort._id = 1; - query.created_at = { - $gt: new Date(sinceDate) - }; - } else if (maxDate) { - query.created_at = { - $lt: new Date(maxDate) - }; - } - - if (!includeReplies) { - query.reply_id = null; - } - - if (withMedia) { - query.media_ids = { - $exists: true, - $ne: null - }; - } - //#endregion - - // Issue query - const posts = await Post - .find(query, { - limit: limit, - sort: sort - }); - - // Serialize - res(await Promise.all(posts.map(async (post) => - await serialize(post, me) - ))); -}); diff --git a/src/api/endpoints/users/recommendation.ts b/src/api/endpoints/users/recommendation.ts deleted file mode 100644 index 731d68a7b1..0000000000 --- a/src/api/endpoints/users/recommendation.ts +++ /dev/null @@ -1,48 +0,0 @@ -/** - * Module dependencies - */ -const ms = require('ms'); -import $ from 'cafy'; -import User from '../../models/user'; -import serialize from '../../serializers/user'; -import getFriends from '../../common/get-friends'; - -/** - * Get recommended users - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => 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'); - - // ID list of the user itself and other users who the user follows - const followingIds = await getFriends(me._id); - - const users = await User - .find({ - _id: { - $nin: followingIds - }, - last_used_at: { - $gte: new Date(Date.now() - ms('7days')) - } - }, { - limit: limit, - skip: offset, - sort: { - followers_count: -1 - } - }); - - // Serialize - res(await Promise.all(users.map(async user => - await serialize(user, me, { detail: true })))); -}); diff --git a/src/api/endpoints/users/search.ts b/src/api/endpoints/users/search.ts deleted file mode 100644 index 73a5db47e2..0000000000 --- a/src/api/endpoints/users/search.ts +++ /dev/null @@ -1,99 +0,0 @@ -/** - * Module dependencies - */ -import * as mongo from 'mongodb'; -import $ from 'cafy'; -import User from '../../models/user'; -import serialize from '../../serializers/user'; -import config from '../../../conf'; -const escapeRegexp = require('escape-regexp'); - -/** - * Search a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => new Promise(async (res, rej) => { - // Get 'query' parameter - const [query, queryError] = $(params.query).string().pipe(x => x != '').$; - if (queryError) return rej('invalid query param'); - - // Get 'offset' parameter - const [offset = 0, offsetErr] = $(params.offset).optional.number().min(0).$; - if (offsetErr) return rej('invalid offset param'); - - // Get 'max' parameter - const [max = 10, maxErr] = $(params.max).optional.number().range(1, 30).$; - if (maxErr) return rej('invalid max param'); - - // If Elasticsearch is available, search by $ - // If not, search by MongoDB - (config.elasticsearch.enable ? byElasticsearch : byNative) - (res, rej, me, query, offset, max); -}); - -// Search by MongoDB -async function byNative(res, rej, me, query, offset, max) { - const escapedQuery = escapeRegexp(query); - - // Search users - const users = await User - .find({ - $or: [{ - username_lower: new RegExp(escapedQuery.replace('@', '').toLowerCase()) - }, { - name: new RegExp(escapedQuery) - }] - }, { - limit: max - }); - - // Serialize - res(await Promise.all(users.map(async user => - await serialize(user, me, { detail: true })))); -} - -// Search by Elasticsearch -async function byElasticsearch(res, rej, me, query, offset, max) { - const es = require('../../db/elasticsearch'); - - es.search({ - index: 'misskey', - type: 'user', - body: { - size: max, - from: offset, - query: { - simple_query_string: { - fields: ['username', 'name', 'bio'], - query: query, - default_operator: 'and' - } - } - } - }, async (error, response) => { - if (error) { - console.error(error); - return res(500); - } - - if (response.hits.total === 0) { - return res([]); - } - - const hits = response.hits.hits.map(hit => new mongo.ObjectID(hit._id)); - - const users = await User - .find({ - _id: { - $in: hits - } - }); - - // Serialize - res(await Promise.all(users.map(async user => - await serialize(user, me, { detail: true })))); - }); -} diff --git a/src/api/endpoints/users/search_by_username.ts b/src/api/endpoints/users/search_by_username.ts deleted file mode 100644 index 7f2f42f0a6..0000000000 --- a/src/api/endpoints/users/search_by_username.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; -import User from '../../models/user'; -import serialize from '../../serializers/user'; - -/** - * Search a user by username - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => new Promise(async (res, rej) => { - // Get 'query' parameter - const [query, queryError] = $(params.query).string().$; - if (queryError) return rej('invalid query param'); - - // Get 'offset' parameter - const [offset = 0, offsetErr] = $(params.offset).optional.number().min(0).$; - if (offsetErr) return rej('invalid offset param'); - - // Get 'limit' parameter - const [limit = 10, limitErr] = $(params.limit).optional.number().range(1, 100).$; - if (limitErr) return rej('invalid limit param'); - - const users = await User - .find({ - username_lower: new RegExp(query.toLowerCase()) - }, { - limit: limit, - skip: offset - }); - - // Serialize - res(await Promise.all(users.map(async user => - await serialize(user, me, { detail: true })))); -}); diff --git a/src/api/endpoints/users/show.ts b/src/api/endpoints/users/show.ts deleted file mode 100644 index 8e74b0fe3f..0000000000 --- a/src/api/endpoints/users/show.ts +++ /dev/null @@ -1,47 +0,0 @@ -/** - * Module dependencies - */ -import $ from 'cafy'; -import User from '../../models/user'; -import serialize from '../../serializers/user'; - -/** - * Show a user - * - * @param {any} params - * @param {any} me - * @return {Promise<any>} - */ -module.exports = (params, me) => new Promise(async (res, rej) => { - // Get 'user_id' parameter - const [userId, userIdErr] = $(params.user_id).optional.id().$; - if (userIdErr) return rej('invalid user_id param'); - - // Get 'username' parameter - const [username, usernameErr] = $(params.username).optional.string().$; - if (usernameErr) return rej('invalid username param'); - - if (userId === undefined && username === undefined) { - return rej('user_id or username is required'); - } - - const q = userId !== undefined - ? { _id: userId } - : { username_lower: username.toLowerCase() }; - - // Lookup user - const user = await User.findOne(q, { - fields: { - data: false - } - }); - - if (user === null) { - return rej('user not found'); - } - - // Send response - res(await serialize(user, me, { - detail: true - })); -}); |