summaryrefslogtreecommitdiff
path: root/packages/backend/src/server
diff options
context:
space:
mode:
authorsyuilo <4439005+syuilo@users.noreply.github.com>2025-07-06 09:54:49 +0900
committersyuilo <4439005+syuilo@users.noreply.github.com>2025-07-06 09:54:49 +0900
commite6ec15e397e150a12486d097d4b789a98b7ae639 (patch)
treea113d1a6353eed0488bae17f2ee490974c50351e /packages/backend/src/server
parentclean up (diff)
downloadmisskey-e6ec15e397e150a12486d097d4b789a98b7ae639.tar.gz
misskey-e6ec15e397e150a12486d097d4b789a98b7ae639.tar.bz2
misskey-e6ec15e397e150a12486d097d4b789a98b7ae639.zip
feat: 特定のドライブファイルを添付しているチャットメッセージを一覧できるように
Diffstat (limited to 'packages/backend/src/server')
-rw-r--r--packages/backend/src/server/api/endpoint-list.ts1
-rw-r--r--packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts85
2 files changed, 86 insertions, 0 deletions
diff --git a/packages/backend/src/server/api/endpoint-list.ts b/packages/backend/src/server/api/endpoint-list.ts
index eb83c11b39..5c4a58a6fc 100644
--- a/packages/backend/src/server/api/endpoint-list.ts
+++ b/packages/backend/src/server/api/endpoint-list.ts
@@ -168,6 +168,7 @@ export * as 'clips/update' from './endpoints/clips/update.js';
export * as 'drive' from './endpoints/drive.js';
export * as 'drive/files' from './endpoints/drive/files.js';
export * as 'drive/files/attached-notes' from './endpoints/drive/files/attached-notes.js';
+export * as 'drive/files/attached-chat-messages' from './endpoints/drive/files/attached-chat-messages.js';
export * as 'drive/files/check-existence' from './endpoints/drive/files/check-existence.js';
export * as 'drive/files/create' from './endpoints/drive/files/create.js';
export * as 'drive/files/delete' from './endpoints/drive/files/delete.js';
diff --git a/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts b/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts
new file mode 100644
index 0000000000..5be477f468
--- /dev/null
+++ b/packages/backend/src/server/api/endpoints/drive/files/attached-chat-messages.ts
@@ -0,0 +1,85 @@
+/*
+ * 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 type { DriveFilesRepository, ChatMessagesRepository } from '@/models/_.js';
+import { QueryService } from '@/core/QueryService.js';
+import { DI } from '@/di-symbols.js';
+import { RoleService } from '@/core/RoleService.js';
+import { ChatEntityService } from '@/core/entities/ChatEntityService.js';
+import { ApiError } from '../../../error.js';
+
+export const meta = {
+ tags: ['drive', 'chat'],
+
+ requireCredential: true,
+
+ kind: 'read:drive',
+
+ res: {
+ type: 'array',
+ optional: false, nullable: false,
+ items: {
+ type: 'object',
+ optional: false, nullable: false,
+ ref: 'ChatMessage',
+ },
+ },
+
+ errors: {
+ noSuchFile: {
+ message: 'No such file.',
+ code: 'NO_SUCH_FILE',
+ id: '485ce26d-f5d2-4313-9783-e689d131eafb',
+ },
+ },
+} as const;
+
+export const paramDef = {
+ type: 'object',
+ properties: {
+ sinceId: { type: 'string', format: 'misskey:id' },
+ untilId: { type: 'string', format: 'misskey:id' },
+ sinceDate: { type: 'integer' },
+ untilDate: { type: 'integer' },
+ limit: { type: 'integer', minimum: 1, maximum: 100, default: 10 },
+ fileId: { type: 'string', format: 'misskey:id' },
+ },
+ required: ['fileId'],
+} as const;
+
+@Injectable()
+export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-disable-line import/no-default-export
+ constructor(
+ @Inject(DI.driveFilesRepository)
+ private driveFilesRepository: DriveFilesRepository,
+
+ @Inject(DI.chatMessagesRepository)
+ private chatMessagesRepository: ChatMessagesRepository,
+
+ private chatEntityService: ChatEntityService,
+ private queryService: QueryService,
+ private roleService: RoleService,
+ ) {
+ super(meta, paramDef, async (ps, me) => {
+ const file = await this.driveFilesRepository.findOneBy({
+ id: ps.fileId,
+ userId: await this.roleService.isModerator(me) ? undefined : me.id,
+ });
+
+ if (file == null) {
+ throw new ApiError(meta.errors.noSuchFile);
+ }
+
+ const query = this.queryService.makePaginationQuery(this.chatMessagesRepository.createQueryBuilder('message'), ps.sinceId, ps.untilId, ps.sinceDate, ps.untilDate);
+ query.andWhere('message.fileId = :fileId', { fileId: file.id });
+
+ const messages = await query.limit(ps.limit).getMany();
+
+ return await this.chatEntityService.packMessagesDetailed(messages, me);
+ });
+ }
+}