diff options
Diffstat (limited to 'apps/workflowengine/src/store.js')
-rw-r--r-- | apps/workflowengine/src/store.js | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/apps/workflowengine/src/store.js b/apps/workflowengine/src/store.js new file mode 100644 index 00000000000..84a76a644a8 --- /dev/null +++ b/apps/workflowengine/src/store.js @@ -0,0 +1,164 @@ +/** + * SPDX-FileCopyrightText: 2019 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +import Vue from 'vue' +import Vuex, { Store } from 'vuex' +import axios from '@nextcloud/axios' +import { confirmPassword } from '@nextcloud/password-confirmation' +import { loadState } from '@nextcloud/initial-state' +import { getApiUrl } from './helpers/api.js' + +import '@nextcloud/password-confirmation/dist/style.css' + +Vue.use(Vuex) + +const store = new Store({ + state: { + rules: [], + scope: loadState('workflowengine', 'scope'), + appstoreEnabled: loadState('workflowengine', 'appstoreenabled'), + operations: loadState('workflowengine', 'operators'), + + plugins: Vue.observable({ + checks: {}, + operators: {}, + }), + + entities: loadState('workflowengine', 'entities'), + events: loadState('workflowengine', 'entities') + .map((entity) => entity.events.map(event => { + return { + id: `${entity.id}::${event.eventName}`, + entity, + ...event, + } + })).flat(), + checks: loadState('workflowengine', 'checks'), + }, + mutations: { + addRule(state, rule) { + state.rules.push({ ...rule, valid: true }) + }, + updateRule(state, rule) { + const index = state.rules.findIndex((item) => rule.id === item.id) + const newRule = Object.assign({}, rule) + Vue.set(state.rules, index, newRule) + }, + removeRule(state, rule) { + const index = state.rules.findIndex((item) => rule.id === item.id) + state.rules.splice(index, 1) + }, + addPluginCheck(state, plugin) { + Vue.set(state.plugins.checks, plugin.class, plugin) + }, + addPluginOperator(state, plugin) { + plugin = Object.assign( + { color: 'var(--color-primary-element)' }, + plugin, state.operations[plugin.id] || {}) + if (typeof state.operations[plugin.id] !== 'undefined') { + Vue.set(state.operations, plugin.id, plugin) + } + }, + }, + actions: { + async fetchRules(context) { + const { data } = await axios.get(getApiUrl('')) + Object.values(data.ocs.data).flat().forEach((rule) => { + context.commit('addRule', rule) + }) + }, + async createNewRule(context, rule) { + await confirmPassword() + let entity = null + let events = [] + if (rule.isComplex === false && rule.fixedEntity === '') { + entity = context.state.entities.find((item) => rule.entities && rule.entities[0] === item.id) + entity = entity || Object.values(context.state.entities)[0] + events = [entity.events[0].eventName] + } + + context.commit('addRule', { + id: -(new Date().getTime()), + class: rule.id, + entity: entity ? entity.id : rule.fixedEntity, + events, + name: '', // unused in the new ui, there for legacy reasons + checks: [ + { class: null, operator: null, value: '' }, + ], + operation: rule.operation || '', + }) + }, + updateRule(context, rule) { + context.commit('updateRule', { + ...rule, + events: typeof rule.events === 'string' ? JSON.parse(rule.events) : rule.events, + }) + }, + removeRule(context, rule) { + context.commit('removeRule', rule) + }, + async pushUpdateRule(context, rule) { + await confirmPassword() + let result + if (rule.id < 0) { + result = await axios.post(getApiUrl(''), rule) + } else { + result = await axios.put(getApiUrl(`/${rule.id}`), rule) + } + Vue.set(rule, 'id', result.data.ocs.data.id) + context.commit('updateRule', rule) + }, + async deleteRule(context, rule) { + await confirmPassword() + await axios.delete(getApiUrl(`/${rule.id}`)) + context.commit('removeRule', rule) + }, + setValid(context, { rule, valid }) { + rule.valid = valid + context.commit('updateRule', rule) + }, + }, + getters: { + getRules(state) { + return state.rules.filter((rule) => typeof state.operations[rule.class] !== 'undefined').sort((rule1, rule2) => { + return rule1.id - rule2.id || rule2.class - rule1.class + }) + }, + /** + * @param state + * @return {OperatorPlugin} + */ + getOperationForRule(state) { + return (rule) => state.operations[rule.class] + }, + getEntityForOperation(state) { + return (operation) => state.entities.find((entity) => operation.fixedEntity === entity.id) + }, + getEventsForOperation(state) { + return (operation) => state.events + }, + + /** + * Return all available checker plugins for a given entity class + * + * @param {object} state the store state + * @return {Function} the available plugins + */ + getChecksForEntity(state) { + return (entity) => { + return Object.values(state.checks) + .filter((check) => check.supportedEntities.indexOf(entity) > -1 || check.supportedEntities.length === 0) + .map((check) => state.plugins.checks[check.id]) + .reduce((obj, item) => { + obj[item.class] = item + return obj + }, {}) + } + }, + }, +}) + +export default store |