import { join } from 'lodash'; import { map } from 'lodash/fp'; import { appDefinitionFile } from '../common'; import { validateTriggers, validateActions } from './validate'; import { apiWrapper } from '../common/apiWrapper'; import { events } from '../common/events'; import { permission } from '../authApi/permissions'; import { BadRequestError } from '../common/errors'; export const saveActionsAndTriggers = app => async (actions, triggers) => apiWrapper( app, events.templateApi.saveActionsAndTriggers, permission.writeTemplates.isAuthorized, { actions, triggers }, _saveActionsAndTriggers, app.datastore, actions, triggers, ); export const _saveActionsAndTriggers = async (datastore, actions, triggers) => { if (await datastore.exists(appDefinitionFile)) { const appDefinition = await datastore.loadJson(appDefinitionFile); appDefinition.actions = actions; appDefinition.triggers = triggers; const actionValidErrs = map(e => e.error)(validateActions(actions)); if (actionValidErrs.length > 0) { throw new BadRequestError(`Actions are invalid: ${join(actionValidErrs, ', ')}`); } const triggerValidErrs = map(e => e.error)(validateTriggers(triggers, actions)); if (triggerValidErrs.length > 0) { throw new BadRequestError(`Triggers are invalid: ${join(triggerValidErrs, ', ')}`); } await datastore.updateJson(appDefinitionFile, appDefinition); } else { throw new BadRequestError('Cannot save actions: Application definition does not exist'); } };