2 * Created by ob0695 on 7/17/2018.
4 import { Action, Selector, State, StateContext } from '@ngxs/store';
5 import * as _ from 'lodash';
6 import { tap } from 'rxjs/operators';
7 import { ArtifactModel } from '../../../models/artifacts';
8 import { ArtifactGroupType } from '../../../utils/constants';
9 import { TopologyTemplateService } from '../../services/component-services/topology-template.service';
10 import { ComponentGenericResponse } from '../../services/responses/component-generic-response';
11 import { ServiceGenericResponse } from '../../services/responses/service-generic-response';
12 import { CreateOrUpdateArtifactAction, DeleteArtifactAction, GetArtifactsByTypeAction } from '../actions/artifacts.action';
14 export interface ArtifactsStateModel {
15 artifacts: ArtifactModel[];
16 deploymentArtifacts: ArtifactModel[];
17 toscaArtifacts: ArtifactModel[];
18 serviceApiArtifacts: ArtifactModel[];
21 @State<ArtifactsStateModel>({
25 deploymentArtifacts: [],
27 serviceApiArtifacts: []
31 export class ArtifactsState {
33 constructor(protected topologyTemplateService: TopologyTemplateService) {
37 static getEnvArtifact(state: ArtifactsStateModel, heatEnvArtifact: ArtifactModel) {
38 return (heatEnvArtifact: ArtifactModel) => {
39 _.find(state.deploymentArtifacts, (artifact)=> {
40 return artifact.generatedFromId === heatEnvArtifact.uniqueId
46 static getArtifactsByType(state: ArtifactsStateModel, type: string) {
47 return (type: string) => {
49 case ArtifactGroupType.TOSCA:
50 return state.toscaArtifacts;
51 case ArtifactGroupType.INFORMATION:
52 return state.artifacts;
53 case ArtifactGroupType.DEPLOYMENT:
54 return state.deploymentArtifacts;
55 case ArtifactGroupType.SERVICE_API:
56 return state.serviceApiArtifacts;
61 private updateArtifactState = (artifactsState: ArtifactModel[], artifactToUpdate: ArtifactModel, updatedArtifact: ArtifactModel) => {
62 if (!artifactToUpdate.uniqueId) { // Create Artifact
63 return [...artifactsState, updatedArtifact]
64 } else { // Update Artifact
65 let artifactToUpdateIndex = _.findIndex(artifactsState, (artifact) => {
66 return artifact.uniqueId === artifactToUpdate.uniqueId
68 let artifacts = Array.from(artifactsState);
69 artifacts[artifactToUpdateIndex] = updatedArtifact;
70 return [...artifacts];
74 @Action(GetArtifactsByTypeAction)
75 getArtifactsByType({getState, patchState}: StateContext<ArtifactsStateModel>, action: GetArtifactsByTypeAction) {
76 const state = getState();
77 return this.topologyTemplateService.getArtifactsByType(action.payload.componentType, action.payload.componentId, action.payload.artifactType)
78 .pipe(tap((resp: ComponentGenericResponse) => {
79 switch (action.payload.artifactType) {
80 case ArtifactGroupType.INFORMATION:
82 artifacts: <ArtifactModel[]>_.values(resp.artifacts)
85 case ArtifactGroupType.DEPLOYMENT:
87 deploymentArtifacts: <ArtifactModel[]>_.values(resp.deploymentArtifacts)
90 case ArtifactGroupType.TOSCA:
92 toscaArtifacts: <ArtifactModel[]>_.values(resp.toscaArtifacts)
95 case ArtifactGroupType.SERVICE_API:
97 serviceApiArtifacts: <ArtifactModel[]>_.values((<ServiceGenericResponse>resp).serviceApiArtifacts)
103 @Action(CreateOrUpdateArtifactAction)
104 createOrUpdateArtifact({getState, patchState}: StateContext<ArtifactsStateModel>, action: CreateOrUpdateArtifactAction) {
105 const state = getState();
106 return this.topologyTemplateService.addOrUpdateArtifact(action.payload.componentType, action.payload.componentId, action.payload.artifact)
107 .pipe(tap((resp: ArtifactModel) => {
109 switch (resp.artifactGroupType) {
110 case ArtifactGroupType.DEPLOYMENT:
112 deploymentArtifacts: this.updateArtifactState(state.deploymentArtifacts, action.payload.artifact, resp)
115 case ArtifactGroupType.INFORMATION:
117 artifacts: this.updateArtifactState(state.artifacts, action.payload.artifact, resp)
123 @Action(DeleteArtifactAction)
124 deleteArtifact({getState, patchState}: StateContext<ArtifactsStateModel>, action: DeleteArtifactAction) {
125 const state = getState();
126 return this.topologyTemplateService.deleteArtifact(action.payload.componentId, action.payload.componentType, action.payload.artifact.uniqueId, action.payload.artifact.artifactLabel)
127 .pipe(tap((resp: ArtifactModel) => {
128 switch (resp.artifactGroupType) {
129 case ArtifactGroupType.DEPLOYMENT:
131 deploymentArtifacts: state.deploymentArtifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)
133 case ArtifactGroupType.INFORMATION:
135 artifacts: state.artifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)