Merge branch 'develop' into external-resources

This commit is contained in:
かっこかり 2023-10-18 11:29:31 +09:00 committed by GitHub
commit dade11433d
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
22 changed files with 558 additions and 520 deletions

View file

@ -5,7 +5,7 @@
"workspaceFolder": "/workspace", "workspaceFolder": "/workspace",
"features": { "features": {
"ghcr.io/devcontainers-contrib/features/pnpm:2": { "ghcr.io/devcontainers-contrib/features/pnpm:2": {
"version": "8.8.0" "version": "8.9.2"
}, },
"ghcr.io/devcontainers/features/node:1": { "ghcr.io/devcontainers/features/node:1": {
"version": "20.5.1" "version": "20.5.1"

View file

@ -27,6 +27,8 @@
### Server ### Server
- Enhance: ストリーミングAPIのパフォーマンスを向上 - Enhance: ストリーミングAPIのパフォーマンスを向上
- Fix: users/notesでDBから参照した際にチャンネル投稿のみ取得される問題を修正
- Fix: コントロールパネルの設定項目が正しく保存できない問題を修正
## 2023.10.1 ## 2023.10.1
### General ### General

View file

@ -593,7 +593,7 @@ poll: "アンケート"
useCw: "内容を隠す" useCw: "内容を隠す"
enablePlayer: "プレイヤーを開く" enablePlayer: "プレイヤーを開く"
disablePlayer: "プレイヤーを閉じる" disablePlayer: "プレイヤーを閉じる"
expandTweet: "ツイートを展開する" expandTweet: "ポストを展開する"
themeEditor: "テーマエディター" themeEditor: "テーマエディター"
description: "説明" description: "説明"
describeFile: "キャプションを付ける" describeFile: "キャプションを付ける"

View file

@ -6,7 +6,7 @@
"type": "git", "type": "git",
"url": "https://github.com/misskey-dev/misskey.git" "url": "https://github.com/misskey-dev/misskey.git"
}, },
"packageManager": "pnpm@8.8.0", "packageManager": "pnpm@8.9.2",
"workspaces": [ "workspaces": [
"packages/frontend", "packages/frontend",
"packages/backend", "packages/backend",

View file

@ -59,9 +59,9 @@
"@aws-sdk/client-s3": "3.412.0", "@aws-sdk/client-s3": "3.412.0",
"@aws-sdk/lib-storage": "3.412.0", "@aws-sdk/lib-storage": "3.412.0",
"@smithy/node-http-handler": "2.1.5", "@smithy/node-http-handler": "2.1.5",
"@bull-board/api": "5.8.4", "@bull-board/api": "5.9.1",
"@bull-board/fastify": "5.8.4", "@bull-board/fastify": "5.9.1",
"@bull-board/ui": "5.8.4", "@bull-board/ui": "5.9.1",
"@discordapp/twemoji": "14.1.2", "@discordapp/twemoji": "14.1.2",
"@fastify/accepts": "4.2.0", "@fastify/accepts": "4.2.0",
"@fastify/cookie": "9.1.0", "@fastify/cookie": "9.1.0",
@ -155,7 +155,7 @@
"strict-event-emitter-types": "2.0.0", "strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0", "stringz": "2.1.0",
"summaly": "github:misskey-dev/summaly", "summaly": "github:misskey-dev/summaly",
"systeminformation": "5.21.11", "systeminformation": "5.21.12",
"tinycolor2": "1.6.0", "tinycolor2": "1.6.0",
"tmp": "0.2.1", "tmp": "0.2.1",
"tsc-alias": "1.8.8", "tsc-alias": "1.8.8",
@ -173,13 +173,13 @@
"@jest/globals": "29.7.0", "@jest/globals": "29.7.0",
"@simplewebauthn/typescript-types": "8.0.0", "@simplewebauthn/typescript-types": "8.0.0",
"@swc/jest": "0.2.29", "@swc/jest": "0.2.29",
"@types/accepts": "1.3.5", "@types/accepts": "1.3.6",
"@types/archiver": "5.3.3", "@types/archiver": "5.3.4",
"@types/bcryptjs": "2.4.4", "@types/bcryptjs": "2.4.5",
"@types/body-parser": "1.19.3", "@types/body-parser": "1.19.4",
"@types/cbor": "6.0.0", "@types/cbor": "6.0.0",
"@types/color-convert": "2.0.1", "@types/color-convert": "2.0.2",
"@types/content-disposition": "0.5.6", "@types/content-disposition": "0.5.7",
"@types/fluent-ffmpeg": "2.1.22", "@types/fluent-ffmpeg": "2.1.22",
"@types/http-link-header": "1.0.3", "@types/http-link-header": "1.0.3",
"@types/jest": "29.5.5", "@types/jest": "29.5.5",

View file

@ -331,7 +331,7 @@ export class CustomEmojiService implements OnApplicationShutdown {
const queryOrNull = async () => (await this.emojisRepository.findOneBy({ const queryOrNull = async () => (await this.emojisRepository.findOneBy({
name, name,
host: host ?? IsNull(), host,
})) ?? null; })) ?? null;
const emoji = await this.cache.fetch(`${name} ${host}`, queryOrNull); const emoji = await this.cache.fetch(`${name} ${host}`, queryOrNull);

View file

@ -45,7 +45,7 @@ export class HashtagService {
await this.updateHashtag(user, tag, true, true); await this.updateHashtag(user, tag, true, true);
} }
for (const tag of (user.tags ?? []).filter(x => !tags.includes(x))) { for (const tag of user.tags.filter(x => !tags.includes(x))) {
await this.updateHashtag(user, tag, true, false); await this.updateHashtag(user, tag, true, false);
} }
} }

View file

@ -317,7 +317,7 @@ export class NoteCreateService implements OnApplicationShutdown {
data.text = data.text.trim(); data.text = data.text.trim();
if (user.isCat) { if (user.isCat) {
patsedText = patsedText ?? mfm.parse(data.text); patsedText = mfm.parse(data.text);
function nyaizeNode(node: mfm.MfmNode) { function nyaizeNode(node: mfm.MfmNode) {
if (node.type === 'quote') return; if (node.type === 'quote') return;
if (node.type === 'text') { if (node.type === 'text') {
@ -359,7 +359,7 @@ export class NoteCreateService implements OnApplicationShutdown {
mentionedUsers = data.apMentions ?? await this.extractMentionedUsers(user, combinedTokens); mentionedUsers = data.apMentions ?? await this.extractMentionedUsers(user, combinedTokens);
} }
tags = tags.filter(tag => Array.from(tag ?? '').length <= 128).splice(0, 32); tags = tags.filter(tag => Array.from(tag).length <= 128).splice(0, 32);
if (data.reply && (user.id !== data.reply.userId) && !mentionedUsers.some(u => u.id === data.reply!.userId)) { if (data.reply && (user.id !== data.reply.userId) && !mentionedUsers.some(u => u.id === data.reply!.userId)) {
mentionedUsers.push(await this.usersRepository.findOneByOrFail({ id: data.reply!.userId })); mentionedUsers.push(await this.usersRepository.findOneByOrFail({ id: data.reply!.userId }));

View file

@ -148,7 +148,7 @@ export class ReactionService {
reaction = FALLBACK; reaction = FALLBACK;
} }
} else { } else {
reaction = this.normalize(reaction ?? null); reaction = this.normalize(reaction);
} }
} }

View file

@ -90,7 +90,7 @@ export class DriveFileEntityService {
if (file.type.startsWith('video')) { if (file.type.startsWith('video')) {
if (file.thumbnailUrl) return file.thumbnailUrl; if (file.thumbnailUrl) return file.thumbnailUrl;
return this.videoProcessingService.getExternalVideoThumbnailUrl(file.webpublicUrl ?? file.url ?? file.uri); return this.videoProcessingService.getExternalVideoThumbnailUrl(file.webpublicUrl ?? file.url);
} else if (file.uri != null && file.userHost != null && this.config.externalMediaProxyEnabled) { } else if (file.uri != null && file.userHost != null && this.config.externalMediaProxyEnabled) {
// 動画ではなくリモートかつメディアプロキシ // 動画ではなくリモートかつメディアプロキシ
return this.getProxiedUrl(file.uri, 'static'); return this.getProxiedUrl(file.uri, 'static');
@ -145,7 +145,7 @@ export class DriveFileEntityService {
.select('SUM(file.size)', 'sum') .select('SUM(file.size)', 'sum')
.getRawOne(); .getRawOne();
return parseInt(sum, 10) ?? 0; return parseInt(sum, 10) || 0;
} }
@bindThis @bindThis
@ -157,7 +157,7 @@ export class DriveFileEntityService {
.select('SUM(file.size)', 'sum') .select('SUM(file.size)', 'sum')
.getRawOne(); .getRawOne();
return parseInt(sum, 10) ?? 0; return parseInt(sum, 10) || 0;
} }
@bindThis @bindThis
@ -169,7 +169,7 @@ export class DriveFileEntityService {
.select('SUM(file.size)', 'sum') .select('SUM(file.size)', 'sum')
.getRawOne(); .getRawOne();
return parseInt(sum, 10) ?? 0; return parseInt(sum, 10) || 0;
} }
@bindThis @bindThis
@ -181,7 +181,7 @@ export class DriveFileEntityService {
.select('SUM(file.size)', 'sum') .select('SUM(file.size)', 'sum')
.getRawOne(); .getRawOne();
return parseInt(sum, 10) ?? 0; return parseInt(sum, 10) || 0;
} }
@bindThis @bindThis

View file

@ -318,7 +318,7 @@ export class NoteEntityService implements OnModuleInit {
text: text, text: text,
cw: note.cw, cw: note.cw,
visibility: note.visibility, visibility: note.visibility,
localOnly: note.localOnly ?? undefined, localOnly: note.localOnly,
reactionAcceptance: note.reactionAcceptance, reactionAcceptance: note.reactionAcceptance,
visibleUserIds: note.visibility === 'specified' ? note.visibleUserIds : undefined, visibleUserIds: note.visibility === 'specified' ? note.visibleUserIds : undefined,
renoteCount: note.renoteCount, renoteCount: note.renoteCount,

View file

@ -333,8 +333,8 @@ export class UserEntityService implements OnModuleInit {
host: user.host, host: user.host,
avatarUrl: user.avatarUrl ?? this.getIdenticonUrl(user), avatarUrl: user.avatarUrl ?? this.getIdenticonUrl(user),
avatarBlurhash: user.avatarBlurhash, avatarBlurhash: user.avatarBlurhash,
isBot: user.isBot ?? falsy, isBot: user.isBot,
isCat: user.isCat ?? falsy, isCat: user.isCat,
instance: user.host ? this.federatedInstanceService.federatedInstanceCache.fetch(user.host).then(instance => instance ? { instance: user.host ? this.federatedInstanceService.federatedInstanceCache.fetch(user.host).then(instance => instance ? {
name: instance.name, name: instance.name,
softwareName: instance.softwareName, softwareName: instance.softwareName,
@ -367,7 +367,7 @@ export class UserEntityService implements OnModuleInit {
bannerBlurhash: user.bannerBlurhash, bannerBlurhash: user.bannerBlurhash,
isLocked: user.isLocked, isLocked: user.isLocked,
isSilenced: this.roleService.getUserPolicies(user.id).then(r => !r.canPublicNote), isSilenced: this.roleService.getUserPolicies(user.id).then(r => !r.canPublicNote),
isSuspended: user.isSuspended ?? falsy, isSuspended: user.isSuspended,
description: profile!.description, description: profile!.description,
location: profile!.location, location: profile!.location,
birthday: profile!.birthday, birthday: profile!.birthday,

View file

@ -108,6 +108,5 @@ async function net() {
// FS STAT // FS STAT
async function fs() { async function fs() {
const data = await si.disksIO().catch(() => ({ rIO_sec: 0, wIO_sec: 0 })); return await si.disksIO().catch(() => ({ rIO_sec: 0, wIO_sec: 0 }));
return data ?? { rIO_sec: 0, wIO_sec: 0 };
} }

View file

@ -88,7 +88,7 @@ export class InboxProcessorService {
if (err.isClientError) { if (err.isClientError) {
throw new Bull.UnrecoverableError(`skip: Ignored deleted actors on both ends ${activity.actor} - ${err.statusCode}`); throw new Bull.UnrecoverableError(`skip: Ignored deleted actors on both ends ${activity.actor} - ${err.statusCode}`);
} }
throw new Error(`Error in actor ${activity.actor} - ${err.statusCode ?? err}`); throw new Error(`Error in actor ${activity.actor} - ${err.statusCode}`);
} }
} }
} }

View file

@ -96,8 +96,8 @@ export const paramDef = {
tosUrl: { type: 'string', nullable: true }, tosUrl: { type: 'string', nullable: true },
repositoryUrl: { type: 'string' }, repositoryUrl: { type: 'string' },
feedbackUrl: { type: 'string' }, feedbackUrl: { type: 'string' },
impressumUrl: { type: 'string' }, impressumUrl: { type: 'string', nullable: true },
privacyPolicyUrl: { type: 'string' }, privacyPolicyUrl: { type: 'string', nullable: true },
useObjectStorage: { type: 'boolean' }, useObjectStorage: { type: 'boolean' },
objectStorageBaseUrl: { type: 'string', nullable: true }, objectStorageBaseUrl: { type: 'string', nullable: true },
objectStorageBucket: { type: 'string', nullable: true }, objectStorageBucket: { type: 'string', nullable: true },

View file

@ -151,7 +151,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
.leftJoinAndSelect('renote.user', 'renoteUser'); .leftJoinAndSelect('renote.user', 'renoteUser');
if (ps.withChannelNotes) { if (ps.withChannelNotes) {
if (!isSelf) query.andWhere('channel.isSensitive = false'); if (!isSelf) query.andWhere(new Brackets(qb => {
qb.orWhere('note.channelId IS NULL');
qb.orWhere('channel.isSensitive = false');
}));
} else { } else {
query.andWhere('note.channelId IS NULL'); query.andWhere('note.channelId IS NULL');
} }

View file

@ -49,7 +49,7 @@ class HomeTimelineChannel extends Channel {
} }
// Ignore notes from instances the user has muted // Ignore notes from instances the user has muted
if (isInstanceMuted(note, new Set<string>(this.userProfile!.mutedInstances ?? []))) return; if (isInstanceMuted(note, new Set<string>(this.userProfile!.mutedInstances))) return;
if (note.visibility === 'followers') { if (note.visibility === 'followers') {
if (!Object.hasOwn(this.following, note.userId)) return; if (!Object.hasOwn(this.following, note.userId)) return;

View file

@ -69,7 +69,7 @@ class HybridTimelineChannel extends Channel {
} }
// Ignore notes from instances the user has muted // Ignore notes from instances the user has muted
if (isInstanceMuted(note, new Set<string>(this.userProfile!.mutedInstances ?? []))) return; if (isInstanceMuted(note, new Set<string>(this.userProfile!.mutedInstances))) return;
// 関係ない返信は除外 // 関係ない返信は除外
if (note.reply && !this.following[note.userId]?.withReplies && !this.withReplies) { if (note.reply && !this.following[note.userId]?.withReplies && !this.withReplies) {

View file

@ -83,7 +83,7 @@ export class FeedService {
date: this.idService.parse(note.id).date, date: this.idService.parse(note.id).date,
description: note.cw ?? undefined, description: note.cw ?? undefined,
content: note.text ?? undefined, content: note.text ?? undefined,
image: file ? this.driveFileEntityService.getPublicUrl(file) ?? undefined : undefined, image: file ? this.driveFileEntityService.getPublicUrl(file) : undefined,
}); });
} }

View file

@ -78,24 +78,24 @@
"vuedraggable": "next" "vuedraggable": "next"
}, },
"devDependencies": { "devDependencies": {
"@storybook/addon-actions": "7.4.6", "@storybook/addon-actions": "7.5.0",
"@storybook/addon-essentials": "7.4.6", "@storybook/addon-essentials": "7.5.0",
"@storybook/addon-interactions": "7.4.6", "@storybook/addon-interactions": "7.5.0",
"@storybook/addon-links": "7.4.6", "@storybook/addon-links": "7.5.0",
"@storybook/addon-storysource": "7.4.6", "@storybook/addon-storysource": "7.5.0",
"@storybook/addons": "7.4.6", "@storybook/addons": "7.5.0",
"@storybook/blocks": "7.4.6", "@storybook/blocks": "7.5.0",
"@storybook/core-events": "7.4.6", "@storybook/core-events": "7.5.0",
"@storybook/jest": "0.2.3", "@storybook/jest": "0.2.3",
"@storybook/manager-api": "7.4.6", "@storybook/manager-api": "7.5.0",
"@storybook/preview-api": "7.4.6", "@storybook/preview-api": "7.5.0",
"@storybook/react": "7.4.6", "@storybook/react": "7.5.0",
"@storybook/react-vite": "7.4.6", "@storybook/react-vite": "7.5.0",
"@storybook/testing-library": "0.2.2", "@storybook/testing-library": "0.2.2",
"@storybook/theming": "7.4.6", "@storybook/theming": "7.5.0",
"@storybook/types": "7.4.6", "@storybook/types": "7.5.0",
"@storybook/vue3": "7.4.6", "@storybook/vue3": "7.5.0",
"@storybook/vue3-vite": "7.4.6", "@storybook/vue3-vite": "7.5.0",
"@testing-library/vue": "7.0.0", "@testing-library/vue": "7.0.0",
"@types/escape-regexp": "0.0.1", "@types/escape-regexp": "0.0.1",
"@types/estree": "1.0.2", "@types/estree": "1.0.2",
@ -129,7 +129,7 @@
"react": "18.2.0", "react": "18.2.0",
"react-dom": "18.2.0", "react-dom": "18.2.0",
"start-server-and-test": "2.0.1", "start-server-and-test": "2.0.1",
"storybook": "7.4.6", "storybook": "7.5.0",
"storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme",
"summaly": "github:misskey-dev/summaly", "summaly": "github:misskey-dev/summaly",
"vite-plugin-turbosnap": "1.0.3", "vite-plugin-turbosnap": "1.0.3",

View file

@ -190,6 +190,9 @@ const patronsWithIcon = [{
}, { }, {
name: '百日紅', name: '百日紅',
icon: 'https://misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg', icon: 'https://misskey-hub.net/patrons/302dce2898dd457ba03c3f7dc037900b.jpg',
}, {
name: 'taichan',
icon: 'https://misskey-hub.net/patrons/f981ab0159fb4e2c998e05f7263e1cd9.png',
}]; }];
const patrons = [ const patrons = [

File diff suppressed because it is too large Load diff