/** * Copyright (c) HashiCorp, Inc. * SPDX-License-Identifier: MPL-2.0 */ import TransformBase, { addToList, removeFromList } from './transform-edit-base'; import { inject as service } from '@ember/service'; export default TransformBase.extend({ flashMessages: service(), store: service(), initialTransformations: null, init() { this._super(...arguments); this.set('initialTransformations', this.model.transformations); }, handleUpdateTransformations(updateTransformations, roleId, type = 'update') { if (!updateTransformations) return; const backend = this.model.backend; const promises = updateTransformations.map((transform) => { return this.store .queryRecord('transform', { backend, id: transform.id, }) .then(function (transformation) { let roles = transformation.allowed_roles; if (transform.action === 'ADD') { roles = addToList(roles, roleId); } else if (transform.action === 'REMOVE') { roles = removeFromList(roles, roleId); } transformation.setProperties({ backend, allowed_roles: roles, }); return transformation.save().catch((e) => { return { errorStatus: e.httpStatus, ...transform }; }); }); }); Promise.all(promises).then((res) => { const hasError = res.find((r) => !!r.errorStatus); if (hasError) { const errorAdding = res.find((r) => r.errorStatus === 403 && r.action === 'ADD'); const errorRemoving = res.find((r) => r.errorStatus === 403 && r.action === 'REMOVE'); let message = 'The edits to this role were successful, but allowed_roles for its transformations was not edited due to a lack of permissions.'; if (type === 'create') { message = 'Transformations have been attached to this role, but the role was not added to those transformations’ allowed_roles due to a lack of permissions.'; } else if (errorAdding && errorRemoving) { message = 'This role was edited to both add and remove transformations; however, this role was not added or removed from those transformations’ allowed_roles due to a lack of permissions.'; } else if (errorAdding) { message = 'This role was edited to include new transformations, but this role was not added to those transformations’ allowed_roles due to a lack of permissions.'; } else if (errorRemoving) { message = 'This role was edited to remove transformations, but this role was not removed from those transformations’ allowed_roles due to a lack of permissions.'; } this.flashMessages.info(message, { sticky: true, priority: 300, }); } }); }, actions: { createOrUpdate(type, event) { event.preventDefault(); this.applyChanges('save', () => { const roleId = this.model.id; const newModelTransformations = this.model.transformations; if (!this.initialTransformations) { this.handleUpdateTransformations( newModelTransformations.map((t) => ({ id: t, action: 'ADD', })), roleId, type ); return; } const updateTransformations = [...newModelTransformations, ...this.initialTransformations] .map((t) => { if (this.initialTransformations.indexOf(t) < 0) { return { id: t, action: 'ADD', }; } if (newModelTransformations.indexOf(t) < 0) { return { id: t, action: 'REMOVE', }; } return null; }) .filter((t) => !!t); this.handleUpdateTransformations(updateTransformations, roleId); }); }, delete() { const roleId = this.model?.id; const roleTransformations = this.model?.transformations || []; const updateTransformations = roleTransformations.map((t) => ({ id: t, action: 'REMOVE', })); this.handleUpdateTransformations(updateTransformations, roleId); this.applyDelete(); }, }, });