From eda2f587a389ecc67642b855c70d7aa65b41a38b Mon Sep 17 00:00:00 2001 From: syuilo <4439005+syuilo@users.noreply.github.com> Date: Wed, 16 Apr 2025 16:47:03 +0900 Subject: [PATCH] =?UTF-8?q?enhance:=20=E3=82=B3=E3=83=B3=E3=83=88=E3=83=AD?= =?UTF-8?q?=E3=83=BC=E3=83=AB=E3=83=91=E3=83=8D=E3=83=AB=E3=81=A7=E3=82=B8?= =?UTF-8?q?=E3=83=A7=E3=83=96=E3=82=AD=E3=83=A5=E3=83=BC=E3=82=92=E3=82=AF?= =?UTF-8?q?=E3=83=AA=E3=82=A2=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 1 + packages/backend/src/core/QueueService.ts | 50 +++++++++++++++---- .../server/api/endpoints/admin/queue/clear.ts | 11 ++-- packages/frontend/src/pages/admin/queue.vue | 8 +-- packages/misskey-js/etc/misskey-js.api.md | 4 ++ packages/misskey-js/src/autogen/endpoint.ts | 3 +- packages/misskey-js/src/autogen/entities.ts | 1 + packages/misskey-js/src/autogen/types.ts | 10 ++++ 8 files changed, 71 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 898c474883..87dc28d6c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ - Feat: チャットウィジェットを追加 - Feat: デッキにチャットカラムを追加 - Enhance: Unicode絵文字をslugから入力する際に`:ok:`のように最後の`:`を入力したあとにUnicode絵文字に変換できるように +- Enhance: コントロールパネルでジョブキューをクリアできるように - Enhance: テーマでページヘッダーの色を変更できるように - Enhance: デザインのブラッシュアップ - Fix: ログアウトした際に処理が終了しない問題を修正 diff --git a/packages/backend/src/core/QueueService.ts b/packages/backend/src/core/QueueService.ts index da76dd1284..eb02355625 100644 --- a/packages/backend/src/core/QueueService.ts +++ b/packages/backend/src/core/QueueService.ts @@ -38,6 +38,18 @@ import type { import type httpSignature from '@peertube/http-signature'; import type * as Bull from 'bullmq'; +export const QUEUE_TYPES = [ + 'system', + 'endedPollNotification', + 'deliver', + 'inbox', + 'db', + 'relationship', + 'objectStorage', + 'userWebhookDeliver', + 'systemWebhookDeliver', +] as const; + @Injectable() export class QueueService { constructor( @@ -529,15 +541,35 @@ export class QueueService { } @bindThis - public destroy() { - this.deliverQueue.once('cleaned', (jobs, status) => { - //deliverLogger.succ(`Cleaned ${jobs.length} ${status} jobs`); - }); - this.deliverQueue.clean(0, 0, 'delayed'); + private getQueue(type: typeof QUEUE_TYPES[number]) { + switch (type) { + case 'system': return this.systemQueue; + case 'endedPollNotification': return this.endedPollNotificationQueue; + case 'deliver': return this.deliverQueue; + case 'inbox': return this.inboxQueue; + case 'db': return this.dbQueue; + case 'relationship': return this.relationshipQueue; + case 'objectStorage': return this.objectStorageQueue; + case 'userWebhookDeliver': return this.userWebhookDeliverQueue; + case 'systemWebhookDeliver': return this.systemWebhookDeliverQueue; + default: throw new Error(`Unrecognized queue type: ${type}`); + } + } - this.inboxQueue.once('cleaned', (jobs, status) => { - //inboxLogger.succ(`Cleaned ${jobs.length} ${status} jobs`); - }); - this.inboxQueue.clean(0, 0, 'delayed'); + @bindThis + public clearQueue(queueType: typeof QUEUE_TYPES[number], state: '*' | 'completed' | 'wait' | 'active' | 'paused' | 'prioritized' | 'delayed' | 'failed') { + const queue = this.getQueue(queueType); + + if (state === '*') { + queue.clean(0, 0, 'completed'); + queue.clean(0, 0, 'wait'); + queue.clean(0, 0, 'active'); + queue.clean(0, 0, 'paused'); + queue.clean(0, 0, 'prioritized'); + queue.clean(0, 0, 'delayed'); + queue.clean(0, 0, 'failed'); + } else { + queue.clean(0, 0, state); + } } } diff --git a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts index 3f7df0e63d..3978f14f2d 100644 --- a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts +++ b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts @@ -6,7 +6,7 @@ import { Injectable } from '@nestjs/common'; import { Endpoint } from '@/server/api/endpoint-base.js'; import { ModerationLogService } from '@/core/ModerationLogService.js'; -import { QueueService } from '@/core/QueueService.js'; +import { QUEUE_TYPES, QueueService } from '@/core/QueueService.js'; export const meta = { tags: ['admin'], @@ -18,8 +18,11 @@ export const meta = { export const paramDef = { type: 'object', - properties: {}, - required: [], + properties: { + type: { type: 'string', enum: QUEUE_TYPES }, + state: { type: 'string', enum: ['*', 'wait', 'delayed'] }, + }, + required: ['type', 'state'], } as const; @Injectable() @@ -29,7 +32,7 @@ export default class extends Endpoint { // eslint- private queueService: QueueService, ) { super(meta, paramDef, async (ps, me) => { - this.queueService.destroy(); + this.queueService.clearQueue(ps.type, ps.state); this.moderationLogService.log(me, 'clearQueue'); }); diff --git a/packages/frontend/src/pages/admin/queue.vue b/packages/frontend/src/pages/admin/queue.vue index b5aee1e51e..ee56c258c9 100644 --- a/packages/frontend/src/pages/admin/queue.vue +++ b/packages/frontend/src/pages/admin/queue.vue @@ -10,14 +10,16 @@ SPDX-License-Identifier: AGPL-3.0-only
- {{ i18n.ts.retryAllQueuesNow }} +
+ {{ i18n.ts.retryAllQueuesNow }} + {{ i18n.ts.clearQueue }} +