From f99958c40e8b755c83dc27ac8f421bd38853c66c Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 8 May 2024 14:59:30 -0500 Subject: [PATCH 1/3] reportsController -> reportController --- src/app.ts | 4 ++-- src/controllers/api/reports.ts | 8 ++++---- src/views/mastodon/reports.ts | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/app.ts b/src/app.ts index a3f6a43b..5982165f 100644 --- a/src/app.ts +++ b/src/app.ts @@ -48,7 +48,7 @@ import { adminReportController, adminReportResolveController, adminReportsController, - reportsController, + reportController, } from '@/controllers/api/reports.ts'; import { searchController } from '@/controllers/api/search.ts'; import { @@ -212,7 +212,7 @@ app.delete('/api/v1/pleroma/admin/statuses/:id', requireRole('admin'), pleromaAd app.get('/api/v1/admin/ditto/relays', requireRole('admin'), adminRelaysController); app.put('/api/v1/admin/ditto/relays', requireRole('admin'), adminSetRelaysController); -app.post('/api/v1/reports', requirePubkey, reportsController); +app.post('/api/v1/reports', requirePubkey, reportController); app.get('/api/v1/admin/reports', requirePubkey, requireRole('admin'), adminReportsController); app.get('/api/v1/admin/reports/:id{[0-9a-f]{64}}', requirePubkey, requireRole('admin'), adminReportController); app.post( diff --git a/src/controllers/api/reports.ts b/src/controllers/api/reports.ts index 24e314d8..998054af 100644 --- a/src/controllers/api/reports.ts +++ b/src/controllers/api/reports.ts @@ -8,7 +8,7 @@ import { hydrateEvents } from '@/storages/hydrate.ts'; import { renderAdminReport } from '@/views/mastodon/reports.ts'; import { renderReport } from '@/views/mastodon/reports.ts'; -const reportsSchema = z.object({ +const reportSchema = z.object({ account_id: n.id(), status_ids: n.id().array().default([]), comment: z.string().max(1000).default(''), @@ -17,10 +17,10 @@ const reportsSchema = z.object({ }); /** https://docs.joinmastodon.org/methods/reports/#post */ -const reportsController: AppController = async (c) => { +const reportController: AppController = async (c) => { const store = c.get('store'); const body = await parseBody(c.req.raw); - const result = reportsSchema.safeParse(body); + const result = reportSchema.safeParse(body); if (!result.success) { return c.json(result.error, 422); @@ -116,4 +116,4 @@ const adminReportResolveController: AppController = async (c) => { return c.json(await renderAdminReport(event, { viewerPubkey: pubkey, action_taken: true })); }; -export { adminReportController, adminReportResolveController, adminReportsController, reportsController }; +export { adminReportController, adminReportResolveController, adminReportsController, reportController }; diff --git a/src/views/mastodon/reports.ts b/src/views/mastodon/reports.ts index 5ddbe699..95923075 100644 --- a/src/views/mastodon/reports.ts +++ b/src/views/mastodon/reports.ts @@ -30,14 +30,14 @@ async function renderReport(reportEvent: DittoEvent, profile: DittoEvent) { interface RenderAdminReportOpts { viewerPubkey?: string; - action_taken?: boolean; + actionTaken?: boolean; } /** Admin-level information about a filed report. * Expects an event of kind 1984 fully hydrated. * https://docs.joinmastodon.org/entities/Admin_Report */ async function renderAdminReport(reportEvent: DittoEvent, opts: RenderAdminReportOpts) { - const { viewerPubkey, action_taken = false } = opts; + const { viewerPubkey, actionTaken = false } = opts; // The category is present in both the 'e' and 'p' tag, however, it is possible to report a user without reporting a note, so it's better to get the category from the 'p' tag const category = reportEvent.tags.find(([name]) => name === 'p')?.[2]; @@ -51,7 +51,7 @@ async function renderAdminReport(reportEvent: DittoEvent, opts: RenderAdminRepor return { id: reportEvent.id, - action_taken, + action_taken: actionTaken, action_taken_at: null, category, comment: reportEvent.content, From 8530749192ed0b115d7bd05379785964ba55e4b5 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 8 May 2024 15:03:58 -0500 Subject: [PATCH 2/3] reportController: hydrate the report itself to get the author --- src/controllers/api/reports.ts | 10 +++------- src/views/mastodon/reports.ts | 18 ++++++++---------- 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/controllers/api/reports.ts b/src/controllers/api/reports.ts index 998054af..eb85bd28 100644 --- a/src/controllers/api/reports.ts +++ b/src/controllers/api/reports.ts @@ -33,11 +33,6 @@ const reportController: AppController = async (c) => { category, } = result.data; - const [profile] = await store.query([{ kinds: [0], authors: [account_id] }]); - if (profile) { - await hydrateEvents({ events: [profile], storage: store }); - } - const tags = [ ['p', account_id, category], ['P', Conf.pubkey], @@ -53,7 +48,8 @@ const reportController: AppController = async (c) => { tags, }, c); - return c.json(await renderReport(event, profile)); + await hydrateEvents({ events: [event], storage: store }); + return c.json(await renderReport(event)); }; /** https://docs.joinmastodon.org/methods/admin/reports/#get */ @@ -113,7 +109,7 @@ const adminReportResolveController: AppController = async (c) => { content: 'Report closed.', }, c); - return c.json(await renderAdminReport(event, { viewerPubkey: pubkey, action_taken: true })); + return c.json(await renderAdminReport(event, { viewerPubkey: pubkey, actionTaken: true })); }; export { adminReportController, adminReportResolveController, adminReportsController, reportController }; diff --git a/src/views/mastodon/reports.ts b/src/views/mastodon/reports.ts index 95923075..488f7b9a 100644 --- a/src/views/mastodon/reports.ts +++ b/src/views/mastodon/reports.ts @@ -5,26 +5,24 @@ import { renderAdminAccount } from '@/views/mastodon/admin-accounts.ts'; import { renderStatus } from '@/views/mastodon/statuses.ts'; /** Expects a `reportEvent` of kind 1984 and a `profile` of kind 0 of the person being reported */ -async function renderReport(reportEvent: DittoEvent, profile: DittoEvent) { +async function renderReport(event: DittoEvent) { // The category is present in both the 'e' and 'p' tag, however, it is possible to report a user without reporting a note, so it's better to get the category from the 'p' tag - const category = reportEvent.tags.find(([name]) => name === 'p')?.[2]; - - const statusIds = reportEvent.tags.filter(([name]) => name === 'e').map((tag) => tag[1]) ?? []; - - const reportedPubkey = reportEvent.tags.find(([name]) => name === 'p')?.[1]; + const category = event.tags.find(([name]) => name === 'p')?.[2]; + const statusIds = event.tags.filter(([name]) => name === 'e').map((tag) => tag[1]) ?? []; + const reportedPubkey = event.tags.find(([name]) => name === 'p')?.[1]; if (!reportedPubkey) return; return { - id: reportEvent.id, + id: event.id, action_taken: false, action_taken_at: null, category, - comment: reportEvent.content, + comment: event.content, forwarded: false, - created_at: nostrDate(reportEvent.created_at).toISOString(), + created_at: nostrDate(event.created_at).toISOString(), status_ids: statusIds, rules_ids: null, - target_account: profile ? await renderAccount(profile) : await accountFromPubkey(reportedPubkey), + target_account: event.author ? await renderAccount(event.author) : await accountFromPubkey(reportedPubkey), }; } From c7e8beebc66fcf9f5ea2cfe6aeb7ec79ebd86960 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 8 May 2024 15:06:33 -0500 Subject: [PATCH 3/3] renderReport: whoops, event.author -> event.reported_account --- src/views/mastodon/reports.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/views/mastodon/reports.ts b/src/views/mastodon/reports.ts index 488f7b9a..f4908de1 100644 --- a/src/views/mastodon/reports.ts +++ b/src/views/mastodon/reports.ts @@ -22,7 +22,9 @@ async function renderReport(event: DittoEvent) { created_at: nostrDate(event.created_at).toISOString(), status_ids: statusIds, rules_ids: null, - target_account: event.author ? await renderAccount(event.author) : await accountFromPubkey(reportedPubkey), + target_account: event.reported_profile + ? await renderAccount(event.reported_profile) + : await accountFromPubkey(reportedPubkey), }; }