1 package org.onap.sdc.workflow.api;
 
   3 import static org.onap.sdc.workflow.api.RestConstants.USER_ID_HEADER_PARAM;
 
   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;
 
  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;
 
  40 @RequestMapping("/workflows/{workflowId}/versions")
 
  41 @Api("Workflow versions")
 
  42 @RestController("workflowsVersionController")
 
  43 public class WorkflowVersionController {
 
  45     private static final Logger LOGGER = LoggerFactory.getLogger(WorkflowVersionController.class);
 
  46     private final WorkflowVersionManager workflowVersionManager;
 
  49     public WorkflowVersionController(
 
  50             @Qualifier("workflowVersionManager") WorkflowVersionManager workflowVersionManager) {
 
  51         this.workflowVersionManager = workflowVersionManager;
 
  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;
 
  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());
 
  69         return new CollectionWrapper<>(workflowVersionManager.list(workflowId, filter));
 
  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);
 
  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);
 
  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);
 
  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));
 
 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());
 
 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);
 
 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);
 
 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()));
 
 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);