f869ce05751729dd102523f52b6019a0401cc851
[sdc/sdc-workflow-designer.git] / workflow-designer-be / src / main / java / org / onap / sdc / workflow / api / WorkflowVersionController.java
1 /*
2  * Copyright © 2018 European Support Limited
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 package org.onap.sdc.workflow.api;
18
19 import static org.onap.sdc.workflow.api.RestParams.USER_ID_HEADER;
20
21 import io.swagger.annotations.Api;
22 import io.swagger.annotations.ApiImplicitParam;
23 import io.swagger.annotations.ApiOperation;
24 import javax.validation.Valid;
25 import org.onap.sdc.workflow.api.types.CollectionResponse;
26 import org.onap.sdc.workflow.api.types.VersionStateDto;
27 import org.onap.sdc.workflow.api.types.VersionStatesFormatter;
28 import org.onap.sdc.workflow.api.types.dto.ArtifactDeliveriesRequestDto;
29 import org.onap.sdc.workflow.persistence.types.ArtifactEntity;
30 import org.onap.sdc.workflow.services.WorkflowVersionManager;
31 import org.onap.sdc.workflow.services.types.WorkflowVersion;
32 import org.springframework.beans.factory.annotation.Autowired;
33 import org.springframework.beans.factory.annotation.Qualifier;
34 import org.springframework.core.io.InputStreamResource;
35 import org.springframework.core.io.Resource;
36 import org.springframework.http.HttpHeaders;
37 import org.springframework.http.HttpStatus;
38 import org.springframework.http.MediaType;
39 import org.springframework.http.ResponseEntity;
40 import org.springframework.web.bind.annotation.DeleteMapping;
41 import org.springframework.web.bind.annotation.GetMapping;
42 import org.springframework.web.bind.annotation.PathVariable;
43 import org.springframework.web.bind.annotation.PostMapping;
44 import org.springframework.web.bind.annotation.PutMapping;
45 import org.springframework.web.bind.annotation.RequestBody;
46 import org.springframework.web.bind.annotation.RequestHeader;
47 import org.springframework.web.bind.annotation.RequestMapping;
48 import org.springframework.web.bind.annotation.RequestParam;
49 import org.springframework.web.bind.annotation.RestController;
50 import org.springframework.web.multipart.MultipartFile;
51 import springfox.documentation.annotations.ApiIgnore;
52
53 @RequestMapping("/wf/workflows/{workflowId}/versions")
54 @Api("Workflow versions")
55 @RestController("workflowsVersionController")
56 public class WorkflowVersionController {
57
58     private final WorkflowVersionManager workflowVersionManager;
59     private final ArtifactAssociationService associationHandler;
60
61     @Autowired
62     public WorkflowVersionController(@Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager,
63             @Qualifier("ArtifactAssociationHandler") ArtifactAssociationService artifatcAssociationHandler) {
64         this.workflowVersionManager = workflowVersionManager;
65         this.associationHandler = artifatcAssociationHandler;
66     }
67
68     @GetMapping
69     @ApiOperation("List workflow versions")
70     @ApiImplicitParam(name = "state", dataType = "string", paramType = "query", allowableValues = "DRAFT,CERTIFIED",
71             value = "Filter by state")
72     public CollectionResponse<WorkflowVersion> list(@PathVariable("workflowId") String workflowId,
73             @ApiIgnore VersionStatesFormatter stateFilter, @RequestHeader(USER_ID_HEADER) String user) {
74         return new CollectionResponse<>(workflowVersionManager.list(workflowId, stateFilter.getVersionStates()));
75     }
76
77     @PostMapping
78     @ApiOperation("Create workflow version")
79     public ResponseEntity<WorkflowVersion> create(@RequestBody @Valid WorkflowVersion version,
80             @PathVariable("workflowId") String workflowId,
81             @RequestParam(value = "baseVersionId", required = false) String baseVersionId,
82             @RequestHeader(USER_ID_HEADER) String user) {
83         WorkflowVersion createdVersion = workflowVersionManager.create(workflowId, baseVersionId, version);
84         return new ResponseEntity<>(createdVersion, HttpStatus.CREATED);
85     }
86
87     @GetMapping("/{versionId}")
88     @ApiOperation("Get workflow version")
89     public WorkflowVersion get(@PathVariable("workflowId") String workflowId,
90             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
91         return workflowVersionManager.get(workflowId, versionId);
92     }
93
94     @PutMapping("/{versionId}")
95     @ApiOperation("Update workflow version")
96     public void update(@RequestBody @Valid WorkflowVersion version, @PathVariable("workflowId") String workflowId,
97             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
98         version.setId(versionId);
99         workflowVersionManager.update(workflowId, version);
100     }
101
102     @GetMapping("/{versionId}/state")
103     @ApiOperation("Get workflow version state")
104     public VersionStateDto getState(@PathVariable("workflowId") String workflowId,
105             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
106         return new VersionStateDto(workflowVersionManager.getState(workflowId, versionId));
107     }
108
109     @PostMapping("/{versionId}/state")
110     @ApiOperation("Update workflow version state")
111     public VersionStateDto updateState(@RequestBody VersionStateDto state,
112             @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId,
113             @RequestHeader(USER_ID_HEADER) String user) {
114         workflowVersionManager.updateState(workflowId, versionId, state.getName());
115         return new VersionStateDto(state.getName());
116     }
117
118     @PostMapping("/{versionId}/artifact-deliveries")
119     @ApiOperation("upload of artifact to VF operation workflow")
120     public ResponseEntity<String> artifactDeliveries(@RequestBody ArtifactDeliveriesRequestDto deliveriesRequestDto,
121             @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId,
122             @RequestHeader(USER_ID_HEADER) String user) {
123         return associationHandler
124                        .execute(user, deliveriesRequestDto, workflowVersionManager.getArtifact(workflowId, versionId));
125     }
126
127     @PutMapping("/{versionId}/artifact")
128     @ApiOperation("Create/update artifact of a version")
129     public void uploadArtifact(@RequestBody MultipartFile fileToUpload, @PathVariable("workflowId") String workflowId,
130             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
131         workflowVersionManager.uploadArtifact(workflowId, versionId, fileToUpload);
132     }
133
134     @GetMapping("/{versionId}/artifact")
135     @ApiOperation("Download workflow version artifact")
136     public ResponseEntity<Resource> getArtifact(@PathVariable("workflowId") String workflowId,
137             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
138         ArtifactEntity artifact = workflowVersionManager.getArtifact(workflowId, versionId);
139
140         return ResponseEntity.ok()
141                        .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFileName())
142                        .contentType(MediaType.APPLICATION_OCTET_STREAM)
143                        .body(new InputStreamResource(artifact.getArtifactData()));
144     }
145
146     @DeleteMapping("/{versionId}/artifact")
147     @ApiOperation("Delete workflow version artifact")
148     public void deleteArtifact(@PathVariable("workflowId") String workflowId,
149             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER) String user) {
150         workflowVersionManager.deleteArtifact(workflowId, versionId);
151     }
152 }