summaryrefslogtreecommitdiff
path: root/packages/backend/src/server/api/endpoints/admin/queue
diff options
context:
space:
mode:
authorsyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
committersyuilo <Syuilotan@yahoo.co.jp>2021-11-12 02:02:25 +0900
commit0e4a111f81cceed275d9bec2695f6e401fb654d8 (patch)
tree40874799472fa07416f17b50a398ac33b7771905 /packages/backend/src/server/api/endpoints/admin/queue
parentupdate deps (diff)
downloadsharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.gz
sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.tar.bz2
sharkey-0e4a111f81cceed275d9bec2695f6e401fb654d8.zip
refactoring
Resolve #7779
Diffstat (limited to 'packages/backend/src/server/api/endpoints/admin/queue')
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/clear.ts18
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/deliver-delayed.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/inbox-delayed.ts55
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/jobs.ts81
-rw-r--r--packages/backend/src/server/api/endpoints/admin/queue/stats.ts44
5 files changed, 253 insertions, 0 deletions
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,
+ };
+});