From 0da728fc5096358e97bc2c4557273b722f422908 Mon Sep 17 00:00:00 2001 From: Marcello Fitton <106866560+angelplusultra@users.noreply.github.com> Date: Mon, 9 Feb 2026 12:48:48 -0800 Subject: [PATCH] refactor: Migrate system preferences to field-based endpoint and remove deprecated endpoint (#4958) * Migrate all existing deprecated system preferences endpoint services to new service by field | delete old endpoint and service * format * destructure settings from response * nitpick --------- Co-authored-by: shatfield4 Co-authored-by: Timothy Carambat --- frontend/src/models/admin.js | 14 ----- .../Admin/ExperimentalFeatures/index.jsx | 8 ++- .../EmbeddingTextSplitterPreference/index.jsx | 8 ++- .../components/CustomSiteSettings/index.jsx | 5 +- .../components/FooterCustomization/index.jsx | 11 +++- .../WorkspaceSettings/AgentConfig/index.jsx | 3 +- server/endpoints/admin.js | 62 ------------------- 7 files changed, 26 insertions(+), 85 deletions(-) diff --git a/frontend/src/models/admin.js b/frontend/src/models/admin.js index 336e9878..132f6338 100644 --- a/frontend/src/models/admin.js +++ b/frontend/src/models/admin.js @@ -156,20 +156,6 @@ const Admin = { }, // System Preferences - // TODO: remove this in favor of systemPreferencesByFields - // DEPRECATED: use systemPreferencesByFields instead - systemPreferences: async () => { - return await fetch(`${API_BASE}/admin/system-preferences`, { - method: "GET", - headers: baseHeaders(), - }) - .then((res) => res.json()) - .catch((e) => { - console.error(e); - return null; - }); - }, - /** * Fetches system preferences by fields * @param {string[]} labels - Array of labels for settings diff --git a/frontend/src/pages/Admin/ExperimentalFeatures/index.jsx b/frontend/src/pages/Admin/ExperimentalFeatures/index.jsx index c0b8b5af..59b2c421 100644 --- a/frontend/src/pages/Admin/ExperimentalFeatures/index.jsx +++ b/frontend/src/pages/Admin/ExperimentalFeatures/index.jsx @@ -19,7 +19,9 @@ export default function ExperimentalFeatures() { useEffect(() => { async function fetchSettings() { setLoading(true); - const { settings } = await Admin.systemPreferences(); + const { settings } = await Admin.systemPreferencesByFields([ + "feature_flags", + ]); setFeatureFlags(settings?.feature_flags ?? {}); setLoading(false); } @@ -27,7 +29,9 @@ export default function ExperimentalFeatures() { }, []); const refresh = async () => { - const { settings } = await Admin.systemPreferences(); + const { settings } = await Admin.systemPreferencesByFields([ + "feature_flags", + ]); setFeatureFlags(settings?.feature_flags ?? {}); }; diff --git a/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx b/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx index b372f2ca..1ee6cbfd 100644 --- a/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx +++ b/frontend/src/pages/GeneralSettings/EmbeddingTextSplitterPreference/index.jsx @@ -72,7 +72,13 @@ export default function EmbeddingTextSplitterPreference() { useEffect(() => { async function fetchSettings() { - const _settings = (await Admin.systemPreferences())?.settings; + const _settings = ( + await Admin.systemPreferencesByFields([ + "text_splitter_chunk_size", + "text_splitter_chunk_overlap", + "max_embed_chunk_size", + ]) + )?.settings; setSettings(_settings ?? {}); setLoading(false); } diff --git a/frontend/src/pages/GeneralSettings/Settings/components/CustomSiteSettings/index.jsx b/frontend/src/pages/GeneralSettings/Settings/components/CustomSiteSettings/index.jsx index daabd32f..68a0af4e 100644 --- a/frontend/src/pages/GeneralSettings/Settings/components/CustomSiteSettings/index.jsx +++ b/frontend/src/pages/GeneralSettings/Settings/components/CustomSiteSettings/index.jsx @@ -12,7 +12,10 @@ export default function CustomSiteSettings() { }); useEffect(() => { - Admin.systemPreferences().then(({ settings }) => { + Admin.systemPreferencesByFields([ + "meta_page_title", + "meta_page_favicon", + ]).then(({ settings }) => { setSettings({ title: settings?.meta_page_title, faviconUrl: settings?.meta_page_favicon, diff --git a/frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/index.jsx b/frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/index.jsx index 3a320454..cc2c22b9 100644 --- a/frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/index.jsx +++ b/frontend/src/pages/GeneralSettings/Settings/components/FooterCustomization/index.jsx @@ -9,11 +9,16 @@ import { useTranslation } from "react-i18next"; export default function FooterCustomization() { const [footerIcons, setFooterIcons] = useState(Array(3).fill(null)); const { t } = useTranslation(); + useEffect(() => { async function fetchFooterIcons() { - const settings = (await Admin.systemPreferences())?.settings; - if (settings && settings.footer_data) { - const parsedIcons = safeJsonParse(settings.footer_data, []); + const { settings } = await Admin.systemPreferencesByFields([ + "footer_data", + ]); + + const footerData = settings?.footer_data; + if (footerData) { + const parsedIcons = safeJsonParse(footerData, []); setFooterIcons((prevIcons) => { const updatedIcons = [...prevIcons]; parsedIcons.forEach((icon, index) => { diff --git a/frontend/src/pages/WorkspaceSettings/AgentConfig/index.jsx b/frontend/src/pages/WorkspaceSettings/AgentConfig/index.jsx index 1508f0ad..40e94a9b 100644 --- a/frontend/src/pages/WorkspaceSettings/AgentConfig/index.jsx +++ b/frontend/src/pages/WorkspaceSettings/AgentConfig/index.jsx @@ -21,8 +21,7 @@ export default function WorkspaceAgentConfiguration({ workspace }) { useEffect(() => { async function fetchSettings() { const _settings = await System.keys(); - const _preferences = await Admin.systemPreferences(); - setSettings({ ..._settings, preferences: _preferences.settings } ?? {}); + setSettings(_settings ?? {}); setLoading(false); } fetchSettings(); diff --git a/server/endpoints/admin.js b/server/endpoints/admin.js index 5cd2bc61..351d65f7 100644 --- a/server/endpoints/admin.js +++ b/server/endpoints/admin.js @@ -415,68 +415,6 @@ function adminEndpoints(app) { } ); - // TODO: Delete this endpoint - // DEPRECATED - use /admin/system-preferences-for instead with ?labels=... comma separated string of labels - app.get( - "/admin/system-preferences", - [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])], - async (_, response) => { - try { - const embedder = getEmbeddingEngineSelection(); - const settings = { - footer_data: - (await SystemSettings.get({ label: "footer_data" }))?.value || - JSON.stringify([]), - support_email: - (await SystemSettings.get({ label: "support_email" }))?.value || - null, - text_splitter_chunk_size: - (await SystemSettings.get({ label: "text_splitter_chunk_size" })) - ?.value || - embedder?.embeddingMaxChunkLength || - null, - text_splitter_chunk_overlap: - (await SystemSettings.get({ label: "text_splitter_chunk_overlap" })) - ?.value || null, - max_embed_chunk_size: embedder?.embeddingMaxChunkLength || 1000, - agent_search_provider: - (await SystemSettings.get({ label: "agent_search_provider" })) - ?.value || null, - agent_sql_connections: await SystemSettings.agent_sql_connections(), - default_agent_skills: - safeJsonParse( - (await SystemSettings.get({ label: "default_agent_skills" })) - ?.value, - [] - ) || [], - disabled_agent_skills: - safeJsonParse( - (await SystemSettings.get({ label: "disabled_agent_skills" })) - ?.value, - [] - ) || [], - imported_agent_skills: ImportedPlugin.listImportedPlugins(), - custom_app_name: - (await SystemSettings.get({ label: "custom_app_name" }))?.value || - null, - feature_flags: (await SystemSettings.getFeatureFlags()) || {}, - meta_page_title: await SystemSettings.getValueOrFallback( - { label: "meta_page_title" }, - null - ), - meta_page_favicon: await SystemSettings.getValueOrFallback( - { label: "meta_page_favicon" }, - null - ), - }; - response.status(200).json({ settings }); - } catch (e) { - console.error(e); - response.sendStatus(500).end(); - } - } - ); - app.post( "/admin/system-preferences", [validatedRequest, flexUserRoleValid([ROLES.admin, ROLES.manager])],