| /*! |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| import RestAPIUtil from 'nfvo-utils/RestAPIUtil.js'; |
| import Configuration from 'sdc-app/config/Configuration.js'; |
| import {actionTypes, enums} from './FlowsConstants.js'; |
| import SequenceDiagramModelHelper from './SequenceDiagramModelHelper.js'; |
| |
| |
| function baseUrl(serviceId, artifactId = '') { |
| const restCatalogPrefix = Configuration.get('restCatalogPrefix'); |
| return `${restCatalogPrefix}/v1/catalog/services/${serviceId}/artifacts/${artifactId}`; |
| } |
| |
| function encodeDataToBase64(dataAsString) { |
| return window.btoa(dataAsString); |
| } |
| |
| function decodeDataToBase64(encodedData) { |
| return window.atob(encodedData); |
| } |
| |
| function encodeContent(flowData) { |
| let data = { |
| VERSION: { |
| major: 1, |
| minor: 0 |
| }, |
| description: flowData.description, |
| sequenceDiagramModel: flowData.sequenceDiagramModel |
| }; |
| |
| return encodeDataToBase64(JSON.stringify(data)); |
| } |
| |
| function decodeContent(base64Contents) { |
| let description, sequenceDiagramModel; |
| let payload = JSON.parse(decodeDataToBase64(base64Contents)); |
| |
| if (payload.VERSION === undefined) { |
| description = payload.description || 'Please, provide description...'; |
| sequenceDiagramModel = payload.data || payload; |
| sequenceDiagramModel = sequenceDiagramModel.model || sequenceDiagramModel; |
| |
| } |
| else if (payload.VERSION.major === 1) { |
| description = payload.description; |
| sequenceDiagramModel = payload.sequenceDiagramModel; |
| } |
| |
| return { |
| description, |
| sequenceDiagramModel |
| }; |
| } |
| |
| function createOrUpdate(flowData) { |
| let createOrUpdateRequest = { |
| payloadData: encodeContent(flowData), |
| artifactLabel: flowData.artifactLabel || flowData.artifactName, |
| artifactName: flowData.artifactName, |
| artifactType: flowData.artifactType, |
| artifactGroupType: enums.INFORMATIONAL, |
| description: flowData.description |
| }; |
| |
| return RestAPIUtil.post( |
| baseUrl(flowData.serviceID, flowData.uniqueId), |
| createOrUpdateRequest, |
| {md5: true} |
| ); |
| } |
| |
| const FlowsActions = Object.freeze({ |
| |
| fetchFlowArtifacts(dispatch, {artifacts, diagramType, participants, serviceID, readonly}) { |
| let results = []; |
| if (!Object.keys(artifacts).length) { |
| dispatch({type: actionTypes.FLOW_LIST_LOADED, results, participants, serviceID, diagramType, readonly}); |
| if (!readonly) { |
| FlowsActions.openFlowDetailsEditor(dispatch); |
| } |
| } |
| else { |
| Object.keys(artifacts).forEach(artifact => results.push({ |
| artifactType: diagramType, |
| participants, |
| serviceID, |
| ...artifacts[artifact] |
| })); |
| dispatch({type: actionTypes.FLOW_LIST_LOADED, results, participants, serviceID, diagramType, readonly}); |
| } |
| }, |
| |
| fetchArtifact(dispatch, {flow}){ |
| let {serviceID, uniqueId, participants} = flow; |
| return RestAPIUtil.fetch(baseUrl(serviceID, uniqueId)).then(response => { |
| |
| let {artifactName, base64Contents} = response; |
| let {sequenceDiagramModel, ...other} = decodeContent(base64Contents); |
| |
| if (!sequenceDiagramModel) { |
| sequenceDiagramModel = SequenceDiagramModelHelper.createModel({ |
| id: uniqueId, |
| name: artifactName, |
| lifelines: participants |
| }); |
| } |
| else { |
| sequenceDiagramModel = SequenceDiagramModelHelper.updateModel(sequenceDiagramModel, { |
| name: artifactName, |
| lifelines: participants |
| }); |
| } |
| |
| flow = { |
| ...flow, |
| ...other, |
| uniqueId, |
| artifactName, |
| sequenceDiagramModel |
| }; |
| |
| dispatch({type: actionTypes.ARTIFACT_LOADED, flow}); |
| FlowsActions.openFlowDiagramEditor(dispatch, {flow}); |
| }); |
| }, |
| |
| createOrUpdateFlow(dispatch, {flow}, isNew) { |
| if (!isNew && flow.sequenceDiagramModel) { |
| flow.sequenceDiagramModel = SequenceDiagramModelHelper.updateModel(flow.sequenceDiagramModel, { |
| name: flow.artifactName |
| }); |
| } |
| return createOrUpdate(flow).then(response => { |
| let {uniqueId, artifactLabel} = response; |
| flow = {...flow, uniqueId, artifactLabel}; |
| if (isNew) { |
| flow.sequenceDiagramModel = SequenceDiagramModelHelper.createModel({id: uniqueId, name: flow.artifactName}); |
| } |
| dispatch({type: actionTypes.ADD_OR_UPDATE_FLOW, flow}); |
| }); |
| }, |
| |
| deleteFlow(dispatch, {flow}) { |
| return RestAPIUtil.destroy(baseUrl(flow.serviceID, flow.uniqueId)).then(() => dispatch({ |
| type: actionTypes.DELETE_FLOW, |
| flow |
| })); |
| }, |
| |
| openFlowDetailsEditor(dispatch, flow) { |
| dispatch({type: actionTypes.OPEN_FLOW_DETAILS_EDITOR, flow}); |
| }, |
| |
| closeFlowDetailsEditor(dispatch) { |
| dispatch({type: actionTypes.CLOSE_FLOW_DETAILS_EDITOR}); |
| }, |
| |
| openFlowDiagramEditor(dispatch, {flow}) { |
| dispatch({type: actionTypes.OPEN_FLOW_DIAGRAM_EDITOR, flow}); |
| }, |
| |
| closeFlowDiagramEditor(dispatch) { |
| dispatch({type: actionTypes.CLOSE_FLOW_DIAGRAM_EDITOR}); |
| }, |
| |
| reset(dispatch) { |
| dispatch({type: actionTypes.RESET}); |
| } |
| }); |
| |
| export default FlowsActions; |