summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/users
diff options
context:
space:
mode:
authortamaina <tamaina@hotmail.co.jp>2022-06-21 07:49:52 +0000
committertamaina <tamaina@hotmail.co.jp>2022-06-21 07:49:52 +0000
commitf33654fb9ae562a43745b612a3007c248d988f2b (patch)
tree25b8599f7d28bf02cd0d3970b735d9db5e84742b /packages/backend/src/server/api/endpoints/users
parentMerge branch 'develop' into pizzax-indexeddb (diff)
parentrefactor(client): use composition api (diff)
downloadmisskey-f33654fb9ae562a43745b612a3007c248d988f2b.tar.gz
misskey-f33654fb9ae562a43745b612a3007c248d988f2b.tar.bz2
misskey-f33654fb9ae562a43745b612a3007c248d988f2b.zip
Merge branch 'develop' into pizzax-indexeddb
Diffstat (limited to 'packages/backend/src/server/api/endpoints/users')
-rw-r--r--packages/backend/src/server/api/endpoints/users/clips.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/users/followers.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/users/following.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/users/gallery/posts.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/create.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/delete.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invite.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/joined.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/leave.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/owned.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/pull.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/show.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/transfer.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/update.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/create.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/delete.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/list.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/pull.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/push.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/show.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/update.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/notes.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/pages.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/users/reactions.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/recommendation.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/relation.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/report-abuse.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/users/search.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/users/show.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/stats.ts178
34 files changed, 272 insertions, 122 deletions
diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts
index 424c594749..09fdf27c23 100644
--- a/packages/backend/src/server/api/endpoints/users/clips.ts
+++ b/packages/backend/src/server/api/endpoints/users/clips.ts
@@ -1,9 +1,21 @@
-import define from '../../define.js';
import { Clips } from '@/models/index.js';
+import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'clips'],
+
+ description: 'Show all clips this user owns.',
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Clip',
+ },
+ },
} as const;
export const paramDef = {
@@ -20,7 +32,7 @@ export const paramDef = {
// eslint-disable-next-line import/no-default-export
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Clips.createQueryBuilder('clip'), ps.sinceId, ps.untilId)
- .andWhere(`clip.userId = :userId`, { userId: ps.userId })
+ .andWhere('clip.userId = :userId', { userId: ps.userId })
.andWhere('clip.isPublic = true');
const clips = await query
diff --git a/packages/backend/src/server/api/endpoints/users/followers.ts b/packages/backend/src/server/api/endpoints/users/followers.ts
index 26b1f20df0..7f9f980764 100644
--- a/packages/backend/src/server/api/endpoints/users/followers.ts
+++ b/packages/backend/src/server/api/endpoints/users/followers.ts
@@ -1,15 +1,17 @@
+import { IsNull } from 'typeorm';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { Users, Followings, UserProfiles } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { toPunyNullable } from '@/misc/convert-host.js';
-import { IsNull } from 'typeorm';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Show everyone that follows this user.',
+
res: {
type: 'array',
optional: false, nullable: false,
@@ -94,7 +96,7 @@ export default define(meta, paramDef, async (ps, me) => {
}
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
- .andWhere(`following.followeeId = :userId`, { userId: user.id })
+ .andWhere('following.followeeId = :userId', { userId: user.id })
.innerJoinAndSelect('following.follower', 'follower');
const followings = await query
diff --git a/packages/backend/src/server/api/endpoints/users/following.ts b/packages/backend/src/server/api/endpoints/users/following.ts
index 42cf5216e8..0aaa810f76 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -1,15 +1,17 @@
+import { IsNull } from 'typeorm';
+import { Users, Followings, UserProfiles } from '@/models/index.js';
+import { toPunyNullable } from '@/misc/convert-host.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { Users, Followings, UserProfiles } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { toPunyNullable } from '@/misc/convert-host.js';
-import { IsNull } from 'typeorm';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Show everyone that this user is following.',
+
res: {
type: 'array',
optional: false, nullable: false,
@@ -94,7 +96,7 @@ export default define(meta, paramDef, async (ps, me) => {
}
const query = makePaginationQuery(Followings.createQueryBuilder('following'), ps.sinceId, ps.untilId)
- .andWhere(`following.followerId = :userId`, { userId: user.id })
+ .andWhere('following.followerId = :userId', { userId: user.id })
.innerJoinAndSelect('following.followee', 'followee');
const followings = await query
diff --git a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
index d7c435256c..35bf2df598 100644
--- a/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
+++ b/packages/backend/src/server/api/endpoints/users/gallery/posts.ts
@@ -4,6 +4,18 @@ import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'gallery'],
+
+ description: 'Show all gallery posts by the given user.',
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'GalleryPost',
+ },
+ },
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
index 73cadc0df7..56965d3066 100644
--- a/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
+++ b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
@@ -1,15 +1,17 @@
-import define from '../../define.js';
+import { Not, In, IsNull } from 'typeorm';
import { maximum } from '@/prelude/array.js';
+import { Notes, Users } from '@/models/index.js';
+import define from '../../define.js';
import { ApiError } from '../../error.js';
import { getUser } from '../../common/getters.js';
-import { Not, In, IsNull } from 'typeorm';
-import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Get a list of other users that the specified user frequently replies to.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/create.ts b/packages/backend/src/server/api/endpoints/users/groups/create.ts
index fc775d7cc1..4a6362a3c6 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/create.ts
@@ -1,8 +1,8 @@
-import define from '../../../define.js';
import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { UserGroup } from '@/models/entities/user-group.js';
import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
+import define from '../../../define.js';
export const meta = {
tags: ['groups'],
@@ -11,6 +11,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Create a new group.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/delete.ts b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
index f68006994c..2ff1f9aec1 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/delete.ts
@@ -1,6 +1,6 @@
+import { UserGroups } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Delete an existing group.',
+
errors: {
noSuchGroup: {
message: 'No such group.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
index 75c1acc302..220fff5f3e 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts
@@ -1,8 +1,8 @@
-import define from '../../../../define.js';
-import { ApiError } from '../../../../error.js';
import { UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
+import { ApiError } from '../../../../error.js';
+import define from '../../../../define.js';
export const meta = {
tags: ['groups', 'users'],
@@ -11,6 +11,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Join a group the authenticated user has been invited to.',
+
errors: {
noSuchInvitation: {
message: 'No such invitation.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
index 46bc780ab0..8d1d3db734 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts
@@ -1,6 +1,6 @@
+import { UserGroupInvitations } from '@/models/index.js';
import define from '../../../../define.js';
import { ApiError } from '../../../../error.js';
-import { UserGroupInvitations } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Delete an existing group invitation for the authenticated user without joining the group.',
+
errors: {
noSuchInvitation: {
message: 'No such invitation.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/invite.ts b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
index 30a5beb1d9..1a8d320f3a 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/invite.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/invite.ts
@@ -1,10 +1,10 @@
-import define from '../../../define.js';
-import { ApiError } from '../../../error.js';
-import { getUser } from '../../../common/getters.js';
import { UserGroups, UserGroupJoinings, UserGroupInvitations } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
import { createNotification } from '@/services/create-notification.js';
+import { getUser } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import define from '../../../define.js';
export const meta = {
tags: ['groups', 'users'],
@@ -13,6 +13,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Invite a user to an existing group.',
+
errors: {
noSuchGroup: {
message: 'No such group.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/joined.ts b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
index 77dc59d3e5..16c6e544e5 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/joined.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/joined.ts
@@ -1,6 +1,6 @@
-import define from '../../../define.js';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import { Not, In } from 'typeorm';
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['groups', 'account'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'read:user-groups',
+ description: 'List the groups that the authenticated user is a member of.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/leave.ts b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
index 33abd5439f..83dc757db1 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/leave.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/leave.ts
@@ -1,6 +1,6 @@
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Leave a group. The owner of a group can not leave. They must transfer ownership or delete the group instead.',
+
errors: {
noSuchGroup: {
message: 'No such group.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/owned.ts b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
index b1289e601f..d77cf1a52e 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/owned.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/owned.ts
@@ -1,5 +1,5 @@
-import define from '../../../define.js';
import { UserGroups } from '@/models/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['groups', 'account'],
@@ -8,6 +8,8 @@ export const meta = {
kind: 'read:user-groups',
+ description: 'List the groups that the authenticated user is the owner of.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/pull.ts b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
index b31990b2e3..ba67a1e5c9 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/pull.ts
@@ -1,7 +1,7 @@
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getUser } from '../../../common/getters.js';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -10,6 +10,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Removes a specified user from a group. The owner can not be removed.',
+
errors: {
noSuchGroup: {
message: 'No such group.',
diff --git a/packages/backend/src/server/api/endpoints/users/groups/show.ts b/packages/backend/src/server/api/endpoints/users/groups/show.ts
index 3ffb0f5ba9..21e3d9da26 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/show.ts
@@ -1,6 +1,6 @@
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'account'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'read:user-groups',
+ description: 'Show the properties of a group.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
index 41ceee3b2e..6456e70dd5 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/transfer.ts
@@ -1,7 +1,7 @@
+import { UserGroups, UserGroupJoinings } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getUser } from '../../../common/getters.js';
-import { UserGroups, UserGroupJoinings } from '@/models/index.js';
export const meta = {
tags: ['groups', 'users'],
@@ -10,6 +10,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Transfer ownership of a group from the authenticated user to another user.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/groups/update.ts b/packages/backend/src/server/api/endpoints/users/groups/update.ts
index 1016aa8926..0a96165fc4 100644
--- a/packages/backend/src/server/api/endpoints/users/groups/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/groups/update.ts
@@ -1,6 +1,6 @@
+import { UserGroups } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserGroups } from '@/models/index.js';
export const meta = {
tags: ['groups'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:user-groups',
+ description: 'Update the properties of a group.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/create.ts b/packages/backend/src/server/api/endpoints/users/lists/create.ts
index d5260256d5..783e63f5de 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/create.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/create.ts
@@ -1,7 +1,7 @@
-import define from '../../../define.js';
import { UserLists } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { UserList } from '@/models/entities/user-list.js';
+import define from '../../../define.js';
export const meta = {
tags: ['lists'],
@@ -10,6 +10,8 @@ export const meta = {
kind: 'write:account',
+ description: 'Create a new list of users.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/delete.ts b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
index b7ad96eef0..5a7613c98a 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/delete.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/delete.ts
@@ -1,6 +1,6 @@
+import { UserLists } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:account',
+ description: 'Delete an existing list of users.',
+
errors: {
noSuchList: {
message: 'No such list.',
diff --git a/packages/backend/src/server/api/endpoints/users/lists/list.ts b/packages/backend/src/server/api/endpoints/users/lists/list.ts
index 78311292cb..889052fa30 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/list.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/list.ts
@@ -1,5 +1,5 @@
-import define from '../../../define.js';
import { UserLists } from '@/models/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['lists', 'account'],
@@ -8,6 +8,8 @@ export const meta = {
kind: 'read:account',
+ description: 'Show all lists that the authenticated user has created.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/pull.ts b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
index 76863f07d1..d3d1d6555c 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/pull.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/pull.ts
@@ -1,8 +1,8 @@
import { publishUserListStream } from '@/services/stream.js';
+import { UserLists, UserListJoinings, Users } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getUser } from '../../../common/getters.js';
-import { UserLists, UserListJoinings, Users } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -11,6 +11,8 @@ export const meta = {
kind: 'write:account',
+ description: 'Remove a user from a list.',
+
errors: {
noSuchList: {
message: 'No such list.',
diff --git a/packages/backend/src/server/api/endpoints/users/lists/push.ts b/packages/backend/src/server/api/endpoints/users/lists/push.ts
index 260665c63a..12b7b86342 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/push.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/push.ts
@@ -1,8 +1,8 @@
+import { pushUserToUserList } from '@/services/user-list/push.js';
+import { UserLists, UserListJoinings, Blockings } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getUser } from '../../../common/getters.js';
-import { pushUserToUserList } from '@/services/user-list/push.js';
-import { UserLists, UserListJoinings, Blockings } from '@/models/index.js';
export const meta = {
tags: ['lists', 'users'],
@@ -11,6 +11,8 @@ export const meta = {
kind: 'write:account',
+ description: 'Add a user to an existing list.',
+
errors: {
noSuchList: {
message: 'No such list.',
diff --git a/packages/backend/src/server/api/endpoints/users/lists/show.ts b/packages/backend/src/server/api/endpoints/users/lists/show.ts
index 5f51980e95..fd0612f735 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/show.ts
@@ -1,6 +1,6 @@
+import { UserLists } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists', 'account'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'read:account',
+ description: 'Show the properties of a list.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/lists/update.ts b/packages/backend/src/server/api/endpoints/users/lists/update.ts
index 52353a14cc..65e708b959 100644
--- a/packages/backend/src/server/api/endpoints/users/lists/update.ts
+++ b/packages/backend/src/server/api/endpoints/users/lists/update.ts
@@ -1,6 +1,6 @@
+import { UserLists } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { UserLists } from '@/models/index.js';
export const meta = {
tags: ['lists'],
@@ -9,6 +9,8 @@ export const meta = {
kind: 'write:account',
+ description: 'Update the properties of a list.',
+
res: {
type: 'object',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 16318d2225..aec5c0ea99 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -1,17 +1,19 @@
+import { Brackets } from 'typeorm';
+import { Notes } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import { getUser } from '../../common/getters.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
-import { Notes } from '@/models/index.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { Brackets } from 'typeorm';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['users', 'notes'],
+ description: 'Show all notes that this user created.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts
index b8b3e8192e..b1d28af845 100644
--- a/packages/backend/src/server/api/endpoints/users/pages.ts
+++ b/packages/backend/src/server/api/endpoints/users/pages.ts
@@ -1,9 +1,21 @@
-import define from '../../define.js';
import { Pages } from '@/models/index.js';
+import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
export const meta = {
tags: ['users', 'pages'],
+
+ description: 'Show all pages this user created.',
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'Page',
+ },
+ },
} as const;
export const paramDef = {
@@ -20,7 +32,7 @@ export const paramDef = {
// eslint-disable-next-line import/no-default-export
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Pages.createQueryBuilder('page'), ps.sinceId, ps.untilId)
- .andWhere(`page.userId = :userId`, { userId: ps.userId })
+ .andWhere('page.userId = :userId', { userId: ps.userId })
.andWhere('page.visibility = \'public\'');
const pages = await query
diff --git a/packages/backend/src/server/api/endpoints/users/reactions.ts b/packages/backend/src/server/api/endpoints/users/reactions.ts
index c2d1994343..9668bd21b8 100644
--- a/packages/backend/src/server/api/endpoints/users/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/users/reactions.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { NoteReactions, UserProfiles } from '@/models/index.js';
+import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { ApiError } from '../../error.js';
@@ -9,6 +9,8 @@ export const meta = {
requireCredential: false,
+ description: 'Show all reactions this user made.',
+
res: {
type: 'array',
optional: false, nullable: false,
@@ -50,8 +52,8 @@ export default define(meta, paramDef, async (ps, me) => {
}
const query = makePaginationQuery(NoteReactions.createQueryBuilder('reaction'),
- ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
- .andWhere(`reaction.userId = :userId`, { userId: ps.userId })
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ .andWhere('reaction.userId = :userId', { userId: ps.userId })
.leftJoinAndSelect('reaction.note', 'note');
generateVisibilityQuery(query, me);
diff --git a/packages/backend/src/server/api/endpoints/users/recommendation.ts b/packages/backend/src/server/api/endpoints/users/recommendation.ts
index a8f18de522..e7654e1714 100644
--- a/packages/backend/src/server/api/endpoints/users/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/users/recommendation.ts
@@ -1,6 +1,6 @@
import ms from 'ms';
-import define from '../../define.js';
import { Users, Followings } from '@/models/index.js';
+import define from '../../define.js';
import { generateMutedUserQueryForUsers } from '../../common/generate-muted-user-query.js';
import { generateBlockedUserQuery, generateBlockQueryForUsers } from '../../common/generate-block-query.js';
@@ -11,6 +11,8 @@ export const meta = {
kind: 'read:account',
+ description: 'Show users that the authenticated user might be interested to follow.',
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts
index c6262122d4..233a6a90b4 100644
--- a/packages/backend/src/server/api/endpoints/users/relation.ts
+++ b/packages/backend/src/server/api/endpoints/users/relation.ts
@@ -1,11 +1,13 @@
-import define from '../../define.js';
import { Users } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
requireCredential: true,
+ description: 'Show the different kinds of relations between the authenticated user and the specified user(s).',
+
res: {
optional: false, nullable: false,
oneOf: [
diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
index 0be385dbbf..a9987eafa9 100644
--- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts
+++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts
@@ -1,18 +1,20 @@
import * as sanitizeHtml from 'sanitize-html';
-import define from '../../define.js';
import { publishAdminStream } from '@/services/stream.js';
-import { ApiError } from '../../error.js';
-import { getUser } from '../../common/getters.js';
import { AbuseUserReports, Users } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { sendEmail } from '@/services/send-email.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
+import { getUser } from '../../common/getters.js';
+import { ApiError } from '../../error.js';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
requireCredential: true,
+ description: 'File a report.',
+
errors: {
noSuchUser: {
message: 'No such user.',
diff --git a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
index f74d80e2ae..6e5bc46bb5 100644
--- a/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
+++ b/packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts
@@ -1,14 +1,16 @@
-import define from '../../define.js';
-import { Followings, Users } from '@/models/index.js';
import { Brackets } from 'typeorm';
+import { Followings, Users } from '@/models/index.js';
import { USER_ACTIVE_THRESHOLD } from '@/const.js';
import { User } from '@/models/entities/user.js';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Search for a user by username and/or host.',
+
res: {
type: 'array',
optional: false, nullable: false,
@@ -65,7 +67,7 @@ export default define(meta, paramDef, async (ps, me) => {
const query = Users.createQueryBuilder('user')
.where(`user.id IN (${ followingQuery.getQuery() })`)
- .andWhere(`user.id != :meId`, { meId: me.id })
+ .andWhere('user.id != :meId', { meId: me.id })
.andWhere('user.isSuspended = FALSE')
.andWhere('user.usernameLower LIKE :username', { username: ps.username.toLowerCase() + '%' })
.andWhere(new Brackets(qb => { qb
@@ -83,7 +85,7 @@ export default define(meta, paramDef, async (ps, me) => {
if (users.length < ps.limit) {
const otherQuery = await Users.createQueryBuilder('user')
.where(`user.id NOT IN (${ followingQuery.getQuery() })`)
- .andWhere(`user.id != :meId`, { meId: me.id })
+ .andWhere('user.id != :meId', { meId: me.id })
.andWhere('user.isSuspended = FALSE')
.andWhere('user.usernameLower LIKE :username', { username: ps.username.toLowerCase() + '%' })
.andWhere('user.updatedAt IS NOT NULL');
diff --git a/packages/backend/src/server/api/endpoints/users/search.ts b/packages/backend/src/server/api/endpoints/users/search.ts
index f93d4f718b..01729de667 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -1,13 +1,15 @@
-import define from '../../define.js';
+import { Brackets } from 'typeorm';
import { UserProfiles, Users } from '@/models/index.js';
import { User } from '@/models/entities/user.js';
-import { Brackets } from 'typeorm';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Search for users.',
+
res: {
type: 'array',
optional: false, nullable: false,
@@ -25,7 +27,7 @@ export const paramDef = {
query: { type: 'string' },
offset: { type: 'integer', default: 0 },
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
- origin: { type: 'string', enum: ['local', 'remote', 'combined'], default: "combined" },
+ origin: { type: 'string', enum: ['local', 'remote', 'combined'], default: 'combined' },
detail: { type: 'boolean', default: true },
},
required: ['query'],
@@ -111,7 +113,7 @@ export default define(meta, paramDef, async (ps, me) => {
.orderBy('user.updatedAt', 'DESC', 'NULLS LAST')
.take(ps.limit)
.skip(ps.offset)
- .getMany()
+ .getMany(),
);
}
}
diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts
index 183ff1b8bb..846d83b49f 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -1,16 +1,18 @@
+import { FindOptionsWhere, In, IsNull } from 'typeorm';
import { resolveUser } from '@/remote/resolve-user.js';
+import { Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
import define from '../../define.js';
import { apiLogger } from '../../logger.js';
import { ApiError } from '../../error.js';
-import { Users } from '@/models/index.js';
-import { FindOptionsWhere, In, IsNull } from 'typeorm';
-import { User } from '@/models/entities/user.js';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Show the properties of a user.',
+
res: {
optional: false, nullable: false,
oneOf: [
diff --git a/packages/backend/src/server/api/endpoints/users/stats.ts b/packages/backend/src/server/api/endpoints/users/stats.ts
index d138019a72..47f322ee9b 100644
--- a/packages/backend/src/server/api/endpoints/users/stats.ts
+++ b/packages/backend/src/server/api/endpoints/users/stats.ts
@@ -1,12 +1,15 @@
+import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index.js';
+import { awaitAll } from '@/prelude/await-all.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { DriveFiles, Followings, NoteFavorites, NoteReactions, Notes, PageLikes, PollVotes, Users } from '@/models/index.js';
export const meta = {
tags: ['users'],
requireCredential: false,
+ description: 'Show statistics about a user.',
+
errors: {
noSuchUser: {
message: 'No such user.',
@@ -14,6 +17,94 @@ export const meta = {
id: '9e638e45-3b25-4ef7-8f95-07e8498f1819',
},
},
+
+ res: {
+ type: 'object',
+ optional: false, nullable: false,
+ properties: {
+ notesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ repliesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ renotesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ repliedCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ renotedCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ pollVotesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ pollVotedCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ localFollowingCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ remoteFollowingCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ localFollowersCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ remoteFollowersCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ followingCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ followersCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ sentReactionsCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ receivedReactionsCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ noteFavoritesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ pageLikesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ pageLikedCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ driveFilesCount: {
+ type: 'integer',
+ optional: false, nullable: false,
+ },
+ driveUsage: {
+ type: 'integer',
+ optional: false, nullable: false,
+ description: 'Drive usage in bytes',
+ },
+ },
+ },
} as const;
export const paramDef = {
@@ -31,109 +122,72 @@ export default define(meta, paramDef, async (ps, me) => {
throw new ApiError(meta.errors.noSuchUser);
}
- const [
- notesCount,
- repliesCount,
- renotesCount,
- repliedCount,
- renotedCount,
- pollVotesCount,
- pollVotedCount,
- localFollowingCount,
- remoteFollowingCount,
- localFollowersCount,
- remoteFollowersCount,
- sentReactionsCount,
- receivedReactionsCount,
- noteFavoritesCount,
- pageLikesCount,
- pageLikedCount,
- driveFilesCount,
- driveUsage,
- ] = await Promise.all([
- Notes.createQueryBuilder('note')
+ const result = await awaitAll({
+ notesCount: Notes.createQueryBuilder('note')
.where('note.userId = :userId', { userId: user.id })
.getCount(),
- Notes.createQueryBuilder('note')
+ repliesCount: Notes.createQueryBuilder('note')
.where('note.userId = :userId', { userId: user.id })
.andWhere('note.replyId IS NOT NULL')
.getCount(),
- Notes.createQueryBuilder('note')
+ renotesCount: Notes.createQueryBuilder('note')
.where('note.userId = :userId', { userId: user.id })
.andWhere('note.renoteId IS NOT NULL')
.getCount(),
- Notes.createQueryBuilder('note')
+ repliedCount: Notes.createQueryBuilder('note')
.where('note.replyUserId = :userId', { userId: user.id })
.getCount(),
- Notes.createQueryBuilder('note')
+ renotedCount: Notes.createQueryBuilder('note')
.where('note.renoteUserId = :userId', { userId: user.id })
.getCount(),
- PollVotes.createQueryBuilder('vote')
+ pollVotesCount: PollVotes.createQueryBuilder('vote')
.where('vote.userId = :userId', { userId: user.id })
.getCount(),
- PollVotes.createQueryBuilder('vote')
+ pollVotedCount: PollVotes.createQueryBuilder('vote')
.innerJoin('vote.note', 'note')
.where('note.userId = :userId', { userId: user.id })
.getCount(),
- Followings.createQueryBuilder('following')
+ localFollowingCount: Followings.createQueryBuilder('following')
.where('following.followerId = :userId', { userId: user.id })
.andWhere('following.followeeHost IS NULL')
.getCount(),
- Followings.createQueryBuilder('following')
+ remoteFollowingCount: Followings.createQueryBuilder('following')
.where('following.followerId = :userId', { userId: user.id })
.andWhere('following.followeeHost IS NOT NULL')
.getCount(),
- Followings.createQueryBuilder('following')
+ localFollowersCount: Followings.createQueryBuilder('following')
.where('following.followeeId = :userId', { userId: user.id })
.andWhere('following.followerHost IS NULL')
.getCount(),
- Followings.createQueryBuilder('following')
+ remoteFollowersCount: Followings.createQueryBuilder('following')
.where('following.followeeId = :userId', { userId: user.id })
.andWhere('following.followerHost IS NOT NULL')
.getCount(),
- NoteReactions.createQueryBuilder('reaction')
+ sentReactionsCount: NoteReactions.createQueryBuilder('reaction')
.where('reaction.userId = :userId', { userId: user.id })
.getCount(),
- NoteReactions.createQueryBuilder('reaction')
+ receivedReactionsCount: NoteReactions.createQueryBuilder('reaction')
.innerJoin('reaction.note', 'note')
.where('note.userId = :userId', { userId: user.id })
.getCount(),
- NoteFavorites.createQueryBuilder('favorite')
+ noteFavoritesCount: NoteFavorites.createQueryBuilder('favorite')
.where('favorite.userId = :userId', { userId: user.id })
.getCount(),
- PageLikes.createQueryBuilder('like')
+ pageLikesCount: PageLikes.createQueryBuilder('like')
.where('like.userId = :userId', { userId: user.id })
.getCount(),
- PageLikes.createQueryBuilder('like')
+ pageLikedCount: PageLikes.createQueryBuilder('like')
.innerJoin('like.page', 'page')
.where('page.userId = :userId', { userId: user.id })
.getCount(),
- DriveFiles.createQueryBuilder('file')
+ driveFilesCount: DriveFiles.createQueryBuilder('file')
.where('file.userId = :userId', { userId: user.id })
.getCount(),
- DriveFiles.calcDriveUsageOf(user),
- ]);
+ driveUsage: DriveFiles.calcDriveUsageOf(user),
+ });
+
+ result.followingCount = result.localFollowingCount + result.remoteFollowingCount;
+ result.followersCount = result.localFollowersCount + result.remoteFollowersCount;
- return {
- notesCount,
- repliesCount,
- renotesCount,
- repliedCount,
- renotedCount,
- pollVotesCount,
- pollVotedCount,
- localFollowingCount,
- remoteFollowingCount,
- localFollowersCount,
- remoteFollowersCount,
- followingCount: localFollowingCount + remoteFollowingCount,
- followersCount: localFollowersCount + remoteFollowersCount,
- sentReactionsCount,
- receivedReactionsCount,
- noteFavoritesCount,
- pageLikesCount,
- pageLikedCount,
- driveFilesCount,
- driveUsage,
- };
+ return result;
});