From 0e4a111f81cceed275d9bec2695f6e401fb654d8 Mon Sep 17 00:00:00 2001 From: syuilo Date: Fri, 12 Nov 2021 02:02:25 +0900 Subject: refactoring Resolve #7779 --- .../src/server/api/endpoints/admin/queue/clear.ts | 18 +++++ .../api/endpoints/admin/queue/deliver-delayed.ts | 55 +++++++++++++++ .../api/endpoints/admin/queue/inbox-delayed.ts | 55 +++++++++++++++ .../src/server/api/endpoints/admin/queue/jobs.ts | 81 ++++++++++++++++++++++ .../src/server/api/endpoints/admin/queue/stats.ts | 44 ++++++++++++ 5 files changed, 253 insertions(+) create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/clear.ts create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/jobs.ts create mode 100644 packages/backend/src/server/api/endpoints/admin/queue/stats.ts (limited to 'packages/backend/src/server/api/endpoints/admin/queue') diff --git a/packages/backend/src/server/api/endpoints/admin/queue/clear.ts b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts new file mode 100644 index 0000000000..fedb7065ab --- /dev/null +++ b/packages/backend/src/server/api/endpoints/admin/queue/clear.ts @@ -0,0 +1,18 @@ +import define from '../../../define'; +import { destroy } from '@/queue/index'; +import { insertModerationLog } from '@/services/insert-moderation-log'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: {} +}; + +export default define(meta, async (ps, me) => { + destroy(); + + insertModerationLog(me, 'clearQueue'); +}); diff --git a/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts new file mode 100644 index 0000000000..cd7b640983 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts @@ -0,0 +1,55 @@ +import { deliverQueue } from '@/queue/queues'; +import { URL } from 'url'; +import define from '../../../define'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: { + }, + + res: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + anyOf: [ + { + type: 'string' as const, + }, + { + type: 'number' as const, + } + ] + } + }, + example: [[ + 'example.com', + 12 + ]] + } +}; + +export default define(meta, async (ps) => { + const jobs = await deliverQueue.getJobs(['delayed']); + + const res = [] as [string, number][]; + + for (const job of jobs) { + const host = new URL(job.data.to).host; + if (res.find(x => x[0] === host)) { + res.find(x => x[0] === host)![1]++; + } else { + res.push([host, 1]); + } + } + + res.sort((a, b) => b[1] - a[1]); + + return res; +}); diff --git a/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts new file mode 100644 index 0000000000..1925906c28 --- /dev/null +++ b/packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts @@ -0,0 +1,55 @@ +import { URL } from 'url'; +import define from '../../../define'; +import { inboxQueue } from '@/queue/queues'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: { + }, + + res: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + anyOf: [ + { + type: 'string' as const, + }, + { + type: 'number' as const, + } + ] + } + }, + example: [[ + 'example.com', + 12 + ]] + } +}; + +export default define(meta, async (ps) => { + const jobs = await inboxQueue.getJobs(['delayed']); + + const res = [] as [string, number][]; + + for (const job of jobs) { + const host = new URL(job.data.signature.keyId).host; + if (res.find(x => x[0] === host)) { + res.find(x => x[0] === host)![1]++; + } else { + res.push([host, 1]); + } + } + + res.sort((a, b) => b[1] - a[1]); + + return res; +}); diff --git a/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts b/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts new file mode 100644 index 0000000000..c426e5f39b --- /dev/null +++ b/packages/backend/src/server/api/endpoints/admin/queue/jobs.ts @@ -0,0 +1,81 @@ +import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues'; +import $ from 'cafy'; +import define from '../../../define'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: { + domain: { + validator: $.str.or(['deliver', 'inbox', 'db', 'objectStorage']), + }, + + state: { + validator: $.str.or(['active', 'waiting', 'delayed']), + }, + + limit: { + validator: $.optional.num, + default: 50 + }, + }, + + res: { + type: 'array' as const, + optional: false as const, nullable: false as const, + items: { + type: 'object' as const, + optional: false as const, nullable: false as const, + properties: { + id: { + type: 'string' as const, + optional: false as const, nullable: false as const, + format: 'id' + }, + data: { + type: 'object' as const, + optional: false as const, nullable: false as const + }, + attempts: { + type: 'number' as const, + optional: false as const, nullable: false as const + }, + maxAttempts: { + type: 'number' as const, + optional: false as const, nullable: false as const + }, + timestamp: { + type: 'number' as const, + optional: false as const, nullable: false as const + } + } + } + } +}; + +export default define(meta, async (ps) => { + const queue = + ps.domain === 'deliver' ? deliverQueue : + ps.domain === 'inbox' ? inboxQueue : + ps.domain === 'db' ? dbQueue : + ps.domain === 'objectStorage' ? objectStorageQueue : + null as never; + + const jobs = await queue.getJobs([ps.state], 0, ps.limit!); + + return jobs.map(job => { + const data = job.data; + delete data.content; + delete data.user; + return { + id: job.id, + data, + attempts: job.attemptsMade, + maxAttempts: job.opts ? job.opts.attempts : 0, + timestamp: job.timestamp, + }; + }); +}); diff --git a/packages/backend/src/server/api/endpoints/admin/queue/stats.ts b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts new file mode 100644 index 0000000000..38f18459dd --- /dev/null +++ b/packages/backend/src/server/api/endpoints/admin/queue/stats.ts @@ -0,0 +1,44 @@ +import { deliverQueue, inboxQueue, dbQueue, objectStorageQueue } from '@/queue/queues'; +import define from '../../../define'; + +export const meta = { + tags: ['admin'], + + requireCredential: true as const, + requireModerator: true, + + params: {}, + + res: { + type: 'object' as const, + optional: false as const, nullable: false as const, + properties: { + deliver: { + ref: 'QueueCount' + }, + inbox: { + ref: 'QueueCount' + }, + db: { + ref: 'QueueCount' + }, + objectStorage: { + ref: 'QueueCount' + } + } + } +}; + +export default define(meta, async (ps) => { + const deliverJobCounts = await deliverQueue.getJobCounts(); + const inboxJobCounts = await inboxQueue.getJobCounts(); + const dbJobCounts = await dbQueue.getJobCounts(); + const objectStorageJobCounts = await objectStorageQueue.getJobCounts(); + + return { + deliver: deliverJobCounts, + inbox: inboxJobCounts, + db: dbJobCounts, + objectStorage: objectStorageJobCounts, + }; +}); -- cgit v1.2.3-freya