e7ee75715c5ee0ddf78681ccafb9c45271600146
[sdc/sdc-workflow-designer.git] /
1 package org.onap.sdc.workflow.api;
2
3 import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM;
4
5 import io.swagger.annotations.Api;
6 import io.swagger.annotations.ApiOperation;
7 import io.swagger.annotations.ApiParam;
8 import java.util.Arrays;
9 import java.util.Collections;
10 import java.util.Set;
11 import java.util.stream.Collectors;
12 import org.onap.sdc.workflow.api.types.CollectionWrapper;
13 import org.onap.sdc.workflow.api.types.VersionStateDto;
14 import org.onap.sdc.workflow.persistence.types.ArtifactEntity;
15 import org.onap.sdc.workflow.persistence.types.WorkflowVersion;
16 import org.onap.sdc.workflow.persistence.types.WorkflowVersionState;
17 import org.onap.sdc.workflow.services.WorkflowVersionManager;
18 import org.openecomp.sdc.logging.api.Logger;
19 import org.openecomp.sdc.logging.api.LoggerFactory;
20 import org.springframework.beans.factory.annotation.Autowired;
21 import org.springframework.beans.factory.annotation.Qualifier;
22 import org.springframework.core.io.InputStreamResource;
23 import org.springframework.core.io.Resource;
24 import org.springframework.http.HttpHeaders;
25 import org.springframework.http.HttpStatus;
26 import org.springframework.http.MediaType;
27 import org.springframework.http.ResponseEntity;
28 import org.springframework.web.bind.annotation.DeleteMapping;
29 import org.springframework.web.bind.annotation.GetMapping;
30 import org.springframework.web.bind.annotation.PathVariable;
31 import org.springframework.web.bind.annotation.PostMapping;
32 import org.springframework.web.bind.annotation.PutMapping;
33 import org.springframework.web.bind.annotation.RequestBody;
34 import org.springframework.web.bind.annotation.RequestHeader;
35 import org.springframework.web.bind.annotation.RequestMapping;
36 import org.springframework.web.bind.annotation.RequestParam;
37 import org.springframework.web.bind.annotation.RestController;
38 import org.springframework.web.multipart.MultipartFile;
39
40 @RequestMapping("/workflows/{workflowId}/versions")
41 @Api("Workflow versions")
42 @RestController("workflowsVersionController")
43 public class WorkflowVersionController {
44
45     private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowVersionController.class);
46     private final WorkflowVersionManager workflowVersionManager;
47
48     @Autowired
49     public WorkflowVersionController(
50             @Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager) {
51         this.workflowVersionManager = workflowVersionManager;
52     }
53
54     @GetMapping
55     @ApiOperation("List workflow versions")
56     public CollectionWrapper<WorkflowVersion> list(@PathVariable("workflowId") String workflowId,
57             @ApiParam(value = "Filter by state", allowableValues = "DRAFT,CERTIFIED")
58             @RequestParam(value = "state", required = false) String stateFilter,
59             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
60         Set<WorkflowVersionState> filter;
61         try {
62             filter = stateFilter == null ? null :
63                              Arrays.stream(stateFilter.split(",")).map(WorkflowVersionState::valueOf)
64                                    .collect(Collectors.toSet());
65         } catch (Exception e) {
66             LOGGER.info("Invalid state filter value - return empty list of workflow versions");
67             return new CollectionWrapper<>(Collections.emptyList());
68         }
69         return new CollectionWrapper<>(workflowVersionManager.list(workflowId, filter));
70     }
71
72     @PostMapping
73     @ApiOperation("Create workflow version")
74     public ResponseEntity<WorkflowVersion> create(@RequestBody WorkflowVersion version,
75             @PathVariable("workflowId") String workflowId,
76             @RequestParam(value = "baseVersionId", required = false) String baseVersionId,
77             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
78         WorkflowVersion createdVersion = workflowVersionManager.create(workflowId, baseVersionId, version);
79         return new ResponseEntity<>(createdVersion, HttpStatus.CREATED);
80     }
81
82     @GetMapping("/{versionId}")
83     @ApiOperation("Get workflow version")
84     public WorkflowVersion get(@PathVariable("workflowId") String workflowId,
85             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
86         return workflowVersionManager.get(workflowId, versionId);
87     }
88
89     @PutMapping("/{versionId}")
90     @ApiOperation("Update workflow version")
91     public void update(@RequestBody WorkflowVersion version, @PathVariable("workflowId") String workflowId,
92             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
93         version.setId(versionId);
94         workflowVersionManager.update(workflowId, version);
95     }
96
97     @GetMapping("/{versionId}/state")
98     @ApiOperation("Get workflow version state")
99     public VersionStateDto getState(@PathVariable("workflowId") String workflowId,
100             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
101         return new VersionStateDto(workflowVersionManager.getState(workflowId, versionId));
102     }
103
104     @PostMapping("/{versionId}/state")
105     @ApiOperation("Update workflow version state")
106     public VersionStateDto updateState(@RequestBody VersionStateDto state,
107             @PathVariable("workflowId") String workflowId, @PathVariable("versionId") String versionId,
108             @RequestHeader(USER_ID_HEADER_PARAM) String user) {
109         workflowVersionManager.updateState(workflowId, versionId, state.getName());
110         return new VersionStateDto(state.getName());
111     }
112
113     @PutMapping("/{versionId}/artifact")
114     @ApiOperation("Create/update artifact of a version")
115     public void uploadArtifact(@RequestBody MultipartFile fileToUpload, @PathVariable("workflowId") String workflowId,
116             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
117         workflowVersionManager.uploadArtifact(workflowId, versionId, fileToUpload);
118     }
119
120     @GetMapping("/{versionId}/artifact")
121     @ApiOperation("Download workflow version artifact")
122     public ResponseEntity<Resource> getArtifact(@PathVariable("workflowId") String workflowId,
123             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
124         ArtifactEntity artifact = workflowVersionManager.getArtifact(workflowId, versionId);
125
126         return ResponseEntity.ok()
127                              .header(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + artifact.getFileName())
128                              .contentType(MediaType.APPLICATION_OCTET_STREAM)
129                              .body(new InputStreamResource(artifact.getArtifactData()));
130     }
131
132     @DeleteMapping("/{versionId}/artifact")
133     @ApiOperation("Delete workflow version artifact")
134     public void deleteArtifact(@PathVariable("workflowId") String workflowId,
135             @PathVariable("versionId") String versionId, @RequestHeader(USER_ID_HEADER_PARAM) String user) {
136         workflowVersionManager.deleteArtifact(workflowId, versionId);
137     }
138 }