diff options
| author | Henry Jameson <me@hjkos.com> | 2023-03-22 18:57:23 +0200 |
|---|---|---|
| committer | Henry Jameson <me@hjkos.com> | 2023-03-22 18:57:23 +0200 |
| commit | ece69f01b790b4bc02387d31ca911a0588e0664c (patch) | |
| tree | 5913d4d2054667f05f18c88fff7aa4286fc21b3b /src/modules/adminSettings.js | |
| parent | 91534172027a587c7cab2cd3bedc51c1e24905ef (diff) | |
added mass-draft-push and mass-draft-reset, small stylistic fixes
Diffstat (limited to 'src/modules/adminSettings.js')
| -rw-r--r-- | src/modules/adminSettings.js | 57 |
1 files changed, 55 insertions, 2 deletions
diff --git a/src/modules/adminSettings.js b/src/modules/adminSettings.js index 27d5b37d..25fb8e50 100644 --- a/src/modules/adminSettings.js +++ b/src/modules/adminSettings.js @@ -1,4 +1,4 @@ -import { set, get, cloneDeep } from 'lodash' +import { set, get, cloneDeep, differenceWith, isEqual, flatten } from 'lodash' export const defaultState = { needsReboot: null, @@ -42,7 +42,7 @@ const adminSettingsStorage = { actions: { setInstanceAdminSettings ({ state, commit, dispatch }, { backendDbConfig }) { const config = state.config || {} - const modifiedPaths = state.modifiedPaths || new Set() + const modifiedPaths = new Set() backendDbConfig.configs.forEach(c => { const path = [c.group, c.key] if (c.db) { @@ -82,6 +82,59 @@ const adminSettingsStorage = { console.log(descriptions[':pleroma']['Pleroma.Captcha']) commit('updateAdminDescriptions', { descriptions }) }, + + // This action takes draft state, diffs it with live config state and then pushes + // only differences between the two. Difference detection only work up to subkey (third) level. + pushAdminDraft ({ rootState, state, commit, dispatch }) { + // TODO cleanup paths in modifiedPaths + const convert = (value) => { + if (typeof value !== 'object') { + return value + } else if (Array.isArray(value)) { + return value.map(convert) + } else { + return Object.entries(value).map(([k, v]) => ({ tuple: [k, v] })) + } + } + + // Getting all group-keys used in config + const allGroupKeys = flatten( + Object + .entries(state.config) + .map( + ([group, lv1data]) => Object + .keys(lv1data) + .map((key) => ({ group, key })) + ) + ) + + // Only using group-keys where there are changes detected + const changedGroupKeys = allGroupKeys.filter(({ group, key }) => { + return !isEqual(state.config[group][key], state.draft[group][key]) + }) + + // Here we take all changed group-keys and get all changed subkeys + const changed = changedGroupKeys.map(({ group, key }) => { + const config = state.config[group][key] + const draft = state.draft[group][key] + + // We convert group-key value into entries arrays + const eConfig = Object.entries(config) + const eDraft = Object.entries(draft) + + // Then those entries array we diff so only changed subkey entries remain + // We use the diffed array to reconstruct the object and then shove it into convert() + return ({ group, key, value: convert(Object.fromEntries(differenceWith(eDraft, eConfig, isEqual))) }) + }) + + rootState.api.backendInteractor.pushInstanceDBConfig({ + payload: { + configs: changed + } + }) + .then(() => rootState.api.backendInteractor.fetchInstanceDBConfig()) + .then(backendDbConfig => dispatch('setInstanceAdminSettings', { backendDbConfig })) + }, pushAdminSetting ({ rootState, state, commit, dispatch }, { path, value }) { const [group, key, ...rest] = Array.isArray(path) ? path : path.split(/\./g) const clone = {} // not actually cloning the entire thing to avoid excessive writes |
