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

add workflow status rest endpoint #138

Merged
merged 3 commits into from
Mar 22, 2023
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
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;
import lombok.NoArgsConstructor;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.*;
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please expand the asterisk

Copy link
Contributor Author

@anludke anludke Mar 22, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch! Fixed

import java.util.Date;
import java.util.UUID;

Expand All @@ -24,7 +22,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,140 @@ public synchronized WorkFlowExecution updateWorkFlow(WorkFlowExecution workFlowE
return workFlowRepository.save(workFlowExecution);
}

@Override
public WorkFlowStatusResponseDTO getWorkFlowStatus(UUID workFlowExecutionId) {
Copy link
Collaborator

Choose a reason for hiding this comment

The 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?

Copy link
Contributor Author

Choose a reason for hiding this comment

The 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)) {
Copy link
Collaborator

@eloycoto eloycoto Mar 22, 2023

Choose a reason for hiding this comment

The 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

Copy link
Contributor Author

Choose a reason for hiding this comment

The 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
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