summaryrefslogtreecommitdiff
path: root/src/server/api/endpoints/users
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/api/endpoints/users')
-rw-r--r--src/server/api/endpoints/users/followers.ts10
-rw-r--r--src/server/api/endpoints/users/following.ts10
-rw-r--r--src/server/api/endpoints/users/get_frequently_replied_users.ts6
-rw-r--r--src/server/api/endpoints/users/lists/create.ts16
-rw-r--r--src/server/api/endpoints/users/lists/list.ts15
-rw-r--r--src/server/api/endpoints/users/lists/push.ts17
-rw-r--r--src/server/api/endpoints/users/lists/show.ts18
-rw-r--r--src/server/api/endpoints/users/notes.ts24
-rw-r--r--src/server/api/endpoints/users/recommendation.ts19
-rw-r--r--src/server/api/endpoints/users/search.ts4
-rw-r--r--src/server/api/endpoints/users/search_by_username.ts41
-rw-r--r--src/server/api/endpoints/users/show.ts12
12 files changed, 130 insertions, 62 deletions
diff --git a/src/server/api/endpoints/users/followers.ts b/src/server/api/endpoints/users/followers.ts
index 53133ee969..9411873573 100644
--- a/src/server/api/endpoints/users/followers.ts
+++ b/src/server/api/endpoints/users/followers.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import User, { ILocalUser } from '../../../../models/user';
import Following from '../../../../models/following';
import { pack } from '../../../../models/user';
@@ -7,21 +7,21 @@ import { getFriendIds } from '../../common/get-friends';
/**
* Get followers of a user
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'userId' parameter
const [userId, userIdErr] = $.type(ID).get(params.userId);
if (userIdErr) return rej('invalid userId param');
// Get 'iknow' parameter
- const [iknow = false, iknowErr] = $.bool.optional().get(params.iknow);
+ const [iknow = false, iknowErr] = $.bool.optional.get(params.iknow);
if (iknowErr) return rej('invalid iknow param');
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'cursor' parameter
- const [cursor = null, cursorErr] = $.type(ID).optional().get(params.cursor);
+ const [cursor = null, cursorErr] = $.type(ID).optional.get(params.cursor);
if (cursorErr) return rej('invalid cursor param');
// Lookup user
diff --git a/src/server/api/endpoints/users/following.ts b/src/server/api/endpoints/users/following.ts
index 2061200198..7a64d15d7b 100644
--- a/src/server/api/endpoints/users/following.ts
+++ b/src/server/api/endpoints/users/following.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import User, { ILocalUser } from '../../../../models/user';
import Following from '../../../../models/following';
import { pack } from '../../../../models/user';
@@ -7,21 +7,21 @@ import { getFriendIds } from '../../common/get-friends';
/**
* Get following users of a user
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'userId' parameter
const [userId, userIdErr] = $.type(ID).get(params.userId);
if (userIdErr) return rej('invalid userId param');
// Get 'iknow' parameter
- const [iknow = false, iknowErr] = $.bool.optional().get(params.iknow);
+ const [iknow = false, iknowErr] = $.bool.optional.get(params.iknow);
if (iknowErr) return rej('invalid iknow param');
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'cursor' parameter
- const [cursor = null, cursorErr] = $.type(ID).optional().get(params.cursor);
+ const [cursor = null, cursorErr] = $.type(ID).optional.get(params.cursor);
if (cursorErr) return rej('invalid cursor param');
// Lookup user
diff --git a/src/server/api/endpoints/users/get_frequently_replied_users.ts b/src/server/api/endpoints/users/get_frequently_replied_users.ts
index ba8779d334..42b6ce20d6 100644
--- a/src/server/api/endpoints/users/get_frequently_replied_users.ts
+++ b/src/server/api/endpoints/users/get_frequently_replied_users.ts
@@ -1,14 +1,14 @@
-import $ from 'cafy'; import ID from '../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import Note from '../../../../models/note';
import User, { pack, ILocalUser } from '../../../../models/user';
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'userId' parameter
const [userId, userIdErr] = $.type(ID).get(params.userId);
if (userIdErr) return rej('invalid userId param');
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Lookup user
diff --git a/src/server/api/endpoints/users/lists/create.ts b/src/server/api/endpoints/users/lists/create.ts
index cdd1a0d813..d7dc2a5f70 100644
--- a/src/server/api/endpoints/users/lists/create.ts
+++ b/src/server/api/endpoints/users/lists/create.ts
@@ -2,10 +2,18 @@ import $ from 'cafy';
import UserList, { pack } from '../../../../../models/user-list';
import { ILocalUser } from '../../../../../models/user';
-/**
- * Create a user list
- */
-module.exports = async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
+export const meta = {
+ desc: {
+ ja: 'ユーザーリストを作成します。',
+ en: 'Create a user list'
+ },
+
+ requireCredential: true,
+
+ kind: 'account-write'
+};
+
+export default async (params: any, user: ILocalUser) => new Promise(async (res, rej) => {
// Get 'title' parameter
const [title, titleErr] = $.str.range(1, 100).get(params.title);
if (titleErr) return rej('invalid title param');
diff --git a/src/server/api/endpoints/users/lists/list.ts b/src/server/api/endpoints/users/lists/list.ts
index bf8391d863..31fef26bdc 100644
--- a/src/server/api/endpoints/users/lists/list.ts
+++ b/src/server/api/endpoints/users/lists/list.ts
@@ -1,10 +1,17 @@
import UserList, { pack } from '../../../../../models/user-list';
import { ILocalUser } from '../../../../../models/user';
-/**
- * Add a user to a user list
- */
-module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export const meta = {
+ desc: {
+ ja: '自分の作成したユーザーリスト一覧を取得します。'
+ },
+
+ requireCredential: true,
+
+ kind: 'account-read'
+};
+
+export default async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Fetch lists
const userLists = await UserList.find({
userId: me._id,
diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts
index d8a3b3c9aa..bd4e201bde 100644
--- a/src/server/api/endpoints/users/lists/push.ts
+++ b/src/server/api/endpoints/users/lists/push.ts
@@ -1,15 +1,26 @@
-import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
import UserList from '../../../../../models/user-list';
import User, { pack as packUser, isRemoteUser, getGhost, ILocalUser } from '../../../../../models/user';
-import { publishUserListStream } from '../../../../../publishers/stream';
+import { publishUserListStream } from '../../../../../stream';
import ap from '../../../../../remote/activitypub/renderer';
import renderFollow from '../../../../../remote/activitypub/renderer/follow';
import { deliver } from '../../../../../queue';
+export const meta = {
+ desc: {
+ ja: '指定したユーザーリストに指定したユーザーを追加します。',
+ en: 'Add a user to a user list.'
+ },
+
+ requireCredential: true,
+
+ kind: 'account-write'
+};
+
/**
* Add a user to a user list
*/
-module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'listId' parameter
const [listId, listIdErr] = $.type(ID).get(params.listId);
if (listIdErr) return rej('invalid listId param');
diff --git a/src/server/api/endpoints/users/lists/show.ts b/src/server/api/endpoints/users/lists/show.ts
index e4ae239613..2fd142a609 100644
--- a/src/server/api/endpoints/users/lists/show.ts
+++ b/src/server/api/endpoints/users/lists/show.ts
@@ -1,11 +1,19 @@
-import $ from 'cafy'; import ID from '../../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../../misc/cafy-id';
import UserList, { pack } from '../../../../../models/user-list';
import { ILocalUser } from '../../../../../models/user';
-/**
- * Show a user list
- */
-module.exports = async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export const meta = {
+ desc: {
+ ja: '指定したユーザーリストの情報を取得します。',
+ en: 'Show a user list.'
+ },
+
+ requireCredential: true,
+
+ kind: 'account-read'
+};
+
+export default async (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'listId' parameter
const [listId, listIdErr] = $.type(ID).get(params.listId);
if (listIdErr) return rej('invalid listId param');
diff --git a/src/server/api/endpoints/users/notes.ts b/src/server/api/endpoints/users/notes.ts
index 222a8d950a..c60050d3cd 100644
--- a/src/server/api/endpoints/users/notes.ts
+++ b/src/server/api/endpoints/users/notes.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import getHostLower from '../../common/get-host-lower';
import Note, { pack } from '../../../../models/note';
import User, { ILocalUser } from '../../../../models/user';
@@ -6,13 +6,13 @@ import User, { ILocalUser } from '../../../../models/user';
/**
* Get notes of a user
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'userId' parameter
- const [userId, userIdErr] = $.type(ID).optional().get(params.userId);
+ const [userId, userIdErr] = $.type(ID).optional.get(params.userId);
if (userIdErr) return rej('invalid userId param');
// Get 'username' parameter
- const [username, usernameErr] = $.str.optional().get(params.username);
+ const [username, usernameErr] = $.str.optional.get(params.username);
if (usernameErr) return rej('invalid username param');
if (userId === undefined && username === undefined) {
@@ -20,7 +20,7 @@ module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) =
}
// Get 'host' parameter
- const [host, hostErr] = $.str.optional().get(params.host);
+ const [host, hostErr] = $.str.optional.get(params.host);
if (hostErr) return rej('invalid host param');
if (userId === undefined && host === undefined) {
@@ -28,31 +28,31 @@ module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) =
}
// Get 'includeReplies' parameter
- const [includeReplies = true, includeRepliesErr] = $.bool.optional().get(params.includeReplies);
+ const [includeReplies = true, includeRepliesErr] = $.bool.optional.get(params.includeReplies);
if (includeRepliesErr) return rej('invalid includeReplies param');
// Get 'withMedia' parameter
- const [withMedia = false, withMediaErr] = $.bool.optional().get(params.withMedia);
+ const [withMedia = false, withMediaErr] = $.bool.optional.get(params.withMedia);
if (withMediaErr) return rej('invalid withMedia param');
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'sinceId' parameter
- const [sinceId, sinceIdErr] = $.type(ID).optional().get(params.sinceId);
+ const [sinceId, sinceIdErr] = $.type(ID).optional.get(params.sinceId);
if (sinceIdErr) return rej('invalid sinceId param');
// Get 'untilId' parameter
- const [untilId, untilIdErr] = $.type(ID).optional().get(params.untilId);
+ const [untilId, untilIdErr] = $.type(ID).optional.get(params.untilId);
if (untilIdErr) return rej('invalid untilId param');
// Get 'sinceDate' parameter
- const [sinceDate, sinceDateErr] = $.num.optional().get(params.sinceDate);
+ const [sinceDate, sinceDateErr] = $.num.optional.get(params.sinceDate);
if (sinceDateErr) throw 'invalid sinceDate param';
// Get 'untilDate' parameter
- const [untilDate, untilDateErr] = $.num.optional().get(params.untilDate);
+ const [untilDate, untilDateErr] = $.num.optional.get(params.untilDate);
if (untilDateErr) throw 'invalid untilDate param';
// Check if only one of sinceId, untilId, sinceDate, untilDate specified
diff --git a/src/server/api/endpoints/users/recommendation.ts b/src/server/api/endpoints/users/recommendation.ts
index 1d0d889f11..13377e6fff 100644
--- a/src/server/api/endpoints/users/recommendation.ts
+++ b/src/server/api/endpoints/users/recommendation.ts
@@ -4,16 +4,23 @@ import User, { pack, ILocalUser } from '../../../../models/user';
import { getFriendIds } from '../../common/get-friends';
import Mute from '../../../../models/mute';
-/**
- * Get recommended users
- */
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export const meta = {
+ desc: {
+ ja: 'おすすめのユーザー一覧を取得します。'
+ },
+
+ requireCredential: true,
+
+ kind: 'account-read'
+};
+
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
// Get 'offset' parameter
- const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
+ const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
if (offsetErr) return rej('invalid offset param');
// ID list of the user itself and other users who the user follows
diff --git a/src/server/api/endpoints/users/search.ts b/src/server/api/endpoints/users/search.ts
index e29c8d32f1..d443d35b47 100644
--- a/src/server/api/endpoints/users/search.ts
+++ b/src/server/api/endpoints/users/search.ts
@@ -5,13 +5,13 @@ const escapeRegexp = require('escape-regexp');
/**
* Search a user
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'query' parameter
const [query, queryError] = $.str.pipe(x => x != '').get(params.query);
if (queryError) return rej('invalid query param');
// Get 'max' parameter
- const [max = 10, maxErr] = $.num.optional().range(1, 30).get(params.max);
+ const [max = 10, maxErr] = $.num.optional.range(1, 30).get(params.max);
if (maxErr) return rej('invalid max param');
const escapedQuery = escapeRegexp(query);
diff --git a/src/server/api/endpoints/users/search_by_username.ts b/src/server/api/endpoints/users/search_by_username.ts
index 937f9af589..bfab378389 100644
--- a/src/server/api/endpoints/users/search_by_username.ts
+++ b/src/server/api/endpoints/users/search_by_username.ts
@@ -1,41 +1,68 @@
import $ from 'cafy';
import User, { pack, ILocalUser } from '../../../../models/user';
+const escapeRegexp = require('escape-regexp');
/**
* Search a user by username
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
// Get 'query' parameter
const [query, queryError] = $.str.get(params.query);
if (queryError) return rej('invalid query param');
// Get 'offset' parameter
- const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset);
+ const [offset = 0, offsetErr] = $.num.optional.min(0).get(params.offset);
if (offsetErr) return rej('invalid offset param');
// Get 'limit' parameter
- const [limit = 10, limitErr] = $.num.optional().range(1, 100).get(params.limit);
+ const [limit = 10, limitErr] = $.num.optional.range(1, 100).get(params.limit);
if (limitErr) return rej('invalid limit param');
let users = await User
.find({
host: null,
- usernameLower: new RegExp(query.toLowerCase())
+ usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
}, {
limit: limit,
skip: offset
});
if (users.length < limit) {
- const remoteUsers = await User
+ const otherUsers = await User
.find({
host: { $ne: null },
- usernameLower: new RegExp(query.toLowerCase())
+ usernameLower: new RegExp('^' + escapeRegexp(query.toLowerCase()))
}, {
limit: limit - users.length
});
- users = users.concat(remoteUsers);
+ users = users.concat(otherUsers);
+ }
+
+ if (users.length < limit) {
+ const otherUsers = await User
+ .find({
+ _id: { $nin: users.map(u => u._id) },
+ host: null,
+ usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
+ }, {
+ limit: limit - users.length
+ });
+
+ users = users.concat(otherUsers);
+ }
+
+ if (users.length < limit) {
+ const otherUsers = await User
+ .find({
+ _id: { $nin: users.map(u => u._id) },
+ host: { $ne: null },
+ usernameLower: new RegExp(escapeRegexp(query.toLowerCase()))
+ }, {
+ limit: limit - users.length
+ });
+
+ users = users.concat(otherUsers);
}
// Serialize
diff --git a/src/server/api/endpoints/users/show.ts b/src/server/api/endpoints/users/show.ts
index bf7e2a2312..8ec0eb8dd9 100644
--- a/src/server/api/endpoints/users/show.ts
+++ b/src/server/api/endpoints/users/show.ts
@@ -1,4 +1,4 @@
-import $ from 'cafy'; import ID from '../../../../cafy-id';
+import $ from 'cafy'; import ID from '../../../../misc/cafy-id';
import User, { pack, ILocalUser } from '../../../../models/user';
import resolveRemoteUser from '../../../../remote/resolve-user';
@@ -7,23 +7,23 @@ const cursorOption = { fields: { data: false } };
/**
* Show user(s)
*/
-module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
+export default (params: any, me: ILocalUser) => new Promise(async (res, rej) => {
let user;
// Get 'userId' parameter
- const [userId, userIdErr] = $.type(ID).optional().get(params.userId);
+ const [userId, userIdErr] = $.type(ID).optional.get(params.userId);
if (userIdErr) return rej('invalid userId param');
// Get 'userIds' parameter
- const [userIds, userIdsErr] = $.arr($.type(ID)).optional().get(params.userIds);
+ const [userIds, userIdsErr] = $.arr($.type(ID)).optional.get(params.userIds);
if (userIdsErr) return rej('invalid userIds param');
// Get 'username' parameter
- const [username, usernameErr] = $.str.optional().get(params.username);
+ const [username, usernameErr] = $.str.optional.get(params.username);
if (usernameErr) return rej('invalid username param');
// Get 'host' parameter
- const [host, hostErr] = $.str.optional().nullable().get(params.host);
+ const [host, hostErr] = $.str.optional.nullable.get(params.host);
if (hostErr) return rej('invalid host param');
if (userIds) {