aboutsummaryrefslogtreecommitdiffstats
path: root/apps/workflowengine/src/store.js
diff options
context:
space:
mode:
Diffstat (limited to 'apps/workflowengine/src/store.js')
-rw-r--r--apps/workflowengine/src/store.js164
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