blob: 9fb65f37d4f02920bc080c697522acce11459cb2 [file] [log] [blame]
/*!
* 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;