From 7acd7fe07b595ffe5b184c6b1a50438b1f7c3e75 Mon Sep 17 00:00:00 2001 From: Siddharth Singh Date: Sun, 30 Mar 2025 14:52:32 +0530 Subject: [PATCH] create adminUpdatePolicyController --- packages/ditto/app.ts | 3 ++- packages/ditto/controllers/api/policies.ts | 24 ++++++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/packages/ditto/app.ts b/packages/ditto/app.ts index a55bfc19..0d2b515c 100644 --- a/packages/ditto/app.ts +++ b/packages/ditto/app.ts @@ -151,7 +151,7 @@ import dittoNamesRoute from '@/routes/dittoNamesRoute.ts'; import pleromaAdminPermissionGroupsRoute from '@/routes/pleromaAdminPermissionGroupsRoute.ts'; import pleromaStatusesRoute from '@/routes/pleromaStatusesRoute.ts'; import { DittoRelayStore } from '@/storages/DittoRelayStore.ts'; -import { adminCurrentPolicyController, adminListPoliciesController } from '@/controllers/api/policies.ts'; +import { adminCurrentPolicyController, adminListPoliciesController, adminUpdatePolicyController } from '@/controllers/api/policies.ts'; import { createPolicyEvent, DEFAULT_POLICY_SPEC } from '@/utils/policies.ts'; export interface AppEnv extends DittoEnv { @@ -505,6 +505,7 @@ app.patch('/api/v1/pleroma/admin/users/unsuggest', userMiddleware({ role: 'admin app.get('/api/v1/admin/policies', userMiddleware({ role: 'admin' }), adminListPoliciesController); app.get('/api/v1/admin/policies/current', userMiddleware({ role: 'admin' }), adminCurrentPolicyController); +app.put('/api/v1/admin/policies/current', userMiddleware({ role: 'admin' }), adminUpdatePolicyController); app.route('/api/v1/custom_emojis', customEmojisRoute); diff --git a/packages/ditto/controllers/api/policies.ts b/packages/ditto/controllers/api/policies.ts index 10e4e513..e1c83861 100644 --- a/packages/ditto/controllers/api/policies.ts +++ b/packages/ditto/controllers/api/policies.ts @@ -1,5 +1,7 @@ import { type AppController } from '@/app.ts'; +import { createPolicyEvent } from '@/utils/policies.ts'; import { DEFAULT_POLICY_SPEC, policyRegistry } from '@/utils/policies.ts'; +import { z } from 'zod'; export const adminListPoliciesController: AppController = (c) => { return c.json( @@ -26,3 +28,25 @@ export const adminCurrentPolicyController: AppController = async (c) => { if (current) return c.json({ mode: conf.policyMode, spec: current }); return c.json({ mode: conf.policyMode, spec: DEFAULT_POLICY_SPEC }); }; + +const PolicySpecSchema = z.object({ + policies: z.array(z.object({ + name: z.string(), + params: z.record(z.any()) + })) +}) + +export const adminUpdatePolicyController: AppController = async (c) => { + const { relay, conf } = c.var; + if (conf.policyMode === 'script') { + return c.json({ + error: "The Ditto policy mode is set to 'script'. You will not be able to use the Policy UI until you change it to 'event'." + }) + } + const req = await c.req.json(); + const parsed = PolicySpecSchema.parse(req); + await relay.event(await createPolicyEvent(conf, parsed)); + return c.json({ + message: "Settings saved successfully." + }) +} \ No newline at end of file