91995bd03027982f711f0e072c3577155efad685
[sdc/sdc-workflow-designer.git] /
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.RestUtils.mapVersionStateFilter;
20 import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM;
21
22 import io.swagger.annotations.Api;
23 import io.swagger.annotations.ApiOperation;
24 import io.swagger.annotations.ApiParam;
25 import org.onap.sdc.workflow.api.types.CollectionWrapper;
26 import org.onap.sdc.workflow.api.types.VersionStateDto;
27 import org.onap.sdc.workflow.persistence.types.ArtifactEntity;
28 import org.onap.sdc.workflow.persistence.types.WorkflowVersion;
29 import org.onap.sdc.workflow.services.WorkflowVersionManager;
30 import org.springframework.beans.factory.annotation.Autowired;
31 import org.springframework.beans.factory.annotation.Qualifier;
32 import org.springframework.core.io.InputStreamResource;
33 import org.springframework.core.io.Resource;
34 import org.springframework.http.HttpHeaders;
35 import org.springframework.http.HttpStatus;
36 import org.springframework.http.MediaType;
37 import org.springframework.http.ResponseEntity;
38 import org.springframework.validation.Validator;
39 import org.springframework.validation.annotation.Validated;
40 import org.springframework.web.bind.WebDataBinder;
41 import org.springframework.web.bind.annotation.DeleteMapping;
42 import org.springframework.web.bind.annotation.GetMapping;
43 import org.springframework.web.bind.annotation.InitBinder;
44 import org.springframework.web.bind.annotation.PathVariable;
45 import org.springframework.web.bind.annotation.PostMapping;
46 import org.springframework.web.bind.annotation.PutMapping;
47 import org.springframework.web.bind.annotation.RequestBody;
48 import org.springframework.web.bind.annotation.RequestHeader;
49 import org.springframework.web.bind.annotation.RequestMapping;
50 import org.springframework.web.bind.annotation.RequestParam;
51 import org.springframework.web.bind.annotation.RestController;
52 import org.springframework.web.multipart.MultipartFile;
53
54 @RequestMapping("/workflows/{workflowId}/versions")
55 @Api("Workflow versions")
56 @RestController("workflowsVersionController")
57 public class WorkflowVersionController {
58
59     private final WorkflowVersionManager workflowVersionManager;
60     private Validator validator;
61
62     @InitBinder
63     private void initBinder(WebDataBinder binder) {
64         binder.addValidators(validator);
65     }
66
67     @Autowired
68     public WorkflowVersionController(
69             @Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager,
70             @Qualifier("workflowVersionValidator") Validator validator ) {
71         this.workflowVersionManager = workflowVersionManager;
72         this.validator = validator;
73     }
74
75     @GetMapping
76     @ApiOperation("List workflow versions")
77     public CollectionWrapper<WorkflowVersion> list(@PathVariable("workflowId") String workflowId,
78             @ApiParam(value = "Filter by state", allowableValues = "DRAFT,CERTIFIED")
79             @RequestParam(value = "state", required = false) String stateFilter,
80             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
81         return new CollectionWrapper<>(workflowVersionManager.list(workflowId, mapVersionStateFilter(stateFilter)));
82     }
83
84     @PostMapping
85     @ApiOperation("Create workflow version")
86     public ResponseEntity<WorkflowVersion> create(@RequestBody @Validated WorkflowVersion version,
87             @PathVariable("workflowId") String workflowId,
88             @RequestParam(value = "baseVersionId", required = false) String baseVersionId,
89             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
90         WorkflowVersion createdVersion = workflowVersionManager.create(workflowId, baseVersionId, version);
91         return new ResponseEntity<>(createdVersion, HttpStatus.CREATED);
92     }
93
94     @GetMapping("/{versionId}")
95     @ApiOperation("Get workflow version")
96     public WorkflowVersion get(@PathVariable("workflowId") String workflowId,
97             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
98         return workflowVersionManager.get(workflowId, versionId);
99     }
100
101     @PutMapping("/{versionId}")
102     @ApiOperation("Update workflow version")
103     public void update(@RequestBody @Validated WorkflowVersion version, @PathVariable("workflowId") String workflowId,
104             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
105         version.setId(versionId);
106         workflowVersionManager.update(workflowId, version);
107     }
108
109     @GetMapping("/{versionId}/state")
110     @ApiOperation("Get workflow version state")
111     public VersionStateDto getState(@PathVariable("workflowId") String workflowId,
112             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
113         return new VersionStateDto(workflowVersionManager.getState(workflowId, versionId));
114     }
115
116     @PostMapping("/{versionId}/state")
117     @ApiOperation("Update workflow version state")
118     public VersionStateDto updateState(@RequestBody VersionStateDto state,
119             @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId,
120             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
121         workflowVersionManager.updateState(workflowId, versionId, state.getName());
122         return new VersionStateDto(state.getName());
123     }
124
125     @PutMapping("/{versionId}/artifact")
126     @ApiOperation("Create/update artifact of a version")
127     public void uploadArtifact(@RequestBody MultipartFile fileToUpload, @PathVariable("workflowId") String workflowId,
128             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
129         workflowVersionManager.uploadArtifact(workflowId, versionId, fileToUpload);
130     }
131
132     @GetMapping("/{versionId}/artifact")
133     @ApiOperation("Download workflow version artifact")
134     public ResponseEntity<Resource> getArtifact(@PathVariable("workflowId") String workflowId,
135             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
136         ArtifactEntity artifact = workflowVersionManager.getArtifact(workflowId, versionId);
137
138         return ResponseEntity.ok()
139                              .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFileName())
140                              .contentType(MediaType.APPLICATION_OCTET_STREAM)
141                              .body(new InputStreamResource(artifact.getArtifactData()));
142     }
143
144     @DeleteMapping("/{versionId}/artifact")
145     @ApiOperation("Delete workflow version artifact")
146     public void deleteArtifact(@PathVariable("workflowId") String workflowId,
147             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
148         workflowVersionManager.deleteArtifact(workflowId, versionId);
149     }
150 }