Catalog alignment
[sdc.git] / catalog-ui / src / app / ng2 / store / states / instance-artifacts.state.ts
1 /**
2  * Created by ob0695 on 7/17/2018.
3  */
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';
11 import {
12     CreateInstanceArtifactAction,
13     DeleteInstanceArtifactAction,
14     GetInstanceArtifactsByTypeAction,
15     UpdateInstanceArtifactAction
16 } from '../actions/instance-artifacts.actions';
17 import { ArtifactsStateModel } from './artifacts.state';
18
19 export interface InstanceArtifactsStateModel {
20     artifacts: ArtifactModel[];
21     deploymentArtifacts: ArtifactModel[];
22 }
23
24 @State<InstanceArtifactsStateModel>({
25     name: 'instance_artifacts',
26     defaults: {
27         artifacts: [],
28         deploymentArtifacts: []
29     }
30 })
31 export class InstanceArtifactsState {
32
33     constructor(private store: Store, protected componentInstanceService: ComponentInstanceServiceNg2) {
34     }
35
36     @Selector()
37     static getArtifactsByType(state: InstanceArtifactsStateModel) {
38         return (type: string) => {
39             switch (type) {
40                 case  ArtifactGroupType.INFORMATION:
41                     return state.artifacts;
42                 case ArtifactGroupType.DEPLOYMENT:
43                     return state.deploymentArtifacts;
44             }
45         };
46     }
47
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:
55                         patchState({
56                             artifacts: _.values(resp) as ArtifactModel[]
57                         });
58                         break;
59                     case ArtifactGroupType.DEPLOYMENT:
60                         patchState({
61                             deploymentArtifacts: _.values(resp) as ArtifactModel[]
62                         });
63                         break;
64                 }
65             }));
66     }
67
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:
75                         patchState({
76                             deploymentArtifacts: [...state.deploymentArtifacts, resp]
77                         });
78                         break;
79                     case ArtifactGroupType.INFORMATION:
80                         patchState({
81                             artifacts: [...state.artifacts, resp]
82                         });
83                         break;
84                 }
85             }));
86     }
87
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
96                         // file.
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
103                         })));
104                         break;
105                     case ArtifactGroupType.INFORMATION:
106                         patchState({
107                             artifacts: this.updateInstanceArtifactState(state.artifacts, action.payload.artifact, resp)
108                         });
109                         break;
110                 }
111             }));
112     }
113
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:
122                         patchState({
123                             deploymentArtifacts: state.deploymentArtifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)
124                         });
125                         break;
126                     case ArtifactGroupType.INFORMATION:
127                         patchState({
128                             artifacts: state.artifacts.filter(({uniqueId}) => uniqueId !== action.payload.artifact.uniqueId)
129                         });
130                         break;
131                 }
132             }));
133     }
134
135     private updateInstanceArtifactState = (artifactsState: ArtifactModel[], artifactToUpdate: ArtifactModel, updatedArtifact: ArtifactModel) => {
136         const artifactToUpdateIndex = _.findIndex(artifactsState, (artifact) => {
137             return artifact.uniqueId === artifactToUpdate.uniqueId;
138         });
139         const artifacts = Array.from(artifactsState);
140         artifacts[artifactToUpdateIndex] = updatedArtifact;
141         const ret = [...artifacts];
142         return ret;
143     }
144
145 }