| /*! |
| * 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; |