diff --git a/CHANGELOG.md b/CHANGELOG.md index 55cebf6aad..605434f52e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,7 @@ - 最大でも黄色いエリア内にデコレーションを収めることを推奨します。 - 画像は512x512pxを推奨します。 - Enhance: すでにフォローしたすべての人の返信をTLに追加できるように +- Enhance: 未読の通知数を表示できるように - Enhance: ローカリゼーションの更新 - Enhance: 依存関係の更新 @@ -53,6 +54,7 @@ - Enhance: フォローしているチャンネルをフォロー解除した時(またはその逆)、タイムラインに反映される間隔を改善 - Enhance: プロフィールの自己紹介欄のMFMが連合するようになりました - 相手がMisskey v2023.11.0以降である必要があります +- Enhance: チャンネル取得時のパフォーマンスを向上 - Fix: リストTLに自分のフォロワー限定投稿が含まれない問題を修正 - Fix: ローカルタイムラインに投稿者自身の投稿への返信が含まれない問題を修正 - Fix: 自分のフォローしているユーザーの自分のフォローしていないユーザーの visibility: followers な投稿への返信がストリーミングで流れてくる問題を修正 @@ -63,6 +65,7 @@ - Fix: リノートをリノートできるのを修正 - Fix: アクセストークンを削除すると、通知が取得できなくなる場合がある問題を修正 - Fix: 自身の宛先なしダイレクト投稿がストリーミングで流れてこない問題を修正 +- Fix: サーバーサイドからのテスト通知を正しく行えるように修正 ## 2023.10.2 diff --git a/locales/en-US.yml b/locales/en-US.yml index 289c341123..234fb183a2 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1240,7 +1240,7 @@ releaseToRefresh: "Release to refresh" refreshing: "Loading..." pullDownToRefresh: "Pull down to refresh" disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする" -showUnreadNotificationCount: "Show the number of unread notifications" +showUnreadNotificationsCount: "Show the number of unread notifications" showCatOnly: "Show only cats" additionalPermissionsForFlash: "Allow to add permission to Play" thisFlashRequiresTheFollowingPermissions: "This Play requires the following permissions" diff --git a/locales/index.d.ts b/locales/index.d.ts index 4b7d3805d9..b9af2a734c 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -1245,7 +1245,7 @@ export interface Locale { "refreshing": string; "pullDownToRefresh": string; "disableStreamingTimeline": string; - "showUnreadNotificationCount": string; + "showUnreadNotificationsCount": string; "showCatOnly": string; "additionalPermissionsForFlash": string; "thisFlashRequiresTheFollowingPermissions": string; diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 1bc06ee832..a58bde1844 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1242,7 +1242,7 @@ releaseToRefresh: "離してリロード" refreshing: "リロード中" pullDownToRefresh: "引っ張ってリロード" disableStreamingTimeline: "タイムラインのリアルタイム更新を無効にする" -showUnreadNotificationCount: "未読の通知の数を表示する" +showUnreadNotificationsCount: "未読の通知の数を表示する" showCatOnly: "キャット付きのみ" additionalPermissionsForFlash: "Playへの追加許可" thisFlashRequiresTheFollowingPermissions: "このPlayは以下の権限を要求しています" diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml index 82ca615a9a..a108b9994c 100644 --- a/locales/ko-KR.yml +++ b/locales/ko-KR.yml @@ -1217,7 +1217,7 @@ releaseToRefresh: "놓아서 새로 고침" refreshing: "새로 고침 중" pullDownToRefresh: "당겨서 새로 고침" disableStreamingTimeline: "타임라인 실시간 업데이트 비활성화" -showUnreadNotificationCount: "읽지 않은 알림 수 표시" +showUnreadNotificationsCount: "읽지 않은 알림 수 표시" showCatOnly: "고양이만 보기" additionalPermissionsForFlash: "Play에 대한 추가 권한" thisFlashRequiresTheFollowingPermissions: "이 Play는 다음 권한을 요구해요" diff --git a/package.json b/package.json index 9756e89c0a..bb4c3b017f 100644 --- a/package.json +++ b/package.json @@ -52,14 +52,14 @@ "cssnano": "6.0.1", "js-yaml": "4.1.0", "postcss": "8.4.31", - "terser": "5.22.0", + "terser": "5.24.0", "typescript": "5.2.2" }, "devDependencies": { - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "cross-env": "7.0.3", - "cypress": "13.3.3", + "cypress": "13.4.0", "eslint": "8.52.0", "start-server-and-test": "2.0.1" }, diff --git a/packages/backend/package.json b/packages/backend/package.json index ebbd4c3e1d..1decf94415 100644 --- a/packages/backend/package.json +++ b/packages/backend/package.json @@ -67,11 +67,11 @@ "@discordapp/twemoji": "14.1.2", "@fastify/accepts": "4.2.0", "@fastify/cookie": "9.1.0", - "@fastify/cors": "8.4.0", + "@fastify/cors": "8.4.1", "@fastify/express": "2.3.0", "@fastify/http-proxy": "9.2.1", "@fastify/multipart": "8.0.0", - "@fastify/static": "6.11.2", + "@fastify/static": "6.12.0", "@fastify/view": "8.2.0", "@google-cloud/logging": "^10.5.0", "@google-cloud/translate": "^7.2.1", @@ -79,7 +79,7 @@ "@nestjs/core": "10.2.7", "@nestjs/testing": "10.2.7", "@peertube/http-signature": "1.7.0", - "@simplewebauthn/server": "8.3.4", + "@simplewebauthn/server": "8.3.5", "@sinonjs/fake-timers": "11.2.2", "@swc/cli": "0.1.62", "@swc/core": "1.3.95", @@ -91,7 +91,7 @@ "bcryptjs": "2.4.3", "blurhash": "2.0.5", "body-parser": "1.20.2", - "bullmq": "4.12.6", + "bullmq": "4.12.7", "cacheable-lookup": "7.0.0", "cbor": "9.0.1", "chalk": "5.3.0", @@ -142,7 +142,7 @@ "probe-image-size": "7.2.3", "promise-limit": "2.7.0", "pug": "3.0.2", - "punycode": "2.3.0", + "punycode": "2.3.1", "pureimage": "0.3.17", "qrcode": "1.5.3", "random-seed": "0.3.0", @@ -180,7 +180,7 @@ "@simplewebauthn/typescript-types": "8.3.4", "@swc/jest": "0.2.29", "@types/accepts": "1.3.6", - "@types/archiver": "5.3.4", + "@types/archiver": "6.0.0", "@types/bcryptjs": "2.4.5", "@types/body-parser": "1.19.4", "@types/cbor": "6.0.0", @@ -188,14 +188,14 @@ "@types/content-disposition": "0.5.7", "@types/fluent-ffmpeg": "2.1.23", "@types/http-link-header": "1.0.4", - "@types/jest": "29.5.6", + "@types/jest": "29.5.7", "@types/js-yaml": "4.0.8", "@types/jsdom": "21.1.4", "@types/jsonld": "1.5.11", "@types/jsrsasign": "10.5.11", "@types/mime-types": "2.1.3", "@types/ms": "0.7.33", - "@types/node": "20.8.9", + "@types/node": "20.8.10", "@types/node-fetch": "3.0.3", "@types/nodemailer": "6.4.13", "@types/oauth": "0.9.3", @@ -218,8 +218,8 @@ "@types/vary": "1.1.2", "@types/web-push": "3.6.2", "@types/ws": "8.5.8", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "aws-sdk-client-mock": "3.0.0", "cross-env": "7.0.3", "eslint": "8.52.0", diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts index 1856600943..f491239e0c 100644 --- a/packages/backend/src/config.ts +++ b/packages/backend/src/config.ts @@ -278,7 +278,7 @@ export function loadConfig(): Config { clientEntry: clientManifest['src/_boot_.ts'], clientManifestExists: clientManifestExists, perChannelMaxNoteCacheCount: config.perChannelMaxNoteCacheCount ?? 1000, - perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 300, + perUserNotificationsMaxCount: config.perUserNotificationsMaxCount ?? 500, deactivateAntennaThreshold: config.deactivateAntennaThreshold ?? (1000 * 60 * 60 * 24 * 7), pidFile: config.pidFile, }; diff --git a/packages/backend/src/core/entities/ChannelEntityService.ts b/packages/backend/src/core/entities/ChannelEntityService.ts index 9a89f78fa9..5b4de3389e 100644 --- a/packages/backend/src/core/entities/ChannelEntityService.ts +++ b/packages/backend/src/core/entities/ChannelEntityService.ts @@ -5,7 +5,7 @@ import { Inject, Injectable } from '@nestjs/common'; import { DI } from '@/di-symbols.js'; -import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, NoteUnreadsRepository, NotesRepository } from '@/models/_.js'; +import type { ChannelFavoritesRepository, ChannelFollowingsRepository, ChannelsRepository, DriveFilesRepository, NotesRepository } from '@/models/_.js'; import type { Packed } from '@/misc/json-schema.js'; import type { } from '@/models/Blocking.js'; import type { MiUser } from '@/models/User.js'; @@ -31,9 +31,6 @@ export class ChannelEntityService { @Inject(DI.notesRepository) private notesRepository: NotesRepository, - @Inject(DI.noteUnreadsRepository) - private noteUnreadsRepository: NoteUnreadsRepository, - @Inject(DI.driveFilesRepository) private driveFilesRepository: DriveFilesRepository, @@ -54,13 +51,6 @@ export class ChannelEntityService { const banner = channel.bannerId ? await this.driveFilesRepository.findOneBy({ id: channel.bannerId }) : null; - const hasUnreadNote = meId ? await this.noteUnreadsRepository.exist({ - where: { - noteChannelId: channel.id, - userId: meId, - }, - }) : undefined; - const isFollowing = meId ? await this.channelFollowingsRepository.exist({ where: { followerId: meId, @@ -99,7 +89,7 @@ export class ChannelEntityService { ...(me ? { isFollowing, isFavorited, - hasUnreadNote, + hasUnreadNote: false, // 後方互換性のため } : {}), ...(detailed ? { diff --git a/packages/backend/src/core/entities/UserEntityService.ts b/packages/backend/src/core/entities/UserEntityService.ts index 648e29261d..1e6d628f2c 100644 --- a/packages/backend/src/core/entities/UserEntityService.ts +++ b/packages/backend/src/core/entities/UserEntityService.ts @@ -506,9 +506,9 @@ export class UserEntityService implements OnModuleInit { hasUnreadAntenna: this.getHasUnreadAntenna(user.id), hasUnreadChannel: false, // 後方互換性のため hasUnreadMessagingMessage: this.getHasUnreadMessagingMessage(user.id), - hasUnreadNotification: notificationsInfo?.hasUnread, + hasUnreadNotification: notificationsInfo?.hasUnread, // 後方互換性のため hasPendingReceivedFollowRequest: this.getHasPendingReceivedFollowRequest(user.id), - unreadNotificationCount: notificationsInfo?.unreadCount, + unreadNotificationsCount: notificationsInfo?.unreadCount, mutedWords: profile!.mutedWords, mutedInstances: profile!.mutedInstances, mutingNotificationTypes: [], // 後方互換性のため diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts index a7e7114c1c..b21426145e 100644 --- a/packages/backend/src/models/json-schema/user.ts +++ b/packages/backend/src/models/json-schema/user.ts @@ -403,7 +403,7 @@ export const packedMeDetailedOnlySchema = { type: 'boolean', nullable: false, optional: false, }, - unreadNotificationCount: { + unreadNotificationsCount: { type: 'number', nullable: false, optional: false, }, diff --git a/packages/backend/test/e2e/clips.ts b/packages/backend/test/e2e/clips.ts index f93e2df399..25ec521d2c 100644 --- a/packages/backend/test/e2e/clips.ts +++ b/packages/backend/test/e2e/clips.ts @@ -720,7 +720,7 @@ describe('クリップ', () => { test('を追加できる。', async () => { await addNote({ clipId: aliceClip.id, noteId: aliceNote.id }); const res = await show({ clipId: aliceClip.id }); - assert.strictEqual(res.lastClippedAt, new Date(res.lastClippedAt ?? '').toISOString()); + assert.strictEqual(res.lastClippedAt, res.lastClippedAt ? new Date(res.lastClippedAt).toISOString() : null); assert.deepStrictEqual((await notes({ clipId: aliceClip.id })).map(x => x.id), [aliceNote.id]); // 他人の非公開ノートも突っ込める diff --git a/packages/backend/test/e2e/users.ts b/packages/backend/test/e2e/users.ts index 4c33c36c72..89bacc7bd3 100644 --- a/packages/backend/test/e2e/users.ts +++ b/packages/backend/test/e2e/users.ts @@ -165,7 +165,7 @@ describe('ユーザー', () => { hasUnreadAntenna: user.hasUnreadAntenna, hasUnreadChannel: user.hasUnreadChannel, hasUnreadNotification: user.hasUnreadNotification, - unreadNotificationCount: user.unreadNotificationCount, + unreadNotificationsCount: user.unreadNotificationsCount, hasPendingReceivedFollowRequest: user.hasPendingReceivedFollowRequest, unreadAnnouncements: user.unreadAnnouncements, mutedWords: user.mutedWords, @@ -417,7 +417,7 @@ describe('ユーザー', () => { assert.strictEqual(response.hasUnreadAntenna, false); assert.strictEqual(response.hasUnreadChannel, false); assert.strictEqual(response.hasUnreadNotification, false); - assert.strictEqual(response.unreadNotificationCount, 0); + assert.strictEqual(response.unreadNotificationsCount, 0); assert.strictEqual(response.hasPendingReceivedFollowRequest, false); assert.deepStrictEqual(response.unreadAnnouncements, []); assert.deepStrictEqual(response.mutedWords, []); diff --git a/packages/cherrypick-js/etc/cherrypick-js.api.md b/packages/cherrypick-js/etc/cherrypick-js.api.md index 5e134faf62..0989ec8d72 100644 --- a/packages/cherrypick-js/etc/cherrypick-js.api.md +++ b/packages/cherrypick-js/etc/cherrypick-js.api.md @@ -2553,7 +2553,7 @@ type MeDetailed = UserDetailed & { hasUnreadMessagingMessage: boolean; hasUnreadNotification: boolean; hasUnreadSpecifiedNotes: boolean; - unreadNotificationCount: number; + unreadNotificationsCount: number; hideOnlineStatus: boolean; injectFeaturedNote: boolean; integrations: Record; diff --git a/packages/cherrypick-js/package.json b/packages/cherrypick-js/package.json index 05de8bb5a0..334ad09dd2 100644 --- a/packages/cherrypick-js/package.json +++ b/packages/cherrypick-js/package.json @@ -20,12 +20,12 @@ "url": "git+https://github.com/misskey-dev/misskey.js.git" }, "devDependencies": { - "@microsoft/api-extractor": "7.38.0", + "@microsoft/api-extractor": "7.38.1", "@swc/jest": "0.2.29", - "@types/jest": "29.5.6", - "@types/node": "20.8.9", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@types/jest": "29.5.7", + "@types/node": "20.8.10", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "eslint": "8.52.0", "jest": "29.7.0", "jest-fetch-mock": "3.0.3", diff --git a/packages/cherrypick-js/src/entities.ts b/packages/cherrypick-js/src/entities.ts index ae6e438686..41ae8faf17 100644 --- a/packages/cherrypick-js/src/entities.ts +++ b/packages/cherrypick-js/src/entities.ts @@ -106,7 +106,7 @@ export type MeDetailed = UserDetailed & { hasUnreadMessagingMessage: boolean; hasUnreadNotification: boolean; hasUnreadSpecifiedNotes: boolean; - unreadNotificationCount: number; + unreadNotificationsCount: number; hideOnlineStatus: boolean; injectFeaturedNote: boolean; integrations: Record; diff --git a/packages/frontend/package.json b/packages/frontend/package.json index 79b240b011..d858c926ad 100644 --- a/packages/frontend/package.json +++ b/packages/frontend/package.json @@ -10,7 +10,7 @@ "build-storybook": "pnpm build-storybook-pre && storybook build", "chromatic": "chromatic", "test": "vitest --run", - "test-and-coverage": "vitest --run --coverage", + "test-and-coverage": "vitest --run --coverage --globals", "typecheck": "vue-tsc --noEmit", "eslint": "eslint --quiet \"src/**/*.{ts,vue}\"", "lint": "pnpm typecheck && pnpm eslint" @@ -21,7 +21,7 @@ "@github/webauthn-json": "2.1.1", "@rollup/plugin-alias": "5.0.1", "@rollup/plugin-json": "6.0.1", - "@rollup/plugin-replace": "5.0.4", + "@rollup/plugin-replace": "5.0.5", "@rollup/pluginutils": "5.0.5", "@syuilo/aiscript": "0.16.0", "@tabler/icons-webfont": "2.37.0", @@ -31,7 +31,7 @@ "astring": "1.8.6", "autosize": "6.0.1", "aiscript-vscode": "github:aiscript-dev/aiscript-vscode#v0.0.5", - "broadcast-channel": "5.5.1", + "broadcast-channel": "6.0.0", "browser-image-resizer": "github:misskey-dev/browser-image-resizer#v2.2.1-misskey.3", "buraha": "0.0.1", "canvas-confetti": "1.6.1", @@ -42,7 +42,7 @@ "chartjs-plugin-zoom": "2.0.1", "cherrypick-js": "workspace:*", "cherrypick-mfm-js": "github:kokonect-link/mfm.js", - "chromatic": "7.5.4", + "chromatic": "7.6.0", "compare-versions": "6.1.0", "cropperjs": "2.0.0-beta.4", "date-fns": "2.30.0", @@ -59,9 +59,9 @@ "pretendard": "^1.3.8", "pretendard-jp": "^1.3.8", "prismjs": "1.29.0", - "punycode": "2.3.0", + "punycode": "2.3.1", "querystring": "0.2.1", - "rollup": "4.1.4", + "rollup": "4.2.0", "sanitize-html": "2.11.0", "shiki": "^0.14.5", "sass": "1.69.5", @@ -84,31 +84,31 @@ "vuedraggable": "next" }, "devDependencies": { - "@storybook/addon-actions": "7.5.1", - "@storybook/addon-essentials": "7.5.1", - "@storybook/addon-interactions": "7.5.1", - "@storybook/addon-links": "7.5.1", - "@storybook/addon-storysource": "7.5.1", - "@storybook/addons": "7.5.1", - "@storybook/blocks": "7.5.1", - "@storybook/core-events": "7.5.1", + "@storybook/addon-actions": "7.5.2", + "@storybook/addon-essentials": "7.5.2", + "@storybook/addon-interactions": "7.5.2", + "@storybook/addon-links": "7.5.2", + "@storybook/addon-storysource": "7.5.2", + "@storybook/addons": "7.5.2", + "@storybook/blocks": "7.5.2", + "@storybook/core-events": "7.5.2", "@storybook/jest": "0.2.3", - "@storybook/manager-api": "7.5.1", - "@storybook/preview-api": "7.5.1", - "@storybook/react": "7.5.1", - "@storybook/react-vite": "7.5.1", + "@storybook/manager-api": "7.5.2", + "@storybook/preview-api": "7.5.2", + "@storybook/react": "7.5.2", + "@storybook/react-vite": "7.5.2", "@storybook/testing-library": "0.2.2", - "@storybook/theming": "7.5.1", - "@storybook/types": "7.5.1", - "@storybook/vue3": "7.5.1", - "@storybook/vue3-vite": "7.5.1", - "@testing-library/vue": "7.0.0", + "@storybook/theming": "7.5.2", + "@storybook/types": "7.5.2", + "@storybook/vue3": "7.5.2", + "@storybook/vue3-vite": "7.5.2", + "@testing-library/vue": "8.0.0", "@types/autosize": "^4.0.1", "@types/escape-regexp": "0.0.2", - "@types/estree": "1.0.3", + "@types/estree": "1.0.4", "@types/matter-js": "0.19.2", "@types/micromatch": "4.0.4", - "@types/node": "20.8.9", + "@types/node": "20.8.10", "@types/prismjs": "^1.26.0", "@types/punycode": "2.1.1", "@types/sanitize-html": "2.9.3", @@ -117,13 +117,13 @@ "@types/uuid": "9.0.6", "@types/websocket": "1.0.8", "@types/ws": "8.5.8", - "@typescript-eslint/eslint-plugin": "6.9.0", - "@typescript-eslint/parser": "6.9.0", + "@typescript-eslint/eslint-plugin": "6.9.1", + "@typescript-eslint/parser": "6.9.1", "@vitest/coverage-v8": "0.34.6", "@vue/runtime-core": "3.3.7", "acorn": "8.11.2", "cross-env": "7.0.3", - "cypress": "13.3.3", + "cypress": "13.4.0", "eslint": "8.52.0", "eslint-plugin-import": "2.29.0", "eslint-plugin-storybook": "^0.6.13", @@ -138,7 +138,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "start-server-and-test": "2.0.1", - "storybook": "7.5.1", + "storybook": "7.5.2", "storybook-addon-misskey-theme": "github:misskey-dev/storybook-addon-misskey-theme", "summaly": "github:misskey-dev/summaly", "vite-plugin-turbosnap": "1.0.3", diff --git a/packages/frontend/src/boot/main-boot.ts b/packages/frontend/src/boot/main-boot.ts index 4af0425439..7f388991f9 100644 --- a/packages/frontend/src/boot/main-boot.ts +++ b/packages/frontend/src/boot/main-boot.ts @@ -231,15 +231,15 @@ export async function mainBoot() { main.on('readAllNotifications', () => { updateAccount({ hasUnreadNotification: false, - unreadNotificationCount: 0, + unreadNotificationsCount: 0, }); }); main.on('unreadNotification', () => { - const unreadNotificationCount = ($i?.unreadNotificationCount ?? 0) + 1; + const unreadNotificationsCount = ($i?.unreadNotificationsCount ?? 0) + 1; updateAccount({ hasUnreadNotification: true, - unreadNotificationCount, + unreadNotificationsCount, }); }); diff --git a/packages/frontend/src/components/MkLaunchPad.vue b/packages/frontend/src/components/MkLaunchPad.vue index e034274c1b..7e840fb840 100644 --- a/packages/frontend/src/components/MkLaunchPad.vue +++ b/packages/frontend/src/components/MkLaunchPad.vue @@ -7,17 +7,17 @@ SPDX-License-Identifier: AGPL-3.0-only
-