Skip to content
This repository has been archived by the owner on Jul 23, 2024. It is now read-only.

Commit

Permalink
Merge pull request #138 from redhat-developer/FLPATH-184
Browse files Browse the repository at this point in the history
add workflow status rest  endpoint
  • Loading branch information
RichardW98 committed Mar 22, 2023
2 parents d1a2cac + ffe5dca commit d49e516
Show file tree
Hide file tree
Showing 11 changed files with 574 additions and 16 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.redhat.parodos.workflow.definition.entity;

import com.redhat.parodos.common.AbstractEntity;
import com.redhat.parodos.workflow.enums.WorkType;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -9,6 +10,7 @@

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Enumerated;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import java.util.Date;
Expand All @@ -24,7 +26,8 @@ public class WorkFlowWorkDefinition extends AbstractEntity {

private UUID workDefinitionId;

private String workDefinitionType;
@Enumerated
private WorkType workDefinitionType;

@ManyToOne(optional = false)
@JoinColumn(name = "workflow_definition_id")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,9 +98,9 @@ public WorkFlowDefinitionResponseDTO save(String workFlowName, WorkFlowType work
if (work instanceof WorkFlow) { // WorkFlow
// A workflow in works should already been stored
workId = workFlowDefinitionRepository.findFirstByName(work.getName()).getId();
workFlowWorkDefinitions.add(WorkFlowWorkDefinition.builder().workDefinitionId(workId)
.workDefinitionType(WorkType.WORKFLOW.name()).workFlowDefinition(workFlowDefinition)
.createDate(new Date()).build());
workFlowWorkDefinitions.add(
WorkFlowWorkDefinition.builder().workDefinitionId(workId).workDefinitionType(WorkType.WORKFLOW)
.workFlowDefinition(workFlowDefinition).createDate(new Date()).build());
}
else { // WorkFlowTask
WorkFlowTask workFlowTask = (WorkFlowTask) work;
Expand All @@ -117,9 +117,9 @@ public WorkFlowDefinitionResponseDTO save(String workFlowName, WorkFlowType work
.outputs(WorkFlowDTOUtil.writeObjectValueAsString(workFlowTask.getWorkFlowTaskOutputs()))
.workFlowDefinition(workFlowDefinition).createDate(new Date()).modifyDate(new Date()).build())
.getId();
workFlowWorkDefinitions.add(WorkFlowWorkDefinition.builder().workDefinitionId(workId)
.workDefinitionType(WorkType.TASK.name()).workFlowDefinition(workFlowDefinition)
.createDate(new Date()).build());
workFlowWorkDefinitions
.add(WorkFlowWorkDefinition.builder().workDefinitionId(workId).workDefinitionType(WorkType.TASK)
.workFlowDefinition(workFlowDefinition).createDate(new Date()).build());
}
});
workFlowDefinition.setWorkFlowWorkDefinitions(workFlowWorkDefinitions);
Expand Down Expand Up @@ -219,7 +219,7 @@ private List<WorkDefinitionResponseDTO> buildWorkFlowWorksDTOs(WorkFlowDefinitio

// add workflowWorkUnits
workFlowWorkDefinitions.forEach(workFlowWorkDefinition -> {
if (workFlowWorkDefinition.getWorkDefinitionType().equalsIgnoreCase(WorkType.TASK.name())) { // Task
if (workFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.TASK)) { // Task
WorkFlowTaskDefinition wdt = workFlowTaskDefinitionRepository
.findById(workFlowWorkDefinition.getWorkDefinitionId()).get();
workDefinitionResponseDTOs.add(WorkDefinitionResponseDTO.builder().id(wdt.getId().toString())
Expand Down Expand Up @@ -256,7 +256,7 @@ private List<WorkDefinitionResponseDTO> buildWorkFlowWorksDTOs(WorkFlowDefinitio
.collect(Collectors.toList());

workFlowWorkUnits1Definition.forEach(wwdt1 -> {
if (wwdt1.getWorkDefinitionType().equalsIgnoreCase(WorkType.TASK.name())) { // Task
if (wwdt1.getWorkDefinitionType().equals(WorkType.TASK)) { // Task
WorkFlowTaskDefinition wdt1 = workFlowTaskDefinitionRepository
.findById(wwdt1.getWorkDefinitionId()).get();
workDefinitionResponseDTOs.add(WorkDefinitionResponseDTO.builder().id(wdt1.getId().toString())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,6 @@ public ResponseEntity<WorkFlowResponseDTO> execute(@RequestBody @Valid WorkFlowR
if (workReport == null) {
return ResponseEntity.status(500).build();
}

return ResponseEntity.ok(WorkFlowResponseDTO.builder()
.workFlowExecutionId(WorkContextDelegate.read(workReport.getWorkContext(),
WorkContextDelegate.ProcessType.WORKFLOW_EXECUTION, WorkContextDelegate.Resource.ID).toString())
Expand Down Expand Up @@ -108,9 +107,9 @@ public void updateWorkFlowCheckerTaskStatus(@PathVariable String workFlowExecuti
schema = @Schema(implementation = WorkFlowStatusResponseDTO.class)) }),
@ApiResponse(responseCode = "401", description = "Unauthorized", content = @Content),
@ApiResponse(responseCode = "403", description = "Forbidden", content = @Content) })
@GetMapping("/{id}/status")
public ResponseEntity<WorkFlowStatusResponseDTO> getStatus(@PathVariable String id) {
return null;
@GetMapping("/{workFlowExecutionId}/status")
public ResponseEntity<WorkFlowStatusResponseDTO> getStatus(@PathVariable String workFlowExecutionId) {
return ResponseEntity.ok(workFlowService.getWorkFlowStatus(UUID.fromString(workFlowExecutionId)));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,8 @@ public class WorkFlowStatusResponseDTO {

private String workFlowName;

private String status;

@JsonInclude(JsonInclude.Include.NON_EMPTY)
private List<WorkStatusResponseDTO> works;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
*/
package com.redhat.parodos.workflow.execution.dto;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.redhat.parodos.workflow.enums.WorkStatus;
import com.redhat.parodos.workflow.enums.WorkType;
Expand All @@ -24,6 +25,7 @@
import lombok.NoArgsConstructor;

import java.util.List;
import java.util.UUID;

/**
* Workflow response dto
Expand All @@ -38,12 +40,18 @@
@NoArgsConstructor
public class WorkStatusResponseDTO {

@JsonIgnore
private UUID workDefinitionId;

private String name;

private WorkType type;

private WorkStatus status;

@JsonIgnore
private Integer numberOfWorks;

@JsonInclude(JsonInclude.Include.NON_NULL)
private List<WorkStatusResponseDTO> works;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,7 @@ WorkFlowExecution findFirstByWorkFlowDefinitionIdAndMasterWorkFlowExecution(UUID

List<WorkFlowExecution> findByMasterWorkFlowExecution(WorkFlowExecution masterWorkFlowExecution);

WorkFlowExecution findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(
WorkFlowExecution masterWorkFlowExecution, UUID workFlowDefinitionId);

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,11 +17,11 @@

import com.redhat.parodos.workflow.enums.WorkFlowStatus;
import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO;
import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO;
import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution;
import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution;
import com.redhat.parodos.workflow.task.enums.WorkFlowTaskStatus;
import com.redhat.parodos.workflows.work.WorkReport;

import java.util.UUID;

/**
Expand All @@ -41,6 +41,8 @@ WorkFlowExecution saveWorkFlow(UUID projectId, UUID workFlowDefinitionId, WorkFl

WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowExecution);

WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId);

WorkFlowTaskExecution getWorkFlowTask(UUID workFlowExecutionId, UUID workFlowTaskDefinitionId);

WorkFlowTaskExecution saveWorkFlowTask(String arguments, UUID workFlowTaskDefinitionId, UUID workFlowExecutionId,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,16 @@
import com.redhat.parodos.workflow.context.WorkContextDelegate;
import com.redhat.parodos.workflow.definition.entity.WorkFlowDefinition;
import com.redhat.parodos.workflow.definition.entity.WorkFlowTaskDefinition;
import com.redhat.parodos.workflow.definition.entity.WorkFlowWorkDefinition;
import com.redhat.parodos.workflow.definition.repository.WorkFlowDefinitionRepository;
import com.redhat.parodos.workflow.definition.repository.WorkFlowTaskDefinitionRepository;
import com.redhat.parodos.workflow.definition.repository.WorkFlowWorkRepository;
import com.redhat.parodos.workflow.enums.WorkFlowStatus;
import com.redhat.parodos.workflow.enums.WorkFlowType;
import com.redhat.parodos.workflow.enums.WorkType;
import com.redhat.parodos.workflow.execution.dto.WorkFlowRequestDTO;
import com.redhat.parodos.workflow.execution.dto.WorkFlowStatusResponseDTO;
import com.redhat.parodos.workflow.execution.dto.WorkStatusResponseDTO;
import com.redhat.parodos.workflow.execution.entity.WorkFlowExecution;
import com.redhat.parodos.workflow.execution.entity.WorkFlowTaskExecution;
import com.redhat.parodos.workflow.execution.repository.WorkFlowRepository;
Expand All @@ -41,10 +45,15 @@
import org.springframework.stereotype.Service;
import org.springframework.web.server.ResponseStatusException;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import java.util.concurrent.CopyOnWriteArrayList;

import static java.util.Objects.isNull;

Expand Down Expand Up @@ -130,6 +139,145 @@ public synchronized WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowE
return workFlowRepository.save(workFlowExecution);
}

@Override
public WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId) {
WorkFlowExecution masterWorkFlowExecution = workFlowRepository.findById(workFlowExecutionId).orElseThrow(() -> {
throw new ResponseStatusException(HttpStatus.NOT_FOUND,
String.format("workflow execution id: %s not found!", workFlowExecutionId));
});

WorkFlowDefinition masterWorkFlowDefinition = workFlowDefinitionRepository
.findById(masterWorkFlowExecution.getWorkFlowDefinitionId()).orElseThrow(() -> {
throw new ResponseStatusException(HttpStatus.NOT_FOUND,
String.format("workflow definition id: %s not found!", workFlowExecutionId));
});

CopyOnWriteArrayList<WorkStatusResponseDTO> workStatusResponseDTOs = new CopyOnWriteArrayList<>();
Map<String, Integer> workFlowWorksStartIndex = new HashMap<>();

workStatusResponseDTOs
.add(WorkStatusResponseDTO.builder().workDefinitionId(masterWorkFlowExecution.getWorkFlowDefinitionId())
.name(masterWorkFlowDefinition.getName()).type(WorkType.WORKFLOW)
.status(WorkFlowStatus.IN_PROGRESS.equals(masterWorkFlowExecution.getStatus())
? com.redhat.parodos.workflow.enums.WorkStatus.PENDING
: com.redhat.parodos.workflow.enums.WorkStatus
.valueOf(masterWorkFlowExecution.getStatus().name()))
.numberOfWorks(masterWorkFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build());
workFlowWorksStartIndex.put(masterWorkFlowDefinition.getName(), 1);

List<WorkFlowWorkDefinition> masterWorkFlowWorkDefinitions = workFlowWorkRepository
.findByWorkFlowDefinitionIdOrderByCreateDateAsc(masterWorkFlowDefinition.getId());
masterWorkFlowWorkDefinitions.forEach(workFlowWorkDefinition -> {
if (workFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.WORKFLOW)) {
WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository
.findById(workFlowWorkDefinition.getWorkDefinitionId()).get();
WorkFlowExecution workExecution = workFlowRepository
.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution,
workFlowWorkDefinition.getWorkDefinitionId());
/*
* the workflow execution might be null when there is pending checker
* before it
*/
com.redhat.parodos.workflow.enums.WorkStatus workStatus = workExecution == null
|| WorkFlowStatus.IN_PROGRESS.equals(workExecution.getStatus())
? com.redhat.parodos.workflow.enums.WorkStatus.PENDING
: com.redhat.parodos.workflow.enums.WorkStatus
.valueOf(workExecution.getStatus().name());
workStatusResponseDTOs.add(
WorkStatusResponseDTO.builder().workDefinitionId(workFlowWorkDefinition.getWorkDefinitionId())
.name(workFlowDefinition.getName()).type(WorkType.WORKFLOW).status(workStatus)
.numberOfWorks(workFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build());
}
else {
WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository
.findById(workFlowWorkDefinition.getWorkDefinitionId()).get();
List<WorkFlowTaskExecution> workFlowTaskExecutions = workFlowTaskRepository
.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(masterWorkFlowExecution.getId(),
workFlowWorkDefinition.getWorkDefinitionId());
Optional<WorkFlowTaskExecution> workFlowTaskExecutionOptional = workFlowTaskExecutions.stream()
.max(Comparator.comparing(WorkFlowTaskExecution::getStartDate));
com.redhat.parodos.workflow.enums.WorkStatus workStatus = com.redhat.parodos.workflow.enums.WorkStatus.PENDING;
if (workFlowTaskExecutionOptional.isPresent()) {
workStatus = WorkFlowTaskStatus.IN_PROGRESS.equals(workFlowTaskExecutionOptional.get().getStatus())
? com.redhat.parodos.workflow.enums.WorkStatus.PENDING
: com.redhat.parodos.workflow.enums.WorkStatus
.valueOf(workFlowTaskExecutionOptional.get().getStatus().name());
}
workStatusResponseDTOs.add(
WorkStatusResponseDTO.builder().workDefinitionId(workFlowWorkDefinition.getWorkDefinitionId())
.name(workFlowTaskDefinition.getName()).type(WorkType.TASK).status(workStatus).build());
}
});

for (int i = 1; i < workStatusResponseDTOs.size(); i++) {
if (workStatusResponseDTOs.get(i).getType().equals(WorkType.WORKFLOW)) {
List<WorkFlowWorkDefinition> tmpWorkFlowWorkDefinitions = workFlowWorkRepository
.findByWorkFlowDefinitionIdOrderByCreateDateAsc(
workStatusResponseDTOs.get(i).getWorkDefinitionId());
workFlowWorksStartIndex.put(workStatusResponseDTOs.get(i).getName(), workStatusResponseDTOs.size());

tmpWorkFlowWorkDefinitions.forEach(tmpWorkFlowWorkDefinition -> {
if (tmpWorkFlowWorkDefinition.getWorkDefinitionType().equals(WorkType.WORKFLOW)) {
WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository
.findById(tmpWorkFlowWorkDefinition.getWorkDefinitionId()).get();
WorkFlowExecution workExecution = workFlowRepository
.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution,
tmpWorkFlowWorkDefinition.getWorkDefinitionId());
workStatusResponseDTOs.add(WorkStatusResponseDTO.builder().name(workFlowDefinition.getName())
.workDefinitionId(tmpWorkFlowWorkDefinition.getWorkDefinitionId())
.type(WorkType.WORKFLOW)
.status(WorkFlowStatus.IN_PROGRESS.equals(workExecution.getStatus())
? com.redhat.parodos.workflow.enums.WorkStatus.PENDING
: com.redhat.parodos.workflow.enums.WorkStatus
.valueOf(workExecution.getStatus().name()))
.numberOfWorks(workFlowDefinition.getNumberOfWorks()).works(new ArrayList<>()).build());
}
else {
WorkFlowTaskDefinition workFlowTaskDefinition = workFlowTaskDefinitionRepository
.findById(tmpWorkFlowWorkDefinition.getWorkDefinitionId()).get();
WorkFlowExecution workFlowExecution = workFlowRepository
.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution,
tmpWorkFlowWorkDefinition.getWorkFlowDefinition().getId());
List<WorkFlowTaskExecution> workFlowTaskExecutions = workFlowExecution == null ? List.of()
: workFlowTaskRepository.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(
workFlowExecution.getId(), tmpWorkFlowWorkDefinition.getWorkDefinitionId());
Optional<WorkFlowTaskExecution> workFlowTaskExecutionOptional = workFlowTaskExecutions.stream()
.max(Comparator.comparing(WorkFlowTaskExecution::getStartDate));
com.redhat.parodos.workflow.enums.WorkStatus workStatus = com.redhat.parodos.workflow.enums.WorkStatus.PENDING;
if (workFlowTaskExecutionOptional.isPresent()) {
workStatus = WorkFlowTaskStatus.IN_PROGRESS
.equals(workFlowTaskExecutionOptional.get().getStatus())
? com.redhat.parodos.workflow.enums.WorkStatus.PENDING
: com.redhat.parodos.workflow.enums.WorkStatus
.valueOf(workFlowTaskExecutionOptional.get().getStatus().name());
}
workStatusResponseDTOs
.add(WorkStatusResponseDTO.builder().name(workFlowTaskDefinition.getName())
.workDefinitionId(tmpWorkFlowWorkDefinition.getWorkDefinitionId())
.type(WorkType.TASK).status(workStatus).build());
}
});
}
}

for (int j = workStatusResponseDTOs.size() - 1; j >= 0; j--) {
if (workStatusResponseDTOs.get(j).getType().equals(WorkType.WORKFLOW)) {
List<WorkStatusResponseDTO> tmpList = new ArrayList<>();
for (int k = workFlowWorksStartIndex
.get(workStatusResponseDTOs.get(j).getName()); k < workFlowWorksStartIndex
.get(workStatusResponseDTOs.get(j).getName())
+ workStatusResponseDTOs.get(j).getNumberOfWorks(); k++) {
tmpList.add(workStatusResponseDTOs.get(k));
}
workStatusResponseDTOs.get(j).setWorks(tmpList);
}
}

return WorkFlowStatusResponseDTO.builder().workFlowExecutionId(masterWorkFlowExecution.getId().toString())
.workFlowName(masterWorkFlowDefinition.getName()).status(masterWorkFlowExecution.getStatus().name())
.works(workStatusResponseDTOs.get(0).getWorks()).build();
}

@Override
public WorkFlowTaskExecution getWorkFlowTask(UUID workFlowExecutionId, UUID workFlowTaskDefinitionId) {
List<WorkFlowTaskExecution> workFlowTaskExecutionList = workFlowTaskRepository
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ void ExecuteAroundAdviceWithInProgressWorkFlowTest() {
};

WorkFlowWorkDefinition workFlowWorkDefinition = WorkFlowWorkDefinition.builder()
.workDefinitionId(UUID.randomUUID()).workDefinitionType(WorkType.WORKFLOW.name())
.workDefinitionId(UUID.randomUUID()).workDefinitionType(WorkType.WORKFLOW)
.workFlowDefinition(WorkFlowDefinition.builder().build()).build();
WorkFlowDefinition workFlowDefinition = getSampleWorkFlowDefinition(TEST);
WorkFlowExecution workFlowExecution = getSampleWorkFlowExecution();
Expand Down
Loading

0 comments on commit d49e516

Please sign in to comment.