summaryrefslogtreecommitdiff
path: root/src/api/endpoints/users
diff options
context:
space:
mode:
Diffstat (limited to 'src/api/endpoints/users')
-rw-r--r--src/api/endpoints/users/followers.ts92
-rw-r--r--src/api/endpoints/users/following.ts92
-rw-r--r--src/api/endpoints/users/get_frequently_replied_users.ts100
-rw-r--r--src/api/endpoints/users/posts.ts129
-rw-r--r--src/api/endpoints/users/recommendation.ts48
-rw-r--r--src/api/endpoints/users/search.ts99
-rw-r--r--src/api/endpoints/users/search_by_username.ts39
-rw-r--r--src/api/endpoints/users/show.ts47
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
- }));
-});