-
Notifications
You must be signed in to change notification settings - Fork 27
add workflow status rest endpoint #138
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -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; | ||
|
@@ -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; | ||
|
||
|
@@ -130,6 +139,140 @@ public synchronized WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowE | |
return workFlowRepository.save(workFlowExecution); | ||
} | ||
|
||
@Override | ||
public WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This method seems to be long. Do you think it makes sense to split it? There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @pkliczewski I'll find a way split further. |
||
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)) { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could you move this to an external method somehow? All these WFdefinitions are getting hard to understand due to the multiple if conditions in there? Also, all this code is repeated after in the loop There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @eloycoto I believe it's the same comment as @pkliczewski. |
||
WorkFlowDefinition workFlowDefinition = workFlowDefinitionRepository | ||
.findById(workFlowWorkDefinition.getWorkDefinitionId()).get(); | ||
WorkFlowExecution workExecution = workFlowRepository | ||
.findFirstByMasterWorkFlowExecutionAndWorkFlowDefinitionId(masterWorkFlowExecution, | ||
workFlowWorkDefinition.getWorkDefinitionId()); | ||
com.redhat.parodos.workflow.enums.WorkStatus workStatus = 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 = null; | ||
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 = workFlowTaskRepository | ||
.findByWorkFlowExecutionIdAndWorkFlowTaskDefinitionId(workFlowExecution.getId(), | ||
tmpWorkFlowWorkDefinition.getWorkDefinitionId()); | ||
Optional<WorkFlowTaskExecution> workFlowTaskExecutionOptional = workFlowTaskExecutions.stream() | ||
.max(Comparator.comparing(WorkFlowTaskExecution::getStartDate)); | ||
com.redhat.parodos.workflow.enums.WorkStatus workStatus = null; | ||
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 | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
please expand the asterisk
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good catch! Fixed