Simplify promote controller

This commit is contained in:
Alex Gleason 2025-03-03 15:58:13 -06:00
parent 28c3b07a3e
commit a2f019993d
No known key found for this signature in database
GPG key ID: 7211D1F99744FBB7
2 changed files with 14 additions and 45 deletions

View file

@ -81,11 +81,11 @@ import {
configController, configController,
frontendConfigController, frontendConfigController,
pleromaAdminDeleteStatusController, pleromaAdminDeleteStatusController,
pleromaAdminPromoteController,
pleromaAdminSuggestController, pleromaAdminSuggestController,
pleromaAdminTagController, pleromaAdminTagController,
pleromaAdminUnsuggestController, pleromaAdminUnsuggestController,
pleromaAdminUntagController, pleromaAdminUntagController,
pleromaPromoteAdminController,
updateConfigController, updateConfigController,
} from '@/controllers/api/pleroma.ts'; } from '@/controllers/api/pleroma.ts';
import { preferencesController } from '@/controllers/api/preferences.ts'; import { preferencesController } from '@/controllers/api/preferences.ts';
@ -442,9 +442,9 @@ app.get('/api/v1/pleroma/admin/config', userMiddleware({ role: 'admin' }), confi
app.post('/api/v1/pleroma/admin/config', userMiddleware({ role: 'admin' }), updateConfigController); app.post('/api/v1/pleroma/admin/config', userMiddleware({ role: 'admin' }), updateConfigController);
app.delete('/api/v1/pleroma/admin/statuses/:id', userMiddleware({ role: 'admin' }), pleromaAdminDeleteStatusController); app.delete('/api/v1/pleroma/admin/statuses/:id', userMiddleware({ role: 'admin' }), pleromaAdminDeleteStatusController);
app.post( app.post(
'/api/v1/pleroma/admin/users/permission_group/admin', '/api/v1/pleroma/admin/users/permission_group/:group',
userMiddleware({ role: 'admin' }), userMiddleware({ role: 'admin' }),
pleromaPromoteAdminController, pleromaAdminPromoteController,
); );
app.get('/api/v1/admin/ditto/relays', userMiddleware({ role: 'admin' }), adminRelaysController); app.get('/api/v1/admin/ditto/relays', userMiddleware({ role: 'admin' }), adminRelaysController);

View file

@ -4,9 +4,7 @@ import { type AppController } from '@/app.ts';
import { createAdminEvent, parseBody, updateAdminEvent, updateUser } from '@/utils/api.ts'; import { createAdminEvent, parseBody, updateAdminEvent, updateUser } from '@/utils/api.ts';
import { lookupPubkey } from '@/utils/lookup.ts'; import { lookupPubkey } from '@/utils/lookup.ts';
import { getPleromaConfigs } from '@/utils/pleroma.ts'; import { getPleromaConfigs } from '@/utils/pleroma.ts';
import { accountFromPubkey, renderAccount } from '@/views/mastodon/accounts.ts';
import { configSchema, elixirTupleSchema } from '@/schemas/pleroma-api.ts'; import { configSchema, elixirTupleSchema } from '@/schemas/pleroma-api.ts';
import { hydrateEvents } from '@/storages/hydrate.ts';
const frontendConfigController: AppController = async (c) => { const frontendConfigController: AppController = async (c) => {
const configDB = await getPleromaConfigs(c.var); const configDB = await getPleromaConfigs(c.var);
@ -68,59 +66,30 @@ const pleromaPromoteAdminSchema = z.object({
nicknames: z.string().array(), nicknames: z.string().array(),
}); });
const pleromaPromoteAdminController: AppController = async (c) => { const pleromaAdminPromoteController: AppController = async (c) => {
const { conf, relay, signal } = c.var;
const body = await parseBody(c.req.raw); const body = await parseBody(c.req.raw);
const result = pleromaPromoteAdminSchema.safeParse(body); const result = pleromaPromoteAdminSchema.safeParse(body);
const group = c.req.param('group');
if (!result.success) { if (!result.success) {
return c.json({ error: 'Bad request', schema: result.error }, 422); return c.json({ error: 'Bad request', schema: result.error }, 422);
} }
if (!['admin', 'moderator'].includes(group)) {
return c.json({ error: 'Bad request', schema: 'Invalid group' }, 422);
}
const { data } = result; const { data } = result;
const { nicknames } = data; const { nicknames } = data;
const pubkeys: string[] = [];
for (const nickname of nicknames) { for (const nickname of nicknames) {
const pubkey = await lookupPubkey(nickname, c.var); const pubkey = await lookupPubkey(nickname, c.var);
if (!pubkey) continue; if (pubkey) {
await updateUser(pubkey, { [group]: true }, c);
pubkeys.push(pubkey); }
await updateAdminEvent(
{ kinds: [30382], authors: [await conf.signer.getPublicKey()], '#d': [pubkey], limit: 1 },
(prev) => {
const tags = prev?.tags ?? [['d', pubkey]];
const existing = prev?.tags.some(([name, value]) => name === 'n' && value === 'admin');
if (!existing) {
tags.push(['n', 'admin']);
} }
return { return c.json({ is_admin: true }, 200);
kind: 30382,
content: prev?.content ?? '',
tags,
};
},
c,
);
}
const events = await relay.query([{ kinds: [0], authors: pubkeys }], { signal });
await hydrateEvents({ ...c.var, events });
const accounts = pubkeys.map((pubkey) => {
const event = events.find((e) => e.pubkey === pubkey);
if (event) {
return renderAccount(event);
}
return accountFromPubkey(pubkey);
});
return c.json(accounts, 200);
}; };
const pleromaAdminTagController: AppController = async (c) => { const pleromaAdminTagController: AppController = async (c) => {
@ -211,10 +180,10 @@ export {
configController, configController,
frontendConfigController, frontendConfigController,
pleromaAdminDeleteStatusController, pleromaAdminDeleteStatusController,
pleromaAdminPromoteController,
pleromaAdminSuggestController, pleromaAdminSuggestController,
pleromaAdminTagController, pleromaAdminTagController,
pleromaAdminUnsuggestController, pleromaAdminUnsuggestController,
pleromaAdminUntagController, pleromaAdminUntagController,
pleromaPromoteAdminController,
updateConfigController, updateConfigController,
}; };