Move apiOptionsSet implementation into Backend

This commit is contained in:
toasted-nutbread 2019-12-09 21:07:18 -05:00
parent d6fe5c3e46
commit 6a1cfbaad6
2 changed files with 40 additions and 40 deletions

View File

@ -21,44 +21,8 @@ function apiOptionsGet(optionsContext) {
return utilBackend()._onApiOptionsGet({optionsContext});
}
async function apiOptionsSet(changedOptions, optionsContext, source) {
const options = await apiOptionsGet(optionsContext);
function getValuePaths(obj) {
const valuePaths = [];
const nodes = [{obj, path: []}];
while (nodes.length > 0) {
const node = nodes.pop();
for (const key of Object.keys(node.obj)) {
const path = node.path.concat(key);
const obj = node.obj[key];
if (obj !== null && typeof obj === 'object') {
nodes.unshift({obj, path});
} else {
valuePaths.push([obj, path]);
}
}
}
return valuePaths;
}
function modifyOption(path, value, options) {
let pivot = options;
for (const key of path.slice(0, -1)) {
if (!hasOwn(pivot, key)) {
return false;
}
pivot = pivot[key];
}
pivot[path[path.length - 1]] = value;
return true;
}
for (const [value, path] of getValuePaths(changedOptions)) {
modifyOption(path, value, options);
}
await apiOptionsSave(source);
function apiOptionsSet(changedOptions, optionsContext, source) {
return utilBackend()._onApiOptionsSet({changedOptions, optionsContext, source});
}
function apiOptionsGetFull() {

View File

@ -194,8 +194,44 @@ class Backend {
return this.getFullOptions();
}
_onApiOptionsSet({changedOptions, optionsContext, source}) {
return apiOptionsSet(changedOptions, optionsContext, source);
async _onApiOptionsSet({changedOptions, optionsContext, source}) {
const options = await this.getOptions(optionsContext);
function getValuePaths(obj) {
const valuePaths = [];
const nodes = [{obj, path: []}];
while (nodes.length > 0) {
const node = nodes.pop();
for (const key of Object.keys(node.obj)) {
const path = node.path.concat(key);
const obj = node.obj[key];
if (obj !== null && typeof obj === 'object') {
nodes.unshift({obj, path});
} else {
valuePaths.push([obj, path]);
}
}
}
return valuePaths;
}
function modifyOption(path, value, options) {
let pivot = options;
for (const key of path.slice(0, -1)) {
if (!hasOwn(pivot, key)) {
return false;
}
pivot = pivot[key];
}
pivot[path[path.length - 1]] = value;
return true;
}
for (const [value, path] of getValuePaths(changedOptions)) {
modifyOption(path, value, options);
}
await this._optionsSave({source});
}
_onApiOptionsSave({source}) {