2022-08-11 10:20:49 +02:00

162 lines
3.0 KiB
JavaScript

'use strict';
const getDefaultContentTypeConfig = () => ({
enabled: true,
mutations: true,
queries: true,
disabledActions: [],
fields: new Map(),
});
const getDefaultFieldConfig = () => ({
enabled: true,
input: true,
output: true,
filters: true,
});
const ALL_ACTIONS = '*';
module.exports = () => {
const configs = new Map();
return (uid) => {
if (!configs.has(uid)) {
configs.set(uid, getDefaultContentTypeConfig());
}
return {
isEnabled() {
return configs.get(uid).enabled;
},
isDisabled() {
return !this.isEnabled();
},
areQueriesEnabled() {
return configs.get(uid).queries;
},
areQueriesDisabled() {
return !this.areQueriesEnabled();
},
areMutationsEnabled() {
return configs.get(uid).mutations;
},
areMutationsDisabled() {
return !this.areMutationsEnabled();
},
isActionEnabled(action) {
const matchingActions = [action, ALL_ACTIONS];
return configs
.get(uid)
.disabledActions.every((action) => !matchingActions.includes(action));
},
isActionDisabled(action) {
return !this.isActionEnabled(action);
},
disable() {
configs.get(uid).enabled = false;
return this;
},
disableQueries() {
configs.get(uid).queries = false;
return this;
},
disableMutations() {
configs.get(uid).mutations = false;
return this;
},
disableAction(action) {
const config = configs.get(uid);
if (!config.disabledActions.includes(action)) {
config.disabledActions.push(action);
}
return this;
},
disableActions(actions = []) {
actions.forEach((action) => this.disableAction(action));
return this;
},
field(fieldName) {
const { fields } = configs.get(uid);
if (!fields.has(fieldName)) {
fields.set(fieldName, getDefaultFieldConfig());
}
return {
isEnabled() {
return fields.get(fieldName).enabled;
},
hasInputEnabled() {
return fields.get(fieldName).input;
},
hasOutputEnabled() {
return fields.get(fieldName).output;
},
hasFiltersEnabeld() {
return fields.get(fieldName).filters;
},
disable() {
fields.set(fieldName, {
enabled: false,
output: false,
input: false,
filters: false,
});
return this;
},
disableOutput() {
fields.get(fieldName).output = false;
return this;
},
disableInput() {
fields.get(fieldName).input = false;
return this;
},
disableFilters() {
fields.get(fieldName).filters = false;
return this;
},
};
},
};
};
};