diff --git a/CHANGELOG.md b/CHANGELOG.md index 3562f366e8..482827d716 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,12 +6,13 @@ ### Client - Feat: 画像にウォーターマークを付与できるようになりました - Enhance: ノートのリアクション一覧で、押せるリアクションを優先して表示できるようにするオプションを追加 +- Enhance: 全てのチャットメッセージを既読にできるように(設定→その他) - Fix: ドライブファイルの選択が不安定な問題を修正 - Fix: コントロールパネルのファイル欄などのデザインが崩れている問題を修正 - Fix: ユーザーの検索結果を追加で読み込むことができない問題を修正 ### Server -- +- Feat: 全てのチャットメッセージを既読にするAPIを追加(chat/read-all) ## 2025.6.0 diff --git a/packages/backend/src/core/ChatService.ts b/packages/backend/src/core/ChatService.ts index 4e81847a52..5cd336a097 100644 --- a/packages/backend/src/core/ChatService.ts +++ b/packages/backend/src/core/ChatService.ts @@ -331,6 +331,16 @@ export class ChatService { await redisPipeline.exec(); } + @bindThis + public async readAllChatMessages( + readerId: MiUser['id'], + ): Promise { + const redisPipeline = this.redisClient.pipeline(); + // TODO: newUserChatMessageExists とか newRoomChatMessageExists も消したい(けどキーの列挙が必要になって面倒) + redisPipeline.del(`newChatMessagesExists:${readerId}`); + await redisPipeline.exec(); + } + @bindThis public findMessageById(messageId: MiChatMessage['id']) { return this.chatMessagesRepository.findOneBy({ id: messageId }); diff --git a/packages/backend/src/server/api/endpoint-list.ts b/packages/backend/src/server/api/endpoint-list.ts index 1fdd000fdf..092d296bd3 100644 --- a/packages/backend/src/server/api/endpoint-list.ts +++ b/packages/backend/src/server/api/endpoint-list.ts @@ -428,4 +428,5 @@ export * as 'chat/rooms/invitations/ignore' from './endpoints/chat/rooms/invitat export * as 'chat/rooms/invitations/inbox' from './endpoints/chat/rooms/invitations/inbox.js'; export * as 'chat/rooms/invitations/outbox' from './endpoints/chat/rooms/invitations/outbox.js'; export * as 'chat/history' from './endpoints/chat/history.js'; +export * as 'chat/read-all' from './endpoints/chat/read-all.js'; export * as 'v2/admin/emoji/list' from './endpoints/v2/admin/emoji/list.js'; diff --git a/packages/backend/src/server/api/endpoints/chat/read-all.ts b/packages/backend/src/server/api/endpoints/chat/read-all.ts new file mode 100644 index 0000000000..2ed9497eef --- /dev/null +++ b/packages/backend/src/server/api/endpoints/chat/read-all.ts @@ -0,0 +1,38 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { Inject, Injectable } from '@nestjs/common'; +import { Endpoint } from '@/server/api/endpoint-base.js'; +import { DI } from '@/di-symbols.js'; +import { ChatService } from '@/core/ChatService.js'; +import { ApiError } from '@/server/api/error.js'; + +export const meta = { + tags: ['chat'], + + requireCredential: true, + + kind: 'write:chat', + + errors: { + }, +} as const; + +export const paramDef = { + type: 'object', + properties: { + }, +} as const; + +@Injectable() +export default class extends Endpoint { // eslint-disable-line import/no-default-export + constructor( + private chatService: ChatService, + ) { + super(meta, paramDef, async (ps, me) => { + await this.chatService.readAllChatMessages(me.id); + }); + } +} diff --git a/packages/frontend/src/pages/settings/other.vue b/packages/frontend/src/pages/settings/other.vue index f09cc9c9bc..9459a9b326 100644 --- a/packages/frontend/src/pages/settings/other.vue +++ b/packages/frontend/src/pages/settings/other.vue @@ -128,6 +128,10 @@ SPDX-License-Identifier: AGPL-3.0-only
+ Read all chat messages + +
+ {{ i18n.ts.migrateOldSettings }} @@ -214,6 +218,10 @@ function hideAllTips() { os.success(); } +function readAllChatMessages() { + os.apiWithDialog('chat/read-all', {}); +} + const headerActions = computed(() => []); const headerTabs = computed(() => []);