summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2022-07-07 21:23:03 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2022-07-07 21:23:03 +0900
commit84d984bd31fa9863c3fe2e1aeb672ad0e2e8de4b (patch)
treea182502a5192992d873e7a7fcbf01662bb0dfca2 /packages/backend/src/server/api/endpoints
parentMerge pull request #8821 from misskey-dev/develop (diff)
parent12.112.1 (diff)
downloadmisskey-84d984bd31fa9863c3fe2e1aeb672ad0e2e8de4b.tar.gz
misskey-84d984bd31fa9863c3fe2e1aeb672ad0e2e8de4b.tar.bz2
misskey-84d984bd31fa9863c3fe2e1aeb672ad0e2e8de4b.zip
Merge branch 'develop'
Diffstat (limited to 'packages/backend/src/server/api/endpoints')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/delete-account.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts47
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/files.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/admin/drive/show-file.ts7
-rw-r--r--packages/backend/src/server/api/endpoints/admin/get-user-ips.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/admin/meta.ts28
-rw-r--r--packages/backend/src/server/api/endpoints/admin/server-info.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-user.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/admin/show-users.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-meta.ts27
-rw-r--r--packages/backend/src/server/api/endpoints/admin/update-user-note.ts31
-rw-r--r--packages/backend/src/server/api/endpoints/announcements.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/ap/show.ts132
-rw-r--r--packages/backend/src/server/api/endpoints/charts/active-users.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/ap-request.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/drive.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/federation.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/hashtag.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/instance.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/notes.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/drive.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/following.ts3
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/notes.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/user/reactions.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/charts/users.ts5
-rw-r--r--packages/backend/src/server/api/endpoints/clips/remove-note.ts57
-rw-r--r--packages/backend/src/server/api/endpoints/drive.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/create.ts38
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/update.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/export-custom-emojis.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/federation/stats.ts65
-rw-r--r--packages/backend/src/server/api/endpoints/fetch-rss.ts39
-rw-r--r--packages/backend/src/server/api/endpoints/get-online-users-count.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/i.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/i/delete-account.ts20
-rw-r--r--packages/backend/src/server/api/endpoints/i/notifications.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/i/update.ts11
-rw-r--r--packages/backend/src/server/api/endpoints/meta.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/notes/children.ts22
-rw-r--r--packages/backend/src/server/api/endpoints/notes/clips.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/conversation.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/delete.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/create.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/favorites/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/featured.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/notes/global-timeline.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/notes/local-timeline.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/notes/mentions.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts23
-rw-r--r--packages/backend/src/server/api/endpoints/notes/polls/vote.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions.ts3
-rw-r--r--packages/backend/src/server/api/endpoints/notes/reactions/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/renotes.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/replies.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search-by-tag.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/notes/search.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/notes/show.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/state.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/timeline.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/notes/unrenote.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/create.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notes/watching/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/create.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/notifications/read.ts7
-rw-r--r--packages/backend/src/server/api/endpoints/page-push.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/pages/create.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/pages/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/pages/featured.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/pages/like.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/pages/unlike.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/pages/update.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/pinned-users.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/promo/read.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/request-reset-password.ts10
-rw-r--r--packages/backend/src/server/api/endpoints/reset-db.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/reset-password.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/stats.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/sw/register.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/sw/unregister.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/username/available.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users.ts16
-rw-r--r--packages/backend/src/server/api/endpoints/users/clips.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/followers.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/following.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/create.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/accept.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invitations/reject.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/invite.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/joined.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/leave.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/owned.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/pull.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/show.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/transfer.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/groups/update.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/create.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/delete.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/list.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/pull.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/push.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/show.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/lists/update.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/notes.ts12
-rw-r--r--packages/backend/src/server/api/endpoints/users/pages.ts4
-rw-r--r--packages/backend/src/server/api/endpoints/users/reactions.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/recommendation.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/relation.ts2
-rw-r--r--packages/backend/src/server/api/endpoints/users/report-abuse.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/search-by-username-and-host.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/search.ts8
-rw-r--r--packages/backend/src/server/api/endpoints/users/show.ts6
-rw-r--r--packages/backend/src/server/api/endpoints/users/stats.ts4
121 files changed, 760 insertions, 378 deletions
diff --git a/packages/backend/src/server/api/endpoints/admin/delete-account.ts b/packages/backend/src/server/api/endpoints/admin/delete-account.ts
new file mode 100644
index 0000000000..2d7ef2f236
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/delete-account.ts
@@ -0,0 +1,31 @@
+import { Users } from '@/models/index.js';
+import { deleteAccount } from '@/services/delete-account.js';
+import define from '../../define.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireAdmin: true,
+
+ res: {
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps) => {
+ const user = await Users.findOneByOrFail({ id: ps.userId });
+ if (user.isDeleted) {
+ return;
+ }
+
+ await deleteAccount(user);
+});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts b/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
new file mode 100644
index 0000000000..a4b29770e1
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/drive-capacity-override.ts
@@ -0,0 +1,47 @@
+import define from '../../define.js';
+import { Users } from '@/models/index.js';
+import { User } from '@/models/entities/user.js';
+import { insertModerationLog } from '@/services/insert-moderation-log.js';
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ overrideMb: { type: 'number', nullable: true },
+ },
+ required: ['userId', 'overrideMb'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+ const user = await Users.findOneBy({ id: ps.userId });
+
+ if (user == null) {
+ throw new Error('user not found');
+ }
+
+ if (!Users.isLocalUser(user)) {
+ throw new Error('user is not local user');
+ }
+
+ /*if (user.isAdmin) {
+ throw new Error('cannot suspend admin');
+ }
+ if (user.isModerator) {
+ throw new Error('cannot suspend moderator');
+ }*/
+
+ await Users.update(user.id, {
+ driveCapacityOverrideMb: ps.overrideMb,
+ });
+
+ insertModerationLog(me, 'change-drive-capacity-override', {
+ targetId: user.id,
+ });
+});
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/files.ts b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
index 119c4db19b..ba32aac431 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/files.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/files.ts
@@ -1,5 +1,5 @@
-import define from '../../../define.js';
import { DriveFiles } from '@/models/index.js';
+import define from '../../../define.js';
import { makePaginationQuery } from '../../../common/make-pagination-query.js';
export const meta = {
@@ -25,8 +25,9 @@ export const paramDef = {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
sinceId: { type: 'string', format: 'misskey:id' },
untilId: { type: 'string', format: 'misskey:id' },
+ userId: { type: 'string', format: 'misskey:id', nullable: true },
type: { type: 'string', nullable: true, pattern: /^[a-zA-Z0-9\/\-*]+$/.toString().slice(1, -1) },
- origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: 'local' },
hostname: {
type: 'string',
nullable: true,
@@ -41,14 +42,18 @@ export const paramDef = {
export default define(meta, paramDef, async (ps, me) => {
const query = makePaginationQuery(DriveFiles.createQueryBuilder('file'), ps.sinceId, ps.untilId);
- if (ps.origin === 'local') {
- query.andWhere('file.userHost IS NULL');
- } else if (ps.origin === 'remote') {
- query.andWhere('file.userHost IS NOT NULL');
- }
+ if (ps.userId) {
+ query.andWhere('file.userId = :userId', { userId: ps.userId });
+ } else {
+ if (ps.origin === 'local') {
+ query.andWhere('file.userHost IS NULL');
+ } else if (ps.origin === 'remote') {
+ query.andWhere('file.userHost IS NOT NULL');
+ }
- if (ps.hostname) {
- query.andWhere('file.userHost = :hostname', { hostname: ps.hostname });
+ if (ps.hostname) {
+ query.andWhere('file.userHost = :hostname', { hostname: ps.hostname });
+ }
}
if (ps.type) {
diff --git a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
index 039df74f1b..e9117a23c8 100644
--- a/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
+++ b/packages/backend/src/server/api/endpoints/admin/drive/show-file.ts
@@ -1,6 +1,6 @@
+import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
-import { DriveFiles } from '@/models/index.js';
export const meta = {
tags: ['admin'],
@@ -184,5 +184,10 @@ export default define(meta, paramDef, async (ps, me) => {
throw new ApiError(meta.errors.noSuchFile);
}
+ if (!me.isAdmin) {
+ delete file.requestIp;
+ delete file.requestHeaders;
+ }
+
return file;
});
diff --git a/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts b/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts
new file mode 100644
index 0000000000..e8b9cb3b09
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/get-user-ips.ts
@@ -0,0 +1,31 @@
+import { UserIps } from '@/models/index.js';
+import define from '../../define.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireAdmin: true,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['userId'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+ const ips = await UserIps.find({
+ where: { userId: ps.userId },
+ order: { createdAt: 'DESC' },
+ take: 30,
+ });
+
+ return ips.map(x => ({
+ ip: x.ip,
+ createdAt: x.createdAt.toISOString(),
+ }));
+});
diff --git a/packages/backend/src/server/api/endpoints/admin/meta.ts b/packages/backend/src/server/api/endpoints/admin/meta.ts
index 8d50486ef6..cb50e128af 100644
--- a/packages/backend/src/server/api/endpoints/admin/meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/meta.ts
@@ -1,7 +1,7 @@
import config from '@/config/index.js';
-import define from '../../define.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
+import define from '../../define.js';
export const meta = {
tags: ['meta'],
@@ -195,6 +195,22 @@ export const meta = {
type: 'string',
optional: true, nullable: true,
},
+ sensitiveMediaDetection: {
+ type: 'string',
+ optional: true, nullable: false,
+ },
+ sensitiveMediaDetectionSensitivity: {
+ type: 'string',
+ optional: true, nullable: false,
+ },
+ setSensitiveFlagAutomatically: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
+ enableSensitiveMediaDetectionForVideos: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
proxyAccountId: {
type: 'string',
optional: true, nullable: true,
@@ -304,6 +320,10 @@ export const meta = {
type: 'boolean',
optional: true, nullable: false,
},
+ enableIpLogging: {
+ type: 'boolean',
+ optional: true, nullable: false,
+ },
},
},
} as const;
@@ -360,13 +380,16 @@ export default define(meta, paramDef, async (ps, me) => {
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles,
-
useStarForReactionFallback: instance.useStarForReactionFallback,
pinnedUsers: instance.pinnedUsers,
hiddenTags: instance.hiddenTags,
blockedHosts: instance.blockedHosts,
hcaptchaSecretKey: instance.hcaptchaSecretKey,
recaptchaSecretKey: instance.recaptchaSecretKey,
+ sensitiveMediaDetection: instance.sensitiveMediaDetection,
+ sensitiveMediaDetectionSensitivity: instance.sensitiveMediaDetectionSensitivity,
+ setSensitiveFlagAutomatically: instance.setSensitiveFlagAutomatically,
+ enableSensitiveMediaDetectionForVideos: instance.enableSensitiveMediaDetectionForVideos,
proxyAccountId: instance.proxyAccountId,
twitterConsumerKey: instance.twitterConsumerKey,
twitterConsumerSecret: instance.twitterConsumerSecret,
@@ -397,5 +420,6 @@ export default define(meta, paramDef, async (ps, me) => {
objectStorageS3ForcePathStyle: instance.objectStorageS3ForcePathStyle,
deeplAuthKey: instance.deeplAuthKey,
deeplIsPro: instance.deeplIsPro,
+ enableIpLogging: instance.enableIpLogging,
};
});
diff --git a/packages/backend/src/server/api/endpoints/admin/server-info.ts b/packages/backend/src/server/api/endpoints/admin/server-info.ts
index 9c150420b1..85c6fb82e7 100644
--- a/packages/backend/src/server/api/endpoints/admin/server-info.ts
+++ b/packages/backend/src/server/api/endpoints/admin/server-info.ts
@@ -99,12 +99,16 @@ export default define(meta, paramDef, async () => {
const fsStats = await si.fsSize();
const netInterface = await si.networkInterfaceDefault();
+ const redisServerInfo = await redisClient.info('Server');
+ const m = redisServerInfo.match(new RegExp('^redis_version:(.*)', 'm'));
+ const redis_version = m?.[1];
+
return {
machine: os.hostname(),
os: os.platform(),
node: process.version,
psql: await db.query('SHOW server_version').then(x => x[0].server_version),
- redis: redisClient.server_info.redis_version,
+ redis: redis_version,
cpu: {
model: os.cpus()[0].model,
cores: os.cpus().length,
diff --git a/packages/backend/src/server/api/endpoints/admin/show-user.ts b/packages/backend/src/server/api/endpoints/admin/show-user.ts
index 78033aed58..0d866b3113 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-user.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-user.ts
@@ -25,7 +25,7 @@ export const paramDef = {
export default define(meta, paramDef, async (ps, me) => {
const [user, profile] = await Promise.all([
Users.findOneBy({ id: ps.userId }),
- UserProfiles.findOneBy({ userId: ps.userId })
+ UserProfiles.findOneBy({ userId: ps.userId }),
]);
if (user == null || profile == null) {
@@ -58,6 +58,7 @@ export default define(meta, paramDef, async (ps, me) => {
autoAcceptFollowed: profile.autoAcceptFollowed,
noCrawle: profile.noCrawle,
alwaysMarkNsfw: profile.alwaysMarkNsfw,
+ autoSensitive: profile.autoSensitive,
carefulBot: profile.carefulBot,
injectFeaturedNote: profile.injectFeaturedNote,
receiveAnnouncementEmail: profile.receiveAnnouncementEmail,
@@ -68,6 +69,8 @@ export default define(meta, paramDef, async (ps, me) => {
isModerator: user.isModerator,
isSilenced: user.isSilenced,
isSuspended: user.isSuspended,
+ lastActiveDate: user.lastActiveDate,
+ moderationNote: profile.moderationNote,
signins,
};
});
diff --git a/packages/backend/src/server/api/endpoints/admin/show-users.ts b/packages/backend/src/server/api/endpoints/admin/show-users.ts
index 1575d81d5d..8e09e72d5b 100644
--- a/packages/backend/src/server/api/endpoints/admin/show-users.ts
+++ b/packages/backend/src/server/api/endpoints/admin/show-users.ts
@@ -25,7 +25,7 @@ export const paramDef = {
offset: { type: 'integer', default: 0 },
sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
state: { type: 'string', enum: ['all', 'alive', 'available', 'admin', 'moderator', 'adminOrModerator', 'silenced', 'suspended'], default: 'all' },
- origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: 'local' },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: 'combined' },
username: { type: 'string', nullable: true, default: null },
hostname: {
type: 'string',
@@ -61,7 +61,7 @@ export default define(meta, paramDef, async (ps, me) => {
}
if (ps.hostname) {
- query.andWhere('user.host like :hostname', { hostname: '%' + ps.hostname.toLowerCase() + '%' });
+ query.andWhere('user.host = :hostname', { hostname: ps.hostname.toLowerCase() });
}
switch (ps.sort) {
diff --git a/packages/backend/src/server/api/endpoints/admin/update-meta.ts b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
index 09e43301b7..cc32e73c53 100644
--- a/packages/backend/src/server/api/endpoints/admin/update-meta.ts
+++ b/packages/backend/src/server/api/endpoints/admin/update-meta.ts
@@ -1,8 +1,8 @@
-import define from '../../define.js';
import { Meta } from '@/models/entities/meta.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js';
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
import { db } from '@/db/postgre.js';
+import define from '../../define.js';
export const meta = {
tags: ['admin'],
@@ -48,6 +48,10 @@ export const paramDef = {
enableRecaptcha: { type: 'boolean' },
recaptchaSiteKey: { type: 'string', nullable: true },
recaptchaSecretKey: { type: 'string', nullable: true },
+ sensitiveMediaDetection: { type: 'string', enum: ['none', 'all', 'local', 'remote'] },
+ sensitiveMediaDetectionSensitivity: { type: 'string', enum: ['medium', 'low', 'high', 'veryLow', 'veryHigh'] },
+ setSensitiveFlagAutomatically: { type: 'boolean' },
+ enableSensitiveMediaDetectionForVideos: { type: 'boolean' },
proxyAccountId: { type: 'string', format: 'misskey:id', nullable: true },
maintainerName: { type: 'string', nullable: true },
maintainerEmail: { type: 'string', nullable: true },
@@ -96,6 +100,7 @@ export const paramDef = {
objectStorageUseProxy: { type: 'boolean' },
objectStorageSetPublicRead: { type: 'boolean' },
objectStorageS3ForcePathStyle: { type: 'boolean' },
+ enableIpLogging: { type: 'boolean' },
},
required: [],
} as const;
@@ -212,6 +217,22 @@ export default define(meta, paramDef, async (ps, me) => {
set.recaptchaSecretKey = ps.recaptchaSecretKey;
}
+ if (ps.sensitiveMediaDetection !== undefined) {
+ set.sensitiveMediaDetection = ps.sensitiveMediaDetection;
+ }
+
+ if (ps.sensitiveMediaDetectionSensitivity !== undefined) {
+ set.sensitiveMediaDetectionSensitivity = ps.sensitiveMediaDetectionSensitivity;
+ }
+
+ if (ps.setSensitiveFlagAutomatically !== undefined) {
+ set.setSensitiveFlagAutomatically = ps.setSensitiveFlagAutomatically;
+ }
+
+ if (ps.enableSensitiveMediaDetectionForVideos !== undefined) {
+ set.enableSensitiveMediaDetectionForVideos = ps.enableSensitiveMediaDetectionForVideos;
+ }
+
if (ps.proxyAccountId !== undefined) {
set.proxyAccountId = ps.proxyAccountId;
}
@@ -396,6 +417,10 @@ export default define(meta, paramDef, async (ps, me) => {
set.deeplIsPro = ps.deeplIsPro;
}
+ if (ps.enableIpLogging !== undefined) {
+ set.enableIpLogging = ps.enableIpLogging;
+ }
+
await db.transaction(async transactionalEntityManager => {
const metas = await transactionalEntityManager.find(Meta, {
order: {
diff --git a/packages/backend/src/server/api/endpoints/admin/update-user-note.ts b/packages/backend/src/server/api/endpoints/admin/update-user-note.ts
new file mode 100644
index 0000000000..fa21ab7833
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/admin/update-user-note.ts
@@ -0,0 +1,31 @@
+import { UserProfiles, Users } from '@/models/index.js';
+import define from '../../define.js';
+
+export const meta = {
+ tags: ['admin'],
+
+ requireCredential: true,
+ requireModerator: true,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ userId: { type: 'string', format: 'misskey:id' },
+ text: { type: 'string' },
+ },
+ required: ['userId', 'text'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, me) => {
+ const user = await Users.findOneBy({ id: ps.userId });
+
+ if (user == null) {
+ throw new Error('user not found');
+ }
+
+ await UserProfiles.update({ userId: user.id }, {
+ moderationNote: ps.text,
+ });
+});
diff --git a/packages/backend/src/server/api/endpoints/announcements.ts b/packages/backend/src/server/api/endpoints/announcements.ts
index 222efdcef0..23cb93c9a5 100644
--- a/packages/backend/src/server/api/endpoints/announcements.ts
+++ b/packages/backend/src/server/api/endpoints/announcements.ts
@@ -1,5 +1,5 @@
-import define from '../define.js';
import { Announcements, AnnouncementReads } from '@/models/index.js';
+import define from '../define.js';
import { makePaginationQuery } from '../common/make-pagination-query.js';
export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/ap/show.ts b/packages/backend/src/server/api/endpoints/ap/show.ts
index 3c0c0642e3..6442a1412c 100644
--- a/packages/backend/src/server/api/endpoints/ap/show.ts
+++ b/packages/backend/src/server/api/endpoints/ap/show.ts
@@ -2,12 +2,13 @@ import define from '../../define.js';
import config from '@/config/index.js';
import { createPerson } from '@/remote/activitypub/models/person.js';
import { createNote } from '@/remote/activitypub/models/note.js';
+import DbResolver from '@/remote/activitypub/db-resolver.js';
import Resolver from '@/remote/activitypub/resolver.js';
import { ApiError } from '../../error.js';
import { extractDbHost } from '@/misc/convert-host.js';
import { Users, Notes } from '@/models/index.js';
import { Note } from '@/models/entities/note.js';
-import { User } from '@/models/entities/user.js';
+import { CacheableLocalUser, User } from '@/models/entities/user.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { isActor, isPost, getApId } from '@/remote/activitypub/type.js';
import ms from 'ms';
@@ -77,8 +78,8 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps) => {
- const object = await fetchAny(ps.uri);
+export default define(meta, paramDef, async (ps, me) => {
+ const object = await fetchAny(ps.uri, me);
if (object) {
return object;
} else {
@@ -89,48 +90,18 @@ export default define(meta, paramDef, async (ps) => {
/***
* URIからUserかNoteを解決する
*/
-async function fetchAny(uri: string): Promise<SchemaType<typeof meta['res']> | null> {
- // URIがこのサーバーを指しているなら、ローカルユーザーIDとしてDBからフェッチ
- if (uri.startsWith(config.url + '/')) {
- const parts = uri.split('/');
- const id = parts.pop();
- const type = parts.pop();
-
- if (type === 'notes') {
- const note = await Notes.findOneBy({ id });
-
- if (note) {
- return {
- type: 'Note',
- object: await Notes.pack(note, null, { detail: true }),
- };
- }
- } else if (type === 'users') {
- const user = await Users.findOneBy({ id });
-
- if (user) {
- return {
- type: 'User',
- object: await Users.pack(user, null, { detail: true }),
- };
- }
- }
- }
-
+async function fetchAny(uri: string, me: CacheableLocalUser | null | undefined): Promise<SchemaType<typeof meta['res']> | null> {
// ブロックしてたら中断
const fetchedMeta = await fetchMeta();
if (fetchedMeta.blockedHosts.includes(extractDbHost(uri))) return null;
- // URI(AP Object id)としてDB検索
- {
- const [user, note] = await Promise.all([
- Users.findOneBy({ uri: uri }),
- Notes.findOneBy({ uri: uri }),
- ]);
+ const dbResolver = new DbResolver();
- const packed = await mergePack(user, note);
- if (packed !== null) return packed;
- }
+ let local = await mergePack(me, ...await Promise.all([
+ dbResolver.getUserFromApId(uri),
+ dbResolver.getNoteFromApId(uri),
+ ]));
+ if (local != null) return local;
// リモートから一旦オブジェクトフェッチ
const resolver = new Resolver();
@@ -139,74 +110,37 @@ async function fetchAny(uri: string): Promise<SchemaType<typeof meta['res']> | n
// /@user のような正規id以外で取得できるURIが指定されていた場合、ここで初めて正規URIが確定する
// これはDBに存在する可能性があるため再度DB検索
if (uri !== object.id) {
- if (object.id.startsWith(config.url + '/')) {
- const parts = object.id.split('/');
- const id = parts.pop();
- const type = parts.pop();
-
- if (type === 'notes') {
- const note = await Notes.findOneBy({ id });
-
- if (note) {
- return {
- type: 'Note',
- object: await Notes.pack(note, null, { detail: true }),
- };
- }
- } else if (type === 'users') {
- const user = await Users.findOneBy({ id });
-
- if (user) {
- return {
- type: 'User',
- object: await Users.pack(user, null, { detail: true }),
- };
- }
- }
- }
-
- const [user, note] = await Promise.all([
- Users.findOneBy({ uri: object.id }),
- Notes.findOneBy({ uri: object.id }),
- ]);
-
- const packed = await mergePack(user, note);
- if (packed !== null) return packed;
- }
-
- // それでもみつからなければ新規であるため登録
- if (isActor(object)) {
- const user = await createPerson(getApId(object));
- return {
- type: 'User',
- object: await Users.pack(user, null, { detail: true }),
- };
- }
-
- if (isPost(object)) {
- const note = await createNote(getApId(object), undefined, true);
- return {
- type: 'Note',
- object: await Notes.pack(note!, null, { detail: true }),
- };
+ local = await mergePack(me, ...await Promise.all([
+ dbResolver.getUserFromApId(object.id),
+ dbResolver.getNoteFromApId(object.id),
+ ]));
+ if (local != null) return local;
}
- return null;
+ return await mergePack(
+ me,
+ isActor(object) ? await createPerson(getApId(object)) : null,
+ isPost(object) ? await createNote(getApId(object), undefined, true) : null,
+ );
}
-async function mergePack(user: User | null | undefined, note: Note | null | undefined): Promise<SchemaType<typeof meta.res> | null> {
+async function mergePack(me: CacheableLocalUser | null | undefined, user: User | null | undefined, note: Note | null | undefined): Promise<SchemaType<typeof meta.res> | null> {
if (user != null) {
return {
type: 'User',
- object: await Users.pack(user, null, { detail: true }),
+ object: await Users.pack(user, me, { detail: true }),
};
- }
+ } else if (note != null) {
+ try {
+ const object = await Notes.pack(note, me, { detail: true });
- if (note != null) {
- return {
- type: 'Note',
- object: await Notes.pack(note, null, { detail: true }),
- };
+ return {
+ type: 'Note',
+ object,
+ };
+ } catch (e) {
+ return null;
+ }
}
return null;
diff --git a/packages/backend/src/server/api/endpoints/charts/active-users.ts b/packages/backend/src/server/api/endpoints/charts/active-users.ts
index 97f7885dbe..ea23794296 100644
--- a/packages/backend/src/server/api/endpoints/charts/active-users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/active-users.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { activeUsersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'users'],
res: getJsonSchema(activeUsersChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/ap-request.ts b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
index 4477bfc987..06dee250ee 100644
--- a/packages/backend/src/server/api/endpoints/charts/ap-request.ts
+++ b/packages/backend/src/server/api/endpoints/charts/ap-request.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { apRequestChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(apRequestChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/drive.ts b/packages/backend/src/server/api/endpoints/charts/drive.ts
index fd6033392f..dd2c2d6838 100644
--- a/packages/backend/src/server/api/endpoints/charts/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/drive.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { driveChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'drive'],
res: getJsonSchema(driveChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/federation.ts b/packages/backend/src/server/api/endpoints/charts/federation.ts
index f842f574ec..8c35b3c46d 100644
--- a/packages/backend/src/server/api/endpoints/charts/federation.ts
+++ b/packages/backend/src/server/api/endpoints/charts/federation.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { federationChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(federationChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/hashtag.ts b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
index 01407defdd..77e24a62c3 100644
--- a/packages/backend/src/server/api/endpoints/charts/hashtag.ts
+++ b/packages/backend/src/server/api/endpoints/charts/hashtag.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { hashtagChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'hashtags'],
res: getJsonSchema(hashtagChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/instance.ts b/packages/backend/src/server/api/endpoints/charts/instance.ts
index 2d12951c6c..817d51ad01 100644
--- a/packages/backend/src/server/api/endpoints/charts/instance.ts
+++ b/packages/backend/src/server/api/endpoints/charts/instance.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { instanceChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts'],
res: getJsonSchema(instanceChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/notes.ts b/packages/backend/src/server/api/endpoints/charts/notes.ts
index b6089f67ef..951adf5408 100644
--- a/packages/backend/src/server/api/endpoints/charts/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/notes.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { notesChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'notes'],
res: getJsonSchema(notesChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/drive.ts b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
index e5db7131a8..f165b40224 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/drive.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/drive.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserDriveChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'drive', 'users'],
res: getJsonSchema(perUserDriveChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/following.ts b/packages/backend/src/server/api/endpoints/charts/user/following.ts
index 9b72de745d..f5d42e21c2 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/following.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/following.ts
@@ -6,6 +6,9 @@ export const meta = {
tags: ['charts', 'users', 'following'],
res: getJsonSchema(perUserFollowingChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/notes.ts b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
index 7cc6cbf316..aefe550d43 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/notes.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/notes.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserNotesChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'users', 'notes'],
res: getJsonSchema(perUserNotesChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
index 5c58a7f152..6bc6b56bf0 100644
--- a/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/charts/user/reactions.ts
@@ -1,11 +1,14 @@
-import define from '../../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { perUserReactionsChart } from '@/services/chart/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['charts', 'users', 'reactions'],
res: getJsonSchema(perUserReactionsChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/charts/users.ts b/packages/backend/src/server/api/endpoints/charts/users.ts
index 49c762b2e4..338e8fd338 100644
--- a/packages/backend/src/server/api/endpoints/charts/users.ts
+++ b/packages/backend/src/server/api/endpoints/charts/users.ts
@@ -1,11 +1,14 @@
-import define from '../../define.js';
import { getJsonSchema } from '@/services/chart/core.js';
import { usersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['charts', 'users'],
res: getJsonSchema(usersChart.schema),
+
+ allowGet: true,
+ cacheSec: 60 * 60,
} as const;
export const paramDef = {
diff --git a/packages/backend/src/server/api/endpoints/clips/remove-note.ts b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
new file mode 100644
index 0000000000..8b90e31f65
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/clips/remove-note.ts
@@ -0,0 +1,57 @@
+import define from '../../define.js';
+import { ClipNotes, Clips } from '@/models/index.js';
+import { ApiError } from '../../error.js';
+import { getNote } from '../../common/getters.js';
+
+export const meta = {
+ tags: ['account', 'notes', 'clips'],
+
+ requireCredential: true,
+
+ kind: 'write:account',
+
+ errors: {
+ noSuchClip: {
+ message: 'No such clip.',
+ code: 'NO_SUCH_CLIP',
+ id: 'b80525c6-97f7-49d7-a42d-ebccd49cfd52',
+ },
+
+ noSuchNote: {
+ message: 'No such note.',
+ code: 'NO_SUCH_NOTE',
+ id: 'aff017de-190e-434b-893e-33a9ff5049d8',
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ clipId: { type: 'string', format: 'misskey:id' },
+ noteId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['clipId', 'noteId'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps, user) => {
+ const clip = await Clips.findOneBy({
+ id: ps.clipId,
+ userId: user.id,
+ });
+
+ if (clip == null) {
+ throw new ApiError(meta.errors.noSuchClip);
+ }
+
+ const note = await getNote(ps.noteId).catch(e => {
+ if (e.id === '9725d0ce-ba28-4dde-95a7-2cbb2c15de24') throw new ApiError(meta.errors.noSuchNote);
+ throw e;
+ });
+
+ await ClipNotes.delete({
+ noteId: note.id,
+ clipId: clip.id,
+ });
+});
diff --git a/packages/backend/src/server/api/endpoints/drive.ts b/packages/backend/src/server/api/endpoints/drive.ts
index c599d96ca4..82497adefa 100644
--- a/packages/backend/src/server/api/endpoints/drive.ts
+++ b/packages/backend/src/server/api/endpoints/drive.ts
@@ -1,6 +1,6 @@
-import define from '../define.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { DriveFiles } from '@/models/index.js';
+import define from '../define.js';
export const meta = {
tags: ['drive', 'account'],
@@ -39,7 +39,7 @@ export default define(meta, paramDef, async (ps, user) => {
const usage = await DriveFiles.calcDriveUsageOf(user.id);
return {
- capacity: 1024 * 1024 * instance.localDriveCapacityMb,
+ capacity: 1024 * 1024 * (user.driveCapacityOverrideMb || instance.localDriveCapacityMb),
usage: usage,
};
});
diff --git a/packages/backend/src/server/api/endpoints/drive/files/create.ts b/packages/backend/src/server/api/endpoints/drive/files/create.ts
index 7397fd9ce9..ddcbd62889 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/create.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/create.ts
@@ -1,10 +1,12 @@
import ms from 'ms';
import { addFile } from '@/services/drive/add-file.js';
+import { DriveFiles } from '@/models/index.js';
+import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
+import { IdentifiableError } from '@/misc/identifiable-error.js';
+import { fetchMeta } from '@/misc/fetch-meta.js';
import define from '../../../define.js';
import { apiLogger } from '../../../logger.js';
import { ApiError } from '../../../error.js';
-import { DriveFiles } from '@/models/index.js';
-import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
export const meta = {
tags: ['drive'],
@@ -34,6 +36,18 @@ export const meta = {
code: 'INVALID_FILE_NAME',
id: 'f449b209-0c60-4e51-84d5-29486263bfd4',
},
+
+ inappropriate: {
+ message: 'Cannot upload the file because it has been determined that it possibly contains inappropriate content.',
+ code: 'INAPPROPRIATE',
+ id: 'bec5bd69-fba3-43c9-b4fb-2894b66ad5d2',
+ },
+
+ noFreeSpace: {
+ message: 'Cannot upload the file because you have no free space of drive.',
+ code: 'NO_FREE_SPACE',
+ id: 'd08dbc37-a6a9-463a-8c47-96c32ab5f064',
+ },
},
} as const;
@@ -50,7 +64,7 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
+export default define(meta, paramDef, async (ps, user, _, file, cleanup, ip, headers) => {
// Get 'name' parameter
let name = ps.name || file.originalname;
if (name !== undefined && name !== null) {
@@ -66,14 +80,30 @@ export default define(meta, paramDef, async (ps, user, _, file, cleanup) => {
name = null;
}
+ const meta = await fetchMeta();
+
try {
// Create file
- const driveFile = await addFile({ user, path: file.path, name, comment: ps.comment, folderId: ps.folderId, force: ps.force, sensitive: ps.isSensitive });
+ const driveFile = await addFile({
+ user,
+ path: file.path,
+ name,
+ comment: ps.comment,
+ folderId: ps.folderId,
+ force: ps.force,
+ sensitive: ps.isSensitive,
+ requestIp: meta.enableIpLogging ? ip : null,
+ requestHeaders: meta.enableIpLogging ? headers : null,
+ });
return await DriveFiles.pack(driveFile, { self: true });
} catch (e) {
if (e instanceof Error || typeof e === 'string') {
apiLogger.error(e);
}
+ if (e instanceof IdentifiableError) {
+ if (e.id === '282f77bf-5816-4f72-9264-aa14d8261a21') throw new ApiError(meta.errors.inappropriate);
+ if (e.id === 'c6244ed2-a39a-4e1c-bf93-f0fbd7764fa6') throw new ApiError(meta.errors.noFreeSpace);
+ }
throw new ApiError();
} finally {
cleanup!();
diff --git a/packages/backend/src/server/api/endpoints/drive/files/update.ts b/packages/backend/src/server/api/endpoints/drive/files/update.ts
index e3debe0b4f..fa2ec8519c 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/update.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/update.ts
@@ -1,8 +1,8 @@
import { publishDriveStream } from '@/services/stream.js';
-import define from '../../../define.js';
-import { ApiError } from '../../../error.js';
import { DriveFiles, DriveFolders, Users } from '@/models/index.js';
import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
+import define from '../../../define.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['drive'],
diff --git a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
index 53f2298f21..eb8071c3c9 100644
--- a/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
+++ b/packages/backend/src/server/api/endpoints/drive/files/upload-from-url.ts
@@ -1,9 +1,9 @@
import ms from 'ms';
import { uploadFromUrl } from '@/services/drive/upload-from-url.js';
-import define from '../../../define.js';
import { DriveFiles } from '@/models/index.js';
import { publishMainStream } from '@/services/stream.js';
import { DB_MAX_IMAGE_COMMENT_LENGTH } from '@/misc/hard-limits.js';
+import define from '../../../define.js';
export const meta = {
tags: ['drive'],
@@ -34,8 +34,8 @@ export const paramDef = {
} as const;
// eslint-disable-next-line import/no-default-export
-export default define(meta, paramDef, async (ps, user) => {
- uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment }).then(file => {
+export default define(meta, paramDef, async (ps, user, _1, _2, _3, ip, headers) => {
+ uploadFromUrl({ url: ps.url, user, folderId: ps.folderId, sensitive: ps.isSensitive, force: ps.force, comment: ps.comment, requestIp: ip, requestHeaders: headers }).then(file => {
DriveFiles.pack(file, { self: true }).then(packedFile => {
publishMainStream(user.id, 'urlUploadFinished', {
marker: ps.marker,
diff --git a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
index bc8d2e2ac0..5fe622932d 100644
--- a/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
+++ b/packages/backend/src/server/api/endpoints/export-custom-emojis.ts
@@ -1,6 +1,6 @@
-import define from '../define.js';
-import { createExportCustomEmojisJob } from '@/queue/index.js';
import ms from 'ms';
+import { createExportCustomEmojisJob } from '@/queue/index.js';
+import define from '../define.js';
export const meta = {
secure: true,
diff --git a/packages/backend/src/server/api/endpoints/federation/stats.ts b/packages/backend/src/server/api/endpoints/federation/stats.ts
new file mode 100644
index 0000000000..e02c7b97e0
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/federation/stats.ts
@@ -0,0 +1,65 @@
+import { IsNull, MoreThan, Not } from 'typeorm';
+import { Followings, Instances } from '@/models/index.js';
+import { awaitAll } from '@/prelude/await-all.js';
+import define from '../../define.js';
+
+export const meta = {
+ tags: ['federation'],
+
+ requireCredential: false,
+
+ allowGet: true,
+ cacheSec: 60 * 60,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ },
+ required: [],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps) => {
+ const [topSubInstances, topPubInstances, allSubCount, allPubCount] = await Promise.all([
+ Instances.find({
+ where: {
+ followersCount: MoreThan(0),
+ },
+ order: {
+ followersCount: 'DESC',
+ },
+ take: ps.limit,
+ }),
+ Instances.find({
+ where: {
+ followingCount: MoreThan(0),
+ },
+ order: {
+ followingCount: 'DESC',
+ },
+ take: ps.limit,
+ }),
+ Followings.count({
+ where: {
+ followeeHost: Not(IsNull()),
+ },
+ }),
+ Followings.count({
+ where: {
+ followerHost: Not(IsNull()),
+ },
+ }),
+ ]);
+
+ const gotSubCount = topSubInstances.map(x => x.followersCount).reduce((a, b) => a + b, 0);
+ const gotPubCount = topPubInstances.map(x => x.followingCount).reduce((a, b) => a + b, 0);
+
+ return await awaitAll({
+ topSubInstances: Instances.packMany(topSubInstances),
+ otherFollowersCount: Math.max(0, allSubCount - gotSubCount),
+ topPubInstances: Instances.packMany(topPubInstances),
+ otherFollowingCount: Math.max(0, allPubCount - gotPubCount),
+ });
+});
diff --git a/packages/backend/src/server/api/endpoints/fetch-rss.ts b/packages/backend/src/server/api/endpoints/fetch-rss.ts
new file mode 100644
index 0000000000..05fa22a9e4
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/fetch-rss.ts
@@ -0,0 +1,39 @@
+import Parser from 'rss-parser';
+import { getResponse } from '@/misc/fetch.js';
+import config from '@/config/index.js';
+import define from '../define.js';
+
+const rssParser = new Parser();
+
+export const meta = {
+ tags: ['meta'],
+
+ requireCredential: false,
+ allowGet: true,
+ cacheSec: 60 * 3,
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ url: { type: 'string' },
+ },
+ required: ['url'],
+} as const;
+
+// eslint-disable-next-line import/no-default-export
+export default define(meta, paramDef, async (ps) => {
+ const res = await getResponse({
+ url: ps.url,
+ method: 'GET',
+ headers: Object.assign({
+ 'User-Agent': config.userAgent,
+ Accept: 'application/rss+xml, */*',
+ }),
+ timeout: 5000,
+ });
+
+ const text = await res.text();
+
+ return rssParser.parseString(text);
+});
diff --git a/packages/backend/src/server/api/endpoints/get-online-users-count.ts b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
index b0c1225bee..56c5502978 100644
--- a/packages/backend/src/server/api/endpoints/get-online-users-count.ts
+++ b/packages/backend/src/server/api/endpoints/get-online-users-count.ts
@@ -1,6 +1,6 @@
+import { MoreThan } from 'typeorm';
import { USER_ONLINE_THRESHOLD } from '@/const.js';
import { Users } from '@/models/index.js';
-import { MoreThan } from 'typeorm';
import define from '../define.js';
export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/i.ts b/packages/backend/src/server/api/endpoints/i.ts
index 5b1ad2b098..22aedfeee8 100644
--- a/packages/backend/src/server/api/endpoints/i.ts
+++ b/packages/backend/src/server/api/endpoints/i.ts
@@ -1,5 +1,5 @@
-import define from '../define.js';
import { Users } from '@/models/index.js';
+import define from '../define.js';
export const meta = {
tags: ['account'],
diff --git a/packages/backend/src/server/api/endpoints/i/delete-account.ts b/packages/backend/src/server/api/endpoints/i/delete-account.ts
index 184005eb53..ede4a9d03b 100644
--- a/packages/backend/src/server/api/endpoints/i/delete-account.ts
+++ b/packages/backend/src/server/api/endpoints/i/delete-account.ts
@@ -1,9 +1,7 @@
import bcrypt from 'bcryptjs';
-import define from '../../define.js';
import { UserProfiles, Users } from '@/models/index.js';
-import { doPostSuspend } from '@/services/suspend-user.js';
-import { publishUserEvent } from '@/services/stream.js';
-import { createDeleteAccountJob } from '@/queue/index.js';
+import { deleteAccount } from '@/services/delete-account.js';
+import define from '../../define.js';
export const meta = {
requireCredential: true,
@@ -34,17 +32,5 @@ export default define(meta, paramDef, async (ps, user) => {
throw new Error('incorrect password');
}
- // 物理削除する前にDelete activityを送信する
- await doPostSuspend(user).catch(e => {});
-
- createDeleteAccountJob(user, {
- soft: false,
- });
-
- await Users.update(user.id, {
- isDeleted: true,
- });
-
- // Terminate streaming
- publishUserEvent(user.id, 'terminate', {});
+ await deleteAccount(user);
});
diff --git a/packages/backend/src/server/api/endpoints/i/notifications.ts b/packages/backend/src/server/api/endpoints/i/notifications.ts
index 6ea8cb3574..a2249803ee 100644
--- a/packages/backend/src/server/api/endpoints/i/notifications.ts
+++ b/packages/backend/src/server/api/endpoints/i/notifications.ts
@@ -1,17 +1,21 @@
+import { Brackets } from 'typeorm';
+import { Notifications, Followings, Mutings, Users, UserProfiles } from '@/models/index.js';
+import { notificationTypes } from '@/types.js';
+import read from '@/services/note/read.js';
import { readNotification } from '../../common/read-notification.js';
import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { generateMutedInstanceNotificationQuery } from '../../common/generate-muted-instance-query.js';
-import { Notifications, Followings, Mutings, Users } from '@/models/index.js';
-import { notificationTypes } from '@/types.js';
-import read from '@/services/note/read.js';
-import { Brackets } from 'typeorm';
export const meta = {
tags: ['account', 'notifications'],
requireCredential: true,
+ limit: {
+ duration: 60000,
+ max: 10,
+ },
+
kind: 'read:notifications',
res: {
@@ -62,12 +66,16 @@ export default define(meta, paramDef, async (ps, user) => {
.select('muting.muteeId')
.where('muting.muterId = :muterId', { muterId: user.id });
+ const mutingInstanceQuery = UserProfiles.createQueryBuilder('user_profile')
+ .select('user_profile.mutedInstances')
+ .where('user_profile.userId = :muterId', { muterId: user.id });
+
const suspendedQuery = Users.createQueryBuilder('users')
.select('users.id')
.where('users.isSuspended = TRUE');
const query = makePaginationQuery(Notifications.createQueryBuilder('notification'), ps.sinceId, ps.untilId)
- .andWhere(`notification.notifieeId = :meId`, { meId: user.id })
+ .andWhere('notification.notifieeId = :meId', { meId: user.id })
.leftJoinAndSelect('notification.notifier', 'notifier')
.leftJoinAndSelect('notification.note', 'note')
.leftJoinAndSelect('notifier.avatar', 'notifierAvatar')
@@ -84,14 +92,21 @@ export default define(meta, paramDef, async (ps, user) => {
.leftJoinAndSelect('renoteUser.avatar', 'renoteUserAvatar')
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
+ // muted users
query.andWhere(new Brackets(qb => { qb
.where(`notification.notifierId NOT IN (${ mutingQuery.getQuery() })`)
.orWhere('notification.notifierId IS NULL');
}));
query.setParameters(mutingQuery.getParameters());
- generateMutedInstanceNotificationQuery(query, user);
+ // muted instances
+ query.andWhere(new Brackets(qb => { qb
+ .andWhere('notifier.host IS NULL')
+ .orWhere(`NOT (( ${mutingInstanceQuery.getQuery()} )::jsonb ? notifier.host)`);
+ }));
+ query.setParameters(mutingInstanceQuery.getParameters());
+ // suspended users
query.andWhere(new Brackets(qb => { qb
.where(`notification.notifierId NOT IN (${ suspendedQuery.getQuery() })`)
.orWhere('notification.notifierId IS NULL');
@@ -103,13 +118,13 @@ export default define(meta, paramDef, async (ps, user) => {
}
if (ps.includeTypes && ps.includeTypes.length > 0) {
- query.andWhere(`notification.type IN (:...includeTypes)`, { includeTypes: ps.includeTypes });
+ query.andWhere('notification.type IN (:...includeTypes)', { includeTypes: ps.includeTypes });
} else if (ps.excludeTypes && ps.excludeTypes.length > 0) {
- query.andWhere(`notification.type NOT IN (:...excludeTypes)`, { excludeTypes: ps.excludeTypes });
+ query.andWhere('notification.type NOT IN (:...excludeTypes)', { excludeTypes: ps.excludeTypes });
}
if (ps.unreadOnly) {
- query.andWhere(`notification.isRead = false`);
+ query.andWhere('notification.isRead = false');
}
const notifications = await query.take(ps.limit).getMany();
diff --git a/packages/backend/src/server/api/endpoints/i/update.ts b/packages/backend/src/server/api/endpoints/i/update.ts
index b2964e68c7..122120f275 100644
--- a/packages/backend/src/server/api/endpoints/i/update.ts
+++ b/packages/backend/src/server/api/endpoints/i/update.ts
@@ -3,17 +3,17 @@ import * as mfm from 'mfm-js';
import { publishMainStream, publishUserEvent } from '@/services/stream.js';
import acceptAllFollowRequests from '@/services/following/requests/accept-all.js';
import { publishToFollowers } from '@/services/i/update.js';
-import define from '../../define.js';
import { extractCustomEmojisFromMfm } from '@/misc/extract-custom-emojis-from-mfm.js';
import { extractHashtags } from '@/misc/extract-hashtags.js';
import { updateUsertags } from '@/services/update-hashtag.js';
-import { ApiError } from '../../error.js';
import { Users, DriveFiles, UserProfiles, Pages } from '@/models/index.js';
import { User } from '@/models/entities/user.js';
import { UserProfile } from '@/models/entities/user-profile.js';
import { notificationTypes } from '@/types.js';
import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import { langmap } from '@/misc/langmap.js';
+import { ApiError } from '../../error.js';
+import define from '../../define.js';
export const meta = {
tags: ['account'],
@@ -57,7 +57,7 @@ export const meta = {
message: 'Invalid Regular Expression.',
code: 'INVALID_REGEXP',
id: '0d786918-10df-41cd-8f33-8dec7d9a89a5',
- }
+ },
},
res: {
@@ -77,7 +77,8 @@ export const paramDef = {
lang: { type: 'string', enum: [null, ...Object.keys(langmap)], nullable: true },
avatarId: { type: 'string', format: 'misskey:id', nullable: true },
bannerId: { type: 'string', format: 'misskey:id', nullable: true },
- fields: { type: 'array',
+ fields: {
+ type: 'array',
minItems: 0,
maxItems: 16,
items: {
@@ -102,6 +103,7 @@ export const paramDef = {
injectFeaturedNote: { type: 'boolean' },
receiveAnnouncementEmail: { type: 'boolean' },
alwaysMarkNsfw: { type: 'boolean' },
+ autoSensitive: { type: 'boolean' },
ffVisibility: { type: 'string', enum: ['public', 'followers', 'private'] },
pinnedPageId: { type: 'array', items: {
type: 'string', format: 'misskey:id',
@@ -168,6 +170,7 @@ export default define(meta, paramDef, async (ps, _user, token) => {
if (typeof ps.injectFeaturedNote === 'boolean') profileUpdates.injectFeaturedNote = ps.injectFeaturedNote;
if (typeof ps.receiveAnnouncementEmail === 'boolean') profileUpdates.receiveAnnouncementEmail = ps.receiveAnnouncementEmail;
if (typeof ps.alwaysMarkNsfw === 'boolean') profileUpdates.alwaysMarkNsfw = ps.alwaysMarkNsfw;
+ if (typeof ps.autoSensitive === 'boolean') profileUpdates.autoSensitive = ps.autoSensitive;
if (ps.emailNotificationTypes !== undefined) profileUpdates.emailNotificationTypes = ps.emailNotificationTypes;
if (ps.avatarId) {
diff --git a/packages/backend/src/server/api/endpoints/meta.ts b/packages/backend/src/server/api/endpoints/meta.ts
index e1ae282a97..5b624842c3 100644
--- a/packages/backend/src/server/api/endpoints/meta.ts
+++ b/packages/backend/src/server/api/endpoints/meta.ts
@@ -1,10 +1,10 @@
+import { IsNull, MoreThan } from 'typeorm';
import config from '@/config/index.js';
-import define from '../define.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { Ads, Emojis, Users } from '@/models/index.js';
import { DB_MAX_NOTE_TEXT_LENGTH } from '@/misc/hard-limits.js';
-import { IsNull, MoreThan } from 'typeorm';
import { MAX_NOTE_TEXT_LENGTH } from '@/const.js';
+import define from '../define.js';
export const meta = {
tags: ['meta'],
diff --git a/packages/backend/src/server/api/endpoints/notes.ts b/packages/backend/src/server/api/endpoints/notes.ts
index 2733c826e9..015b0338e3 100644
--- a/packages/backend/src/server/api/endpoints/notes.ts
+++ b/packages/backend/src/server/api/endpoints/notes.ts
@@ -1,6 +1,6 @@
+import { Notes } from '@/models/index.js';
import define from '../define.js';
import { makePaginationQuery } from '../common/make-pagination-query.js';
-import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
@@ -34,8 +34,8 @@ export const paramDef = {
// eslint-disable-next-line import/no-default-export
export default define(meta, paramDef, async (ps) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
- .andWhere(`note.visibility = 'public'`)
- .andWhere(`note.localOnly = FALSE`)
+ .andWhere('note.visibility = \'public\'')
+ .andWhere('note.localOnly = FALSE')
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
.leftJoinAndSelect('user.banner', 'banner')
@@ -61,7 +61,7 @@ export default define(meta, paramDef, async (ps) => {
}
if (ps.withFiles !== undefined) {
- query.andWhere(ps.withFiles ? `note.fileIds != '{}'` : `note.fileIds = '{}'`);
+ query.andWhere(ps.withFiles ? 'note.fileIds != \'{}\'' : 'note.fileIds = \'{}\'');
}
if (ps.poll !== undefined) {
diff --git a/packages/backend/src/server/api/endpoints/notes/children.ts b/packages/backend/src/server/api/endpoints/notes/children.ts
index 86dde30d64..efc109105c 100644
--- a/packages/backend/src/server/api/endpoints/notes/children.ts
+++ b/packages/backend/src/server/api/endpoints/notes/children.ts
@@ -1,11 +1,10 @@
+import { Brackets } from 'typeorm';
+import { Notes } 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 { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { Brackets } from 'typeorm';
-import { Notes } from '@/models/index.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
export const meta = {
tags: ['notes'],
@@ -38,13 +37,13 @@ export const paramDef = {
export default define(meta, paramDef, async (ps, user) => {
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
.andWhere(new Brackets(qb => { qb
- .where(`note.replyId = :noteId`, { noteId: ps.noteId })
+ .where('note.replyId = :noteId', { noteId: ps.noteId })
.orWhere(new Brackets(qb => { qb
- .where(`note.renoteId = :noteId`, { noteId: ps.noteId })
+ .where('note.renoteId = :noteId', { noteId: ps.noteId })
.andWhere(new Brackets(qb => { qb
- .where(`note.text IS NOT NULL`)
- .orWhere(`note.fileIds != '{}'`)
- .orWhere(`note.hasPoll = TRUE`);
+ .where('note.text IS NOT NULL')
+ .orWhere('note.fileIds != \'{}\'')
+ .orWhere('note.hasPoll = TRUE');
}));
}));
}))
@@ -61,9 +60,10 @@ export default define(meta, paramDef, async (ps, user) => {
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, user);
- if (user) generateMutedUserQuery(query, user);
- if (user) generateBlockedUserQuery(query, user);
- if (user) generateMutedInstanceQuery(query, user);
+ if (user) {
+ generateMutedUserQuery(query, user);
+ generateBlockedUserQuery(query, user);
+ }
const notes = await query.take(ps.limit).getMany();
diff --git a/packages/backend/src/server/api/endpoints/notes/clips.ts b/packages/backend/src/server/api/endpoints/notes/clips.ts
index 8683a7f75a..e79f8563e8 100644
--- a/packages/backend/src/server/api/endpoints/notes/clips.ts
+++ b/packages/backend/src/server/api/endpoints/notes/clips.ts
@@ -1,8 +1,8 @@
-import define from '../../define.js';
+import { In } from 'typeorm';
import { ClipNotes, Clips } from '@/models/index.js';
+import define from '../../define.js';
import { getNote } from '../../common/getters.js';
import { ApiError } from '../../error.js';
-import { In } from 'typeorm';
export const meta = {
tags: ['clips', 'notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/conversation.ts b/packages/backend/src/server/api/endpoints/notes/conversation.ts
index b991a495f2..b731d18248 100644
--- a/packages/backend/src/server/api/endpoints/notes/conversation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/conversation.ts
@@ -1,8 +1,8 @@
+import { Note } from '@/models/entities/note.js';
+import { Notes } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import { getNote } from '../../common/getters.js';
-import { Note } from '@/models/entities/note.js';
-import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/delete.ts b/packages/backend/src/server/api/endpoints/notes/delete.ts
index 804e146fa4..c23ceeb5bf 100644
--- a/packages/backend/src/server/api/endpoints/notes/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/delete.ts
@@ -1,9 +1,9 @@
+import ms from 'ms';
import deleteNote from '@/services/note/delete.js';
+import { Users } from '@/models/index.js';
import define from '../../define.js';
-import ms from 'ms';
import { getNote } from '../../common/getters.js';
import { ApiError } from '../../error.js';
-import { Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
index 41dc5ac8e1..097371a425 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/create.ts
@@ -1,8 +1,8 @@
+import { NoteFavorites } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getNote } from '../../../common/getters.js';
-import { NoteFavorites } from '@/models/index.js';
-import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes', 'favorites'],
diff --git a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
index a48f7a0aa8..82ef4fa197 100644
--- a/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/favorites/delete.ts
@@ -1,7 +1,7 @@
+import { NoteFavorites } from '@/models/index.js';
import define from '../../../define.js';
import { ApiError } from '../../../error.js';
import { getNote } from '../../../common/getters.js';
-import { NoteFavorites } from '@/models/index.js';
export const meta = {
tags: ['notes', 'favorites'],
diff --git a/packages/backend/src/server/api/endpoints/notes/featured.ts b/packages/backend/src/server/api/endpoints/notes/featured.ts
index 6308d23696..dd9cc581aa 100644
--- a/packages/backend/src/server/api/endpoints/notes/featured.ts
+++ b/packages/backend/src/server/api/endpoints/notes/featured.ts
@@ -1,6 +1,6 @@
+import { Notes } from '@/models/index.js';
import define from '../../define.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { Notes } from '@/models/index.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
@@ -36,9 +36,9 @@ export default define(meta, paramDef, async (ps, user) => {
const query = Notes.createQueryBuilder('note')
.addSelect('note.score')
.where('note.userHost IS NULL')
- .andWhere(`note.score > 0`)
- .andWhere(`note.createdAt > :date`, { date: new Date(Date.now() - day) })
- .andWhere(`note.visibility = 'public'`)
+ .andWhere('note.score > 0')
+ .andWhere('note.createdAt > :date', { date: new Date(Date.now() - day) })
+ .andWhere('note.visibility = \'public\'')
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
.leftJoinAndSelect('user.banner', 'banner')
diff --git a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
index cb402ecaa1..925318f544 100644
--- a/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/global-timeline.ts
@@ -1,11 +1,10 @@
-import define from '../../define.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Notes } from '@/models/index.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
import { ApiError } from '../../error.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Notes, Users } from '@/models/index.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
-import { activeUsersChart } from '@/services/chart/index.js';
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
@@ -60,7 +59,7 @@ export default define(meta, paramDef, async (ps, user) => {
//#region Construct query
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
- ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('note.visibility = \'public\'')
.andWhere('note.channelId IS NULL')
.innerJoinAndSelect('note.user', 'user')
@@ -76,10 +75,11 @@ export default define(meta, paramDef, async (ps, user) => {
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateRepliesQuery(query, user);
- if (user) generateMutedUserQuery(query, user);
- if (user) generateMutedNoteQuery(query, user);
- if (user) generateBlockedUserQuery(query, user);
- if (user) generateMutedInstanceQuery(query, user);
+ if (user) {
+ generateMutedUserQuery(query, user);
+ generateMutedNoteQuery(query, user);
+ generateBlockedUserQuery(query, user);
+ }
if (ps.withFiles) {
query.andWhere('note.fileIds != \'{}\'');
diff --git a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
index f9893527e0..2dc98c4c9f 100644
--- a/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/hybrid-timeline.ts
@@ -1,13 +1,12 @@
-import define from '../../define.js';
+import { Brackets } from 'typeorm';
import { fetchMeta } from '@/misc/fetch-meta.js';
+import { Followings, Notes } from '@/models/index.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
import { ApiError } from '../../error.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Followings, Notes, Users } from '@/models/index.js';
-import { Brackets } from 'typeorm';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
-import { activeUsersChart } from '@/services/chart/index.js';
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
import { generateChannelQuery } from '../../common/generate-channel-query.js';
@@ -70,7 +69,7 @@ export default define(meta, paramDef, async (ps, user) => {
.where('following.followerId = :followerId', { followerId: user.id });
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
- ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere(new Brackets(qb => {
qb.where(`((note.userId IN (${ followingQuery.getQuery() })) OR (note.userId = :meId))`, { meId: user.id })
.orWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)');
@@ -92,7 +91,6 @@ export default define(meta, paramDef, async (ps, user) => {
generateRepliesQuery(query, user);
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user);
- generateMutedInstanceQuery(query, user);
generateMutedNoteQuery(query, user);
generateBlockedUserQuery(query, user);
@@ -134,9 +132,7 @@ export default define(meta, paramDef, async (ps, user) => {
const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
- if (user) {
- activeUsersChart.read(user);
- }
+ activeUsersChart.read(user);
});
return await Notes.packMany(timeline, user);
diff --git a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
index 03edf30b31..aac2a3749c 100644
--- a/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/local-timeline.ts
@@ -1,12 +1,12 @@
-import define from '../../define.js';
+import { Brackets } from 'typeorm';
import { fetchMeta } from '@/misc/fetch-meta.js';
-import { ApiError } from '../../error.js';
import { Notes, Users } from '@/models/index.js';
+import { activeUsersChart } from '@/services/chart/index.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
-import { activeUsersChart } from '@/services/chart/index.js';
-import { Brackets } from 'typeorm';
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
import { generateChannelQuery } from '../../common/generate-channel-query.js';
@@ -66,7 +66,7 @@ export default define(meta, paramDef, async (ps, user) => {
//#region Construct query
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
- ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere('(note.visibility = \'public\') AND (note.userHost IS NULL)')
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
diff --git a/packages/backend/src/server/api/endpoints/notes/mentions.ts b/packages/backend/src/server/api/endpoints/notes/mentions.ts
index eafbba322d..9b41544523 100644
--- a/packages/backend/src/server/api/endpoints/notes/mentions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/mentions.ts
@@ -1,10 +1,10 @@
-import define from '../../define.js';
+import { Brackets } from 'typeorm';
import read from '@/services/note/read.js';
import { Notes, Followings } from '@/models/index.js';
+import define from '../../define.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Brackets } from 'typeorm';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
import { generateMutedNoteThreadQuery } from '../../common/generate-muted-note-thread-query.js';
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
index 28bfade2f0..5a04d68f3e 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/recommendation.ts
@@ -1,6 +1,6 @@
-import define from '../../../define.js';
-import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
import { Brackets, In } from 'typeorm';
+import { Polls, Mutings, Notes, PollVotes } from '@/models/index.js';
+import define from '../../../define.js';
export const meta = {
tags: ['notes'],
@@ -31,8 +31,8 @@ export const paramDef = {
export default define(meta, paramDef, async (ps, user) => {
const query = Polls.createQueryBuilder('poll')
.where('poll.userHost IS NULL')
- .andWhere(`poll.userId != :meId`, { meId: user.id })
- .andWhere(`poll.noteVisibility = 'public'`)
+ .andWhere('poll.userId != :meId', { meId: user.id })
+ .andWhere('poll.noteVisibility = \'public\'')
.andWhere(new Brackets(qb => { qb
.where('poll.expiresAt IS NULL')
.orWhere('poll.expiresAt > :now', { now: new Date() });
@@ -60,12 +60,21 @@ export default define(meta, paramDef, async (ps, user) => {
query.setParameters(mutingQuery.getParameters());
//#endregion
- const polls = await query.take(ps.limit).skip(ps.offset).getMany();
+ const polls = await query
+ .orderBy('poll.noteId', 'DESC')
+ .take(ps.limit)
+ .skip(ps.offset)
+ .getMany();
if (polls.length === 0) return [];
- const notes = await Notes.findBy({
- id: In(polls.map(poll => poll.noteId)),
+ const notes = await Notes.find({
+ where: {
+ id: In(polls.map(poll => poll.noteId)),
+ },
+ order: {
+ createdAt: 'DESC',
+ },
});
return await Notes.packMany(notes, user, {
diff --git a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
index 6244b55cf2..45a832cbd2 100644
--- a/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/polls/vote.ts
@@ -1,16 +1,16 @@
+import { Not } from 'typeorm';
import { publishNoteStream } from '@/services/stream.js';
import { createNotification } from '@/services/create-notification.js';
-import define from '../../../define.js';
-import { ApiError } from '../../../error.js';
-import { getNote } from '../../../common/getters.js';
import { deliver } from '@/queue/index.js';
import { renderActivity } from '@/remote/activitypub/renderer/index.js';
import renderVote from '@/remote/activitypub/renderer/vote.js';
import { deliverQuestionUpdate } from '@/services/note/polls/update.js';
import { PollVotes, NoteWatchings, Users, Polls, Blockings } from '@/models/index.js';
-import { Not } from 'typeorm';
import { IRemoteUser } from '@/models/entities/user.js';
import { genId } from '@/misc/gen-id.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
+import define from '../../../define.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions.ts b/packages/backend/src/server/api/endpoints/notes/reactions.ts
index fbb065329c..15a62d394d 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions.ts
@@ -9,6 +9,9 @@ export const meta = {
requireCredential: false,
+ allowGet: true,
+ cacheSec: 60,
+
res: {
type: 'array',
optional: false, nullable: false,
diff --git a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
index 639ecae264..c13cafa21d 100644
--- a/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/reactions/delete.ts
@@ -1,6 +1,6 @@
-import define from '../../../define.js';
import ms from 'ms';
import deleteReaction from '@/services/note/reaction/delete.js';
+import define from '../../../define.js';
import { getNote } from '../../../common/getters.js';
import { ApiError } from '../../../error.js';
diff --git a/packages/backend/src/server/api/endpoints/notes/renotes.ts b/packages/backend/src/server/api/endpoints/notes/renotes.ts
index 87c855a5e8..28be360763 100644
--- a/packages/backend/src/server/api/endpoints/notes/renotes.ts
+++ b/packages/backend/src/server/api/endpoints/notes/renotes.ts
@@ -1,10 +1,10 @@
+import { Notes } from '@/models/index.js';
import define from '../../define.js';
import { getNote } from '../../common/getters.js';
import { ApiError } from '../../error.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Notes } from '@/models/index.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
@@ -50,7 +50,7 @@ export default define(meta, paramDef, async (ps, user) => {
});
const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId)
- .andWhere(`note.renoteId = :renoteId`, { renoteId: note.id })
+ .andWhere('note.renoteId = :renoteId', { renoteId: note.id })
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
.leftJoinAndSelect('user.banner', 'banner')
diff --git a/packages/backend/src/server/api/endpoints/notes/replies.ts b/packages/backend/src/server/api/endpoints/notes/replies.ts
index 3053eabe33..ab0018f58e 100644
--- a/packages/backend/src/server/api/endpoints/notes/replies.ts
+++ b/packages/backend/src/server/api/endpoints/notes/replies.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { Notes } 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 { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
diff --git a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
index bb85c92008..777de7221c 100644
--- a/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search-by-tag.ts
@@ -1,11 +1,11 @@
+import { Brackets } from 'typeorm';
+import { Notes } from '@/models/index.js';
+import { safeForSql } from '@/misc/safe-for-sql.js';
+import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Notes } from '@/models/index.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
-import { Brackets } from 'typeorm';
-import { safeForSql } from '@/misc/safe-for-sql.js';
-import { normalizeForSearch } from '@/misc/normalize-for-search.js';
import { generateBlockedUserQuery } from '../../common/generate-block-query.js';
export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/notes/search.ts b/packages/backend/src/server/api/endpoints/notes/search.ts
index af9b5f0a10..4e2cdae801 100644
--- a/packages/backend/src/server/api/endpoints/notes/search.ts
+++ b/packages/backend/src/server/api/endpoints/notes/search.ts
@@ -1,8 +1,8 @@
-import es from '../../../../db/elasticsearch.js';
-import define from '../../define.js';
-import { Notes } from '@/models/index.js';
import { In } from 'typeorm';
+import { Notes } from '@/models/index.js';
import config from '@/config/index.js';
+import es from '../../../../db/elasticsearch.js';
+import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
@@ -99,7 +99,7 @@ export default define(meta, paramDef, async (ps, me) => {
userHost: ps.host,
},
}] : []
- : [];
+ : [];
const result = await es.search({
index: config.elasticsearch.index || 'misskey_note',
diff --git a/packages/backend/src/server/api/endpoints/notes/show.ts b/packages/backend/src/server/api/endpoints/notes/show.ts
index d6692923c3..5cd74bd2ca 100644
--- a/packages/backend/src/server/api/endpoints/notes/show.ts
+++ b/packages/backend/src/server/api/endpoints/notes/show.ts
@@ -1,7 +1,7 @@
+import { Notes } from '@/models/index.js';
import define from '../../define.js';
import { getNote } from '../../common/getters.js';
import { ApiError } from '../../error.js';
-import { Notes } from '@/models/index.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/state.ts b/packages/backend/src/server/api/endpoints/notes/state.ts
index 069f11fa4a..01afa5add2 100644
--- a/packages/backend/src/server/api/endpoints/notes/state.ts
+++ b/packages/backend/src/server/api/endpoints/notes/state.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { NoteFavorites, Notes, NoteThreadMutings, NoteWatchings } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
index e48a2cf576..cf360526d3 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/create.ts
@@ -1,9 +1,9 @@
-import define from '../../../define.js';
-import { getNote } from '../../../common/getters.js';
-import { ApiError } from '../../../error.js';
import { Notes, NoteThreadMutings } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import readNote from '@/services/note/read.js';
+import define from '../../../define.js';
+import { getNote } from '../../../common/getters.js';
+import { ApiError } from '../../../error.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
index 4fb3137a5e..ac310d0fe6 100644
--- a/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/thread-muting/delete.ts
@@ -1,7 +1,7 @@
+import { NoteThreadMutings } from '@/models/index.js';
import define from '../../../define.js';
import { getNote } from '../../../common/getters.js';
import { ApiError } from '../../../error.js';
-import { NoteThreadMutings } from '@/models/index.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/timeline.ts b/packages/backend/src/server/api/endpoints/notes/timeline.ts
index 0f976d18be..22f4925175 100644
--- a/packages/backend/src/server/api/endpoints/notes/timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/timeline.ts
@@ -1,11 +1,10 @@
+import { Brackets } from 'typeorm';
+import { Notes, Followings } from '@/models/index.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import define from '../../define.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
-import { Notes, Followings } from '@/models/index.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
import { generateMutedUserQuery } from '../../common/generate-muted-user-query.js';
-import { generateMutedInstanceQuery } from '../../common/generate-muted-instance-query.js';
-import { activeUsersChart } from '@/services/chart/index.js';
-import { Brackets } from 'typeorm';
import { generateRepliesQuery } from '../../common/generate-replies-query.js';
import { generateMutedNoteQuery } from '../../common/generate-muted-note-query.js';
import { generateChannelQuery } from '../../common/generate-channel-query.js';
@@ -62,10 +61,10 @@ export default define(meta, paramDef, async (ps, user) => {
.where('following.followerId = :followerId', { followerId: user.id });
const query = makePaginationQuery(Notes.createQueryBuilder('note'),
- ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
+ ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate)
.andWhere(new Brackets(qb => { qb
.where('note.userId = :meId', { meId: user.id });
- if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
+ if (hasFollowing) qb.orWhere(`note.userId IN (${ followingQuery.getQuery() })`);
}))
.innerJoinAndSelect('note.user', 'user')
.leftJoinAndSelect('user.avatar', 'avatar')
@@ -84,7 +83,6 @@ export default define(meta, paramDef, async (ps, user) => {
generateRepliesQuery(query, user);
generateVisibilityQuery(query, user);
generateMutedUserQuery(query, user);
- generateMutedInstanceQuery(query, user);
generateMutedNoteQuery(query, user);
generateBlockedUserQuery(query, user);
@@ -126,9 +124,7 @@ export default define(meta, paramDef, async (ps, user) => {
const timeline = await query.take(ps.limit).getMany();
process.nextTick(() => {
- if (user) {
- activeUsersChart.read(user);
- }
+ activeUsersChart.read(user);
});
return await Notes.packMany(timeline, user);
diff --git a/packages/backend/src/server/api/endpoints/notes/unrenote.ts b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
index 5e8c31eaf8..3fba0efe0c 100644
--- a/packages/backend/src/server/api/endpoints/notes/unrenote.ts
+++ b/packages/backend/src/server/api/endpoints/notes/unrenote.ts
@@ -1,9 +1,9 @@
+import ms from 'ms';
import deleteNote from '@/services/note/delete.js';
+import { Notes, Users } from '@/models/index.js';
import define from '../../define.js';
-import ms from 'ms';
import { getNote } from '../../common/getters.js';
import { ApiError } from '../../error.js';
-import { Notes, Users } from '@/models/index.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
index fd4a879035..e603a8f625 100644
--- a/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
+++ b/packages/backend/src/server/api/endpoints/notes/user-list-timeline.ts
@@ -1,10 +1,10 @@
+import { Brackets } from 'typeorm';
+import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
+import { activeUsersChart } from '@/services/chart/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { UserLists, UserListJoinings, Notes } from '@/models/index.js';
import { makePaginationQuery } from '../../common/make-pagination-query.js';
import { generateVisibilityQuery } from '../../common/generate-visibility-query.js';
-import { activeUsersChart } from '@/services/chart/index.js';
-import { Brackets } from 'typeorm';
export const meta = {
tags: ['notes', 'lists'],
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/create.ts b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
index 8fdf84624e..7d482b0732 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/create.ts
@@ -1,5 +1,5 @@
-import define from '../../../define.js';
import watch from '@/services/note/watch.js';
+import define from '../../../define.js';
import { getNote } from '../../../common/getters.js';
import { ApiError } from '../../../error.js';
diff --git a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
index d58f09797c..2c1a2e5fbd 100644
--- a/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
+++ b/packages/backend/src/server/api/endpoints/notes/watching/delete.ts
@@ -1,5 +1,5 @@
-import define from '../../../define.js';
import unwatch from '@/services/note/unwatch.js';
+import define from '../../../define.js';
import { getNote } from '../../../common/getters.js';
import { ApiError } from '../../../error.js';
diff --git a/packages/backend/src/server/api/endpoints/notifications/create.ts b/packages/backend/src/server/api/endpoints/notifications/create.ts
index b339c8723d..80d513d8da 100644
--- a/packages/backend/src/server/api/endpoints/notifications/create.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/create.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { createNotification } from '@/services/create-notification.js';
+import define from '../../define.js';
export const meta = {
tags: ['notifications'],
diff --git a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
index 4575cba43f..d169afbb35 100644
--- a/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/mark-all-as-read.ts
@@ -1,7 +1,7 @@
import { publishMainStream } from '@/services/stream.js';
import { pushNotification } from '@/services/push-notification.js';
-import define from '../../define.js';
import { Notifications } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['notifications', 'account'],
diff --git a/packages/backend/src/server/api/endpoints/notifications/read.ts b/packages/backend/src/server/api/endpoints/notifications/read.ts
index e7839b2460..7bce525a55 100644
--- a/packages/backend/src/server/api/endpoints/notifications/read.ts
+++ b/packages/backend/src/server/api/endpoints/notifications/read.ts
@@ -2,17 +2,14 @@ import define from '../../define.js';
import { readNotification } from '../../common/read-notification.js';
export const meta = {
- desc: {
- 'ja-JP': '通知を既読にします。',
- 'en-US': 'Mark a notification as read.'
- },
-
tags: ['notifications', 'account'],
requireCredential: true,
kind: 'write:notifications',
+ description: 'Mark a notification as read.',
+
errors: {
noSuchNotification: {
message: 'No such notification.',
diff --git a/packages/backend/src/server/api/endpoints/page-push.ts b/packages/backend/src/server/api/endpoints/page-push.ts
index 7096aaa3d3..6dd3ede85a 100644
--- a/packages/backend/src/server/api/endpoints/page-push.ts
+++ b/packages/backend/src/server/api/endpoints/page-push.ts
@@ -1,6 +1,6 @@
-import define from '../define.js';
import { publishMainStream } from '@/services/stream.js';
import { Users, Pages } from '@/models/index.js';
+import define from '../define.js';
import { ApiError } from '../error.js';
export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/pages/create.ts b/packages/backend/src/server/api/endpoints/pages/create.ts
index c171cd39f5..b008cde84e 100644
--- a/packages/backend/src/server/api/endpoints/pages/create.ts
+++ b/packages/backend/src/server/api/endpoints/pages/create.ts
@@ -1,8 +1,8 @@
import ms from 'ms';
-import define from '../../define.js';
import { Pages, DriveFiles } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
import { Page } from '@/models/entities/page.js';
+import define from '../../define.js';
import { ApiError } from '../../error.js';
export const meta = {
@@ -51,7 +51,7 @@ export const paramDef = {
} },
script: { type: 'string' },
eyeCatchingImageId: { type: 'string', format: 'misskey:id', nullable: true },
- font: { type: 'string', enum: ['serif', 'sans-serif'], default: "sans-serif" },
+ font: { type: 'string', enum: ['serif', 'sans-serif'], default: 'sans-serif' },
alignCenter: { type: 'boolean', default: false },
hideTitleWhenPinned: { type: 'boolean', default: false },
},
diff --git a/packages/backend/src/server/api/endpoints/pages/delete.ts b/packages/backend/src/server/api/endpoints/pages/delete.ts
index e35ad9ebf2..a7708e6585 100644
--- a/packages/backend/src/server/api/endpoints/pages/delete.ts
+++ b/packages/backend/src/server/api/endpoints/pages/delete.ts
@@ -1,6 +1,6 @@
+import { Pages } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { Pages } from '@/models/index.js';
export const meta = {
tags: ['pages'],
diff --git a/packages/backend/src/server/api/endpoints/pages/featured.ts b/packages/backend/src/server/api/endpoints/pages/featured.ts
index eeb6d509ca..5a149a626e 100644
--- a/packages/backend/src/server/api/endpoints/pages/featured.ts
+++ b/packages/backend/src/server/api/endpoints/pages/featured.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { Pages } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['pages'],
diff --git a/packages/backend/src/server/api/endpoints/pages/like.ts b/packages/backend/src/server/api/endpoints/pages/like.ts
index 20793db988..269b539f74 100644
--- a/packages/backend/src/server/api/endpoints/pages/like.ts
+++ b/packages/backend/src/server/api/endpoints/pages/like.ts
@@ -1,7 +1,7 @@
-import define from '../../define.js';
-import { ApiError } from '../../error.js';
import { Pages, PageLikes } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js';
+import define from '../../define.js';
+import { ApiError } from '../../error.js';
export const meta = {
tags: ['pages'],
diff --git a/packages/backend/src/server/api/endpoints/pages/unlike.ts b/packages/backend/src/server/api/endpoints/pages/unlike.ts
index 636f3c7149..6b3a2bec10 100644
--- a/packages/backend/src/server/api/endpoints/pages/unlike.ts
+++ b/packages/backend/src/server/api/endpoints/pages/unlike.ts
@@ -1,6 +1,6 @@
+import { Pages, PageLikes } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { Pages, PageLikes } from '@/models/index.js';
export const meta = {
tags: ['pages'],
diff --git a/packages/backend/src/server/api/endpoints/pages/update.ts b/packages/backend/src/server/api/endpoints/pages/update.ts
index bf95ab36f2..d241f585aa 100644
--- a/packages/backend/src/server/api/endpoints/pages/update.ts
+++ b/packages/backend/src/server/api/endpoints/pages/update.ts
@@ -1,8 +1,8 @@
import ms from 'ms';
+import { Not } from 'typeorm';
+import { Pages, DriveFiles } from '@/models/index.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
-import { Pages, DriveFiles } from '@/models/index.js';
-import { Not } from 'typeorm';
export const meta = {
tags: ['pages'],
diff --git a/packages/backend/src/server/api/endpoints/pinned-users.ts b/packages/backend/src/server/api/endpoints/pinned-users.ts
index 8d253c1f33..41595b47d9 100644
--- a/packages/backend/src/server/api/endpoints/pinned-users.ts
+++ b/packages/backend/src/server/api/endpoints/pinned-users.ts
@@ -1,9 +1,9 @@
-import define from '../define.js';
+import { IsNull } from 'typeorm';
import { Users } from '@/models/index.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import * as Acct from '@/misc/acct.js';
import { User } from '@/models/entities/user.js';
-import { IsNull } from 'typeorm';
+import define from '../define.js';
export const meta = {
tags: ['users'],
diff --git a/packages/backend/src/server/api/endpoints/promo/read.ts b/packages/backend/src/server/api/endpoints/promo/read.ts
index cc602857de..c6a940c65e 100644
--- a/packages/backend/src/server/api/endpoints/promo/read.ts
+++ b/packages/backend/src/server/api/endpoints/promo/read.ts
@@ -1,8 +1,8 @@
+import { PromoReads } from '@/models/index.js';
+import { genId } from '@/misc/gen-id.js';
import define from '../../define.js';
import { ApiError } from '../../error.js';
import { getNote } from '../../common/getters.js';
-import { PromoReads } from '@/models/index.js';
-import { genId } from '@/misc/gen-id.js';
export const meta = {
tags: ['notes'],
diff --git a/packages/backend/src/server/api/endpoints/request-reset-password.ts b/packages/backend/src/server/api/endpoints/request-reset-password.ts
index 12ce7a9834..511a6bbb53 100644
--- a/packages/backend/src/server/api/endpoints/request-reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/request-reset-password.ts
@@ -1,13 +1,13 @@
-import { publishMainStream } from '@/services/stream.js';
-import define from '../define.js';
import rndstr from 'rndstr';
-import config from '@/config/index.js';
import ms from 'ms';
+import { IsNull } from 'typeorm';
+import { publishMainStream } from '@/services/stream.js';
+import config from '@/config/index.js';
import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
import { sendEmail } from '@/services/send-email.js';
-import { ApiError } from '../error.js';
import { genId } from '@/misc/gen-id.js';
-import { IsNull } from 'typeorm';
+import { ApiError } from '../error.js';
+import define from '../define.js';
export const meta = {
tags: ['reset password'],
diff --git a/packages/backend/src/server/api/endpoints/reset-db.ts b/packages/backend/src/server/api/endpoints/reset-db.ts
index 5ff115dab5..140f96d579 100644
--- a/packages/backend/src/server/api/endpoints/reset-db.ts
+++ b/packages/backend/src/server/api/endpoints/reset-db.ts
@@ -1,6 +1,6 @@
+import { resetDb } from '@/db/postgre.js';
import define from '../define.js';
import { ApiError } from '../error.js';
-import { resetDb } from '@/db/postgre.js';
export const meta = {
tags: ['non-productive'],
diff --git a/packages/backend/src/server/api/endpoints/reset-password.ts b/packages/backend/src/server/api/endpoints/reset-password.ts
index 3dcb0b9b83..797169c2c3 100644
--- a/packages/backend/src/server/api/endpoints/reset-password.ts
+++ b/packages/backend/src/server/api/endpoints/reset-password.ts
@@ -1,7 +1,7 @@
import bcrypt from 'bcryptjs';
import { publishMainStream } from '@/services/stream.js';
-import define from '../define.js';
import { Users, UserProfiles, PasswordResetRequests } from '@/models/index.js';
+import define from '../define.js';
import { ApiError } from '../error.js';
export const meta = {
diff --git a/packages/backend/src/server/api/endpoints/stats.ts b/packages/backend/src/server/api/endpoints/stats.ts
index f8a1ee29de..cc94f8bf26 100644
--- a/packages/backend/src/server/api/endpoints/stats.ts
+++ b/packages/backend/src/server/api/endpoints/stats.ts
@@ -1,5 +1,5 @@
-import define from '../define.js';
import { Instances, NoteReactions, Notes, Users } from '@/models/index.js';
+import define from '../define.js';
import { } from '@/services/chart/index.js';
import { IsNull } from 'typeorm';
diff --git a/packages/backend/src/server/api/endpoints/sw/register.ts b/packages/backend/src/server/api/endpoints/sw/register.ts
index 5bc3b9b6a1..437f8874ff 100644
--- a/packages/backend/src/server/api/endpoints/sw/register.ts
+++ b/packages/backend/src/server/api/endpoints/sw/register.ts
@@ -1,7 +1,7 @@
-import define from '../../define.js';
import { fetchMeta } from '@/misc/fetch-meta.js';
import { genId } from '@/misc/gen-id.js';
import { SwSubscriptions } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['account'],
diff --git a/packages/backend/src/server/api/endpoints/sw/unregister.ts b/packages/backend/src/server/api/endpoints/sw/unregister.ts
index c21856d28f..c19e06b879 100644
--- a/packages/backend/src/server/api/endpoints/sw/unregister.ts
+++ b/packages/backend/src/server/api/endpoints/sw/unregister.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { SwSubscriptions } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['account'],
diff --git a/packages/backend/src/server/api/endpoints/username/available.ts b/packages/backend/src/server/api/endpoints/username/available.ts
index 04b754f4ad..3e41aeaed8 100644
--- a/packages/backend/src/server/api/endpoints/username/available.ts
+++ b/packages/backend/src/server/api/endpoints/username/available.ts
@@ -1,6 +1,6 @@
-import define from '../../define.js';
-import { Users, UsedUsernames } from '@/models/index.js';
import { IsNull } from 'typeorm';
+import { Users, UsedUsernames } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
diff --git a/packages/backend/src/server/api/endpoints/users.ts b/packages/backend/src/server/api/endpoints/users.ts
index 10527d15cc..3a8211374b 100644
--- a/packages/backend/src/server/api/endpoints/users.ts
+++ b/packages/backend/src/server/api/endpoints/users.ts
@@ -1,5 +1,5 @@
-import define from '../define.js';
import { Users } from '@/models/index.js';
+import define from '../define.js';
import { generateMutedUserQueryForUsers } from '../common/generate-muted-user-query.js';
import { generateBlockQueryForUsers } from '../common/generate-block-query.js';
@@ -25,8 +25,14 @@ export const paramDef = {
limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
offset: { type: 'integer', default: 0 },
sort: { type: 'string', enum: ['+follower', '-follower', '+createdAt', '-createdAt', '+updatedAt', '-updatedAt'] },
- state: { type: 'string', enum: ['all', 'admin', 'moderator', 'adminOrModerator', 'alive'], default: "all" },
- origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: "local" },
+ state: { type: 'string', enum: ['all', 'admin', 'moderator', 'adminOrModerator', 'alive'], default: 'all' },
+ origin: { type: 'string', enum: ['combined', 'local', 'remote'], default: 'local' },
+ hostname: {
+ type: 'string',
+ nullable: true,
+ default: null,
+ description: 'The local host is represented with `null`.',
+ },
},
required: [],
} as const;
@@ -48,6 +54,10 @@ export default define(meta, paramDef, async (ps, me) => {
case 'remote': query.andWhere('user.host IS NOT NULL'); break;
}
+ if (ps.hostname) {
+ query.andWhere('user.host = :hostname', { hostname: ps.hostname.toLowerCase() });
+ }
+
switch (ps.sort) {
case '+follower': query.orderBy('user.followersCount', 'DESC'); break;
case '-follower': query.orderBy('user.followersCount', 'ASC'); break;
diff --git a/packages/backend/src/server/api/endpoints/users/clips.ts b/packages/backend/src/server/api/endpoints/users/clips.ts
index 37d4153950..09fdf27c23 100644
--- a/packages/backend/src/server/api/endpoints/users/clips.ts
+++ b/packages/backend/src/server/api/endpoints/users/clips.ts
@@ -1,5 +1,5 @@
-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 = {
@@ -32,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 b1fb656208..7f9f980764 100644
--- a/packages/backend/src/server/api/endpoints/users/followers.ts
+++ b/packages/backend/src/server/api/endpoints/users/followers.ts
@@ -1,9 +1,9 @@
+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'],
@@ -96,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 429a5e80e5..0aaa810f76 100644
--- a/packages/backend/src/server/api/endpoints/users/following.ts
+++ b/packages/backend/src/server/api/endpoints/users/following.ts
@@ -1,9 +1,9 @@
+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'],
@@ -96,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/get-frequently-replied-users.ts b/packages/backend/src/server/api/endpoints/users/get-frequently-replied-users.ts
index ab5837b3f3..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,9 +1,9 @@
-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'],
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 fcaf4af3c3..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'],
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 1bf253ae3f..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'],
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 eafd7f592c..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'],
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 08d3a3804b..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'],
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 cc82e43f21..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'],
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 6a2862ee5a..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'],
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 2343cdf857..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'],
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 de030193cc..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'],
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 703dad6d3b..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'],
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 e1cee5fcf7..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'],
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 1496e766ca..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'],
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 43cf3e484e..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'],
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 d2941a0af5..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'],
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 8cd02ee02a..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'],
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 b337f879b1..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'],
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 fa7033b02e..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'],
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 1db10afc80..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'],
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 94d24e1274..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'],
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 c21cdcf679..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'],
diff --git a/packages/backend/src/server/api/endpoints/users/notes.ts b/packages/backend/src/server/api/endpoints/users/notes.ts
index 57dcdfaa88..9fa56fe83a 100644
--- a/packages/backend/src/server/api/endpoints/users/notes.ts
+++ b/packages/backend/src/server/api/endpoints/users/notes.ts
@@ -1,13 +1,12 @@
+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'],
@@ -77,9 +76,10 @@ export default define(meta, paramDef, async (ps, me) => {
.leftJoinAndSelect('renoteUser.banner', 'renoteUserBanner');
generateVisibilityQuery(query, me);
- if (me) generateMutedUserQuery(query, me, user);
- if (me) generateBlockedUserQuery(query, me);
- if (me) generateMutedInstanceQuery(query, me);
+ if (me) {
+ generateMutedUserQuery(query, me, user);
+ generateBlockedUserQuery(query, me);
+ }
if (ps.withFiles) {
query.andWhere('note.fileIds != \'{}\'');
diff --git a/packages/backend/src/server/api/endpoints/users/pages.ts b/packages/backend/src/server/api/endpoints/users/pages.ts
index 85d122c24f..b1d28af845 100644
--- a/packages/backend/src/server/api/endpoints/users/pages.ts
+++ b/packages/backend/src/server/api/endpoints/users/pages.ts
@@ -1,5 +1,5 @@
-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 = {
@@ -32,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 64994aae49..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';
@@ -52,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 6fff94ddcf..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';
diff --git a/packages/backend/src/server/api/endpoints/users/relation.ts b/packages/backend/src/server/api/endpoints/users/relation.ts
index 87cab5fcf1..233a6a90b4 100644
--- a/packages/backend/src/server/api/endpoints/users/relation.ts
+++ b/packages/backend/src/server/api/endpoints/users/relation.ts
@@ -1,5 +1,5 @@
-import define from '../../define.js';
import { Users } from '@/models/index.js';
+import define from '../../define.js';
export const meta = {
tags: ['users'],
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 c7c7a3f591..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,12 +1,12 @@
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'],
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 6cbf12b3b5..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,8 +1,8 @@
-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'],
@@ -67,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
@@ -85,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 19c1a2c690..01729de667 100644
--- a/packages/backend/src/server/api/endpoints/users/search.ts
+++ b/packages/backend/src/server/api/endpoints/users/search.ts
@@ -1,7 +1,7 @@
-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'],
@@ -27,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'],
@@ -113,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 b31ca30647..846d83b49f 100644
--- a/packages/backend/src/server/api/endpoints/users/show.ts
+++ b/packages/backend/src/server/api/endpoints/users/show.ts
@@ -1,10 +1,10 @@
+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'],
diff --git a/packages/backend/src/server/api/endpoints/users/stats.ts b/packages/backend/src/server/api/endpoints/users/stats.ts
index d17e8b64b5..47f322ee9b 100644
--- a/packages/backend/src/server/api/endpoints/users/stats.ts
+++ b/packages/backend/src/server/api/endpoints/users/stats.ts
@@ -1,7 +1,7 @@
-import define from '../../define.js';
-import { ApiError } from '../../error.js';
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';
export const meta = {
tags: ['users'],