2 * Created by ob0695 on 7/17/2018.
4 import { Action, Selector, State, StateContext, Store } 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 { ComponentInstanceServiceNg2 } from '../../services/component-instance-services/component-instance.service';
10 import { ComponentGenericResponse } from '../../services/responses/component-generic-response';
12 CreateInstanceArtifactAction,
13 DeleteInstanceArtifactAction,
14 GetInstanceArtifactsByTypeAction,
15 UpdateInstanceArtifactAction
16 } from '../actions/instance-artifacts.actions';
17 import { ArtifactsStateModel } from './artifacts.state';
19 export interface InstanceArtifactsStateModel {
20 artifacts: ArtifactModel[];
21 deploymentArtifacts: ArtifactModel[];
24 @State<InstanceArtifactsStateModel>({
25 name: 'instance_artifacts',
28 deploymentArtifacts: []
31 export class InstanceArtifactsState {
33 constructor(private store: Store, protected componentInstanceService: ComponentInstanceServiceNg2) {
37 static getArtifactsByType(state: InstanceArtifactsStateModel) {
38 return (type: string) => {
40 case ArtifactGroupType.INFORMATION:
41 return state.artifacts;
42 case ArtifactGroupType.DEPLOYMENT:
43 return state.deploymentArtifacts;
48 @Action(GetInstanceArtifactsByTypeAction)
49 getInstanceArtifactsByType({getState, patchState}: StateContext<InstanceArtifactsStateModel>, action: GetInstanceArtifactsByTypeAction) {
50 const state = getState();
51 return this.componentInstanceService.getComponentInstanceArtifactsByGroupType(action.payload.componentType, action.payload.componentId, action.payload.instanceId, action.payload.artifactType)
52 .pipe(tap((resp: ComponentGenericResponse) => {
53 switch (action.payload.artifactType) {
54 case ArtifactGroupType.INFORMATION:
56 artifacts: _.values(resp) as ArtifactModel[]
59 case ArtifactGroupType.DEPLOYMENT:
61 deploymentArtifacts: _.values(resp) as ArtifactModel[]
68 @Action(CreateInstanceArtifactAction)
69 createArtifact({getState, patchState}: StateContext<ArtifactsStateModel>, action: CreateInstanceArtifactAction) {
70 const state = getState();
71 return this.componentInstanceService.addInstanceArtifact(action.payload.componentType, action.payload.componentId, action.payload.instanceId, action.payload.artifact)
72 .pipe(tap((resp: ArtifactModel) => {
73 switch (resp.artifactGroupType) {
74 case ArtifactGroupType.DEPLOYMENT:
76 deploymentArtifacts: [...state.deploymentArtifacts, resp]
79 case ArtifactGroupType.INFORMATION:
81 artifacts: [...state.artifacts, resp]
88 @Action(UpdateInstanceArtifactAction)
89 updateArtifact({getState, patchState}: StateContext<ArtifactsStateModel>, action: UpdateInstanceArtifactAction) {
90 const state = getState();
91 return this.componentInstanceService.updateInstanceArtifact(action.payload.componentType, action.payload.componentId, action.payload.instanceId, action.payload.artifact)
92 .pipe(tap((resp: ArtifactModel) => {
93 switch (resp.artifactGroupType) {
94 case ArtifactGroupType.DEPLOYMENT:
95 // We cannot simply update the updated artifact state because updating a deployment ENV file may cause an update to his parent HEAT
97 // Just dispatch an action to refresh the deployment artifacts list
98 this.store.dispatch(new GetInstanceArtifactsByTypeAction(({
99 componentType: action.payload.componentType,
100 componentId: action.payload.componentId,
101 instanceId: action.payload.instanceId,
102 artifactType: ArtifactGroupType.DEPLOYMENT
105 case ArtifactGroupType.INFORMATION:
107 artifacts: this.updateInstanceArtifactState(state.artifacts, action.payload.artifact, resp)
114 @Action(DeleteInstanceArtifactAction)
115 deleteInstanceArtifact({getState, patchState}: StateContext<ArtifactsStateModel>, action: DeleteInstanceArtifactAction) {
116 const state = getState();
117 return this.componentInstanceService.
118 deleteInstanceArtifact(action.payload.componentId, action.payload.componentType, action.payload.instanceId, action.payload.artifact.uniqueId, action.payload.artifact.artifactLabel)
119 .pipe(tap((resp: ArtifactModel) => {
120 switch (resp.artifactGroupType) {
121 case ArtifactGroupType.DEPLOYMENT:
123 deploymentArtifacts: state.deploymentArtifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)
126 case ArtifactGroupType.INFORMATION:
128 artifacts: state.artifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)
135 private updateInstanceArtifactState = (artifactsState: ArtifactModel[], artifactToUpdate: ArtifactModel, updatedArtifact: ArtifactModel) => {
136 const artifactToUpdateIndex = _.findIndex(artifactsState, (artifact) => {
137 return artifact.uniqueId === artifactToUpdate.uniqueId;
139 const artifacts = Array.from(artifactsState);
140 artifacts[artifactToUpdateIndex] = updatedArtifact;
141 const ret = [...artifacts];