From d2238e80f9e12f9890a629ed1770a2b3cb804af7 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 8 Jun 2024 13:44:57 -0500 Subject: [PATCH] Support Pleroma admin tags --- src/app.ts | 5 +++ src/controllers/api/pleroma.ts | 71 +++++++++++++++++++++++++++++++++- src/utils/api.ts | 5 ++- src/views/mastodon/accounts.ts | 1 + 4 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/app.ts b/src/app.ts index 771b887..2657a28 100644 --- a/src/app.ts +++ b/src/app.ts @@ -42,6 +42,8 @@ import { configController, frontendConfigController, pleromaAdminDeleteStatusController, + pleromaAdminTagController, + pleromaAdminUntagController, updateConfigController, } from '@/controllers/api/pleroma.ts'; import { preferencesController } from '@/controllers/api/preferences.ts'; @@ -253,6 +255,9 @@ app.post( app.post('/api/v1/admin/accounts/:id{[0-9a-f]{64}}/action', requireSigner, requireRole('admin'), adminActionController); +app.put('/api/v1/pleroma/admin/users/tag', requireRole('admin'), pleromaAdminTagController); +app.delete('/api/v1/pleroma/admin/users/tag', requireRole('admin'), pleromaAdminUntagController); + // Not (yet) implemented. app.get('/api/v1/custom_emojis', emptyArrayController); app.get('/api/v1/filters', emptyArrayController); diff --git a/src/controllers/api/pleroma.ts b/src/controllers/api/pleroma.ts index 31b4fc5..57b77cf 100644 --- a/src/controllers/api/pleroma.ts +++ b/src/controllers/api/pleroma.ts @@ -6,7 +6,8 @@ import { Conf } from '@/config.ts'; import { configSchema, elixirTupleSchema, type PleromaConfig } from '@/schemas/pleroma-api.ts'; import { AdminSigner } from '@/signers/AdminSigner.ts'; import { Storages } from '@/storages.ts'; -import { createAdminEvent } from '@/utils/api.ts'; +import { createAdminEvent, updateAdminEvent } from '@/utils/api.ts'; +import { lookupPubkey } from '@/utils/lookup.ts'; const frontendConfigController: AppController = async (c) => { const store = await Storages.db(); @@ -87,4 +88,70 @@ async function getConfigs(store: NStore, signal: AbortSignal): Promise { + const params = pleromaAdminTagsSchema.parse(await c.req.json()); + + for (const nickname of params.nicknames) { + const pubkey = await lookupPubkey(nickname); + if (!pubkey) continue; + + await updateAdminEvent( + { kinds: [30382], authors: [Conf.pubkey], '#d': [pubkey], limit: 1 }, + (prev) => { + const tags = prev?.tags ?? [['d', pubkey]]; + + for (const tag of params.tags) { + const existing = prev?.tags.some(([name, value]) => name === 't' && value === tag); + if (!existing) { + tags.push(['t', tag]); + } + } + + return { + kind: 30382, + content: prev?.content ?? '', + tags, + }; + }, + c, + ); + } + + return new Response(null, { status: 204 }); +}; + +const pleromaAdminUntagController: AppController = async (c) => { + const params = pleromaAdminTagsSchema.parse(await c.req.json()); + + for (const nickname of params.nicknames) { + const pubkey = await lookupPubkey(nickname); + if (!pubkey) continue; + + await updateAdminEvent( + { kinds: [30382], authors: [Conf.pubkey], '#d': [pubkey], limit: 1 }, + (prev) => ({ + kind: 30382, + content: prev?.content ?? '', + tags: (prev?.tags ?? [['d', pubkey]]) + .filter(([name, value]) => !(name === 't' && params.tags.includes(value))), + }), + c, + ); + } + + return new Response(null, { status: 204 }); +}; + +export { + configController, + frontendConfigController, + pleromaAdminDeleteStatusController, + pleromaAdminTagController, + pleromaAdminUntagController, + updateConfigController, +}; diff --git a/src/utils/api.ts b/src/utils/api.ts index 8010615..fdbfbfd 100644 --- a/src/utils/api.ts +++ b/src/utils/api.ts @@ -73,6 +73,8 @@ function updateListEvent( async function createAdminEvent(t: EventStub, c: AppContext): Promise { const signer = new AdminSigner(); + console.log(t); + const event = await signer.signEvent({ content: '', created_at: nostrNow(), @@ -125,7 +127,7 @@ async function updateUser(pubkey: string, n: Record, c: AppCont return { kind: 30382, - content: prev?.content, + content: prev?.content ?? '', tags: [ ['d', pubkey], ...nTags, @@ -294,6 +296,7 @@ export { type PaginationParams, paginationSchema, parseBody, + updateAdminEvent, updateEvent, updateListAdminEvent, updateListEvent, diff --git a/src/views/mastodon/accounts.ts b/src/views/mastodon/accounts.ts index 5c7b776..3974c3c 100644 --- a/src/views/mastodon/accounts.ts +++ b/src/views/mastodon/accounts.ts @@ -81,6 +81,7 @@ async function renderAccount( is_moderator: roles.has('admin') || roles.has('moderator'), is_local: parsed05?.domain === Conf.url.host, settings_store: undefined as unknown, + tags: [...getTagSet(event.user?.tags ?? [], 't')], }, nostr: { pubkey,