diff --git a/postman/WDK_APIs.postman_collection.json b/postman/WDK_APIs.postman_collection.json index 64b8d08f..c7555bae 100644 --- a/postman/WDK_APIs.postman_collection.json +++ b/postman/WDK_APIs.postman_collection.json @@ -1,8 +1,9 @@ { "info": { - "_postman_id": "f477e7c1-aa1c-40d9-bef3-8b22e7239160", + "_postman_id": "3200ce68-c9c2-45d9-b53c-cdc6fdb4b572", "name": "Symphony WDK APIs", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "10221895" }, "item": [ { @@ -29,7 +30,7 @@ "formdata": [ { "key": "swadl", - "value": "id: my-workflow\nactivities:\n - send-message:\n id: init\n on:\n message-received:\n content: /hello\n content: Hi!", + "value": "id: my-workflow\nproperties:\n publish: false\nactivities:\n - send-message:\n id: init\n on:\n message-received:\n content: /hello\n content: \"Hi!\"", "type": "text" }, { @@ -37,22 +38,21 @@ "value": "Added new activity", "type": "text" }, - { - "key": "author", - "value": "123456", - "type": "text" - } + { + "key": "author", + "value": "123456", + "type": "text" + } ] }, "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows", + "raw": "{{wdk-uri}}/wdk/v1/workflows", "host": [ "{{wdk-uri}}" ], "path": [ "wdk", "v1", - "management", "workflows" ] } @@ -80,25 +80,24 @@ "formdata": [ { "key": "swadl", - "value": "id: my-workflow\nactivities:\n - send-message:\n id: init\n on:\n message-received:\n content: /hello\n content: Hi Again!", + "value": "id: my-workflow\nproperties:\n publish: true\nactivities:\n - send-message:\n id: init\n on:\n message-received:\n content: /hello\n content: \"Hi Again!\"\n", "type": "text" }, { "key": "description", - "value": "Edited init activity", + "value": "Edit init activity", "type": "text" } ] }, "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows", + "raw": "{{wdk-uri}}/wdk/v1/workflows", "host": [ "{{wdk-uri}}" ], "path": [ "wdk", "v1", - "management", "workflows" ] } @@ -122,55 +121,23 @@ } ], "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId", + "raw": "{{wdk-uri}}/wdk/v1/workflows/:workflowId", "host": [ "{{wdk-uri}}" ], "path": [ "wdk", "v1", - "management", "workflows", ":workflowId" ], - "variable": [ + "query": [ { - "key": "workflowId", - "value": "my-workflow", - "description": "workflow id defined in the swadl file" + "key": "version", + "value": "1675952881966104", + "description": "Optional, if provided, only the given version is deleted", + "disabled": true } - ] - } - }, - "response": [] - }, - { - "name": "Get SWADL by ID", - "request": { - "method": "GET", - "header": [ - { - "key": "X-Management-Token", - "value": "{{management-token}}", - "type": "text" - }, - { - "key": "Content-Type", - "value": "text/plain", - "type": "text" - } - ], - "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId", - "host": [ - "{{wdk-uri}}" - ], - "path": [ - "wdk", - "v1", - "management", - "workflows", - ":workflowId" ], "variable": [ { @@ -184,7 +151,7 @@ "response": [] }, { - "name": "Get SWADL by ID and Version", + "name": "Get SWADL by ID and version", "request": { "method": "GET", "header": [ @@ -200,73 +167,35 @@ } ], "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId/versions/:version", + "raw": "{{wdk-uri}}/wdk/v1/workflows/:workflowId", "host": [ "{{wdk-uri}}" ], "path": [ "wdk", "v1", - "management", "workflows", - ":workflowId", - "versions", - ":version" + ":workflowId" ], - "variable": [ + "query": [ { - "key": "workflowId", - "value": "my-workflow", - "description": "workflow id defined in the swadl file" + "key": "version", + "value": "1675952881966104", + "description": "Optional, if provided, this version is returned", + "disabled": true }, { - "key": "version", - "value": "1" + "key": "all_versions", + "value": "false", + "description": "Optional, if provided, all versions are returned", + "disabled": true } - ] - } - }, - "response": [] - }, - { - "name": "Delete SWADL by ID and Version", - "request": { - "method": "DELETE", - "header": [ - { - "key": "X-Management-Token", - "value": "{{management-token}}", - "type": "text" - }, - { - "key": "Content-Type", - "value": "text/plain", - "type": "text" - } - ], - "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId/versions/:version", - "host": [ - "{{wdk-uri}}" - ], - "path": [ - "wdk", - "v1", - "management", - "workflows", - ":workflowId", - "versions", - ":version" ], "variable": [ { "key": "workflowId", "value": "my-workflow", - "description": "workflow id defined in the swadl file" - }, - { - "key": "version", - "value": "1" + "description": "workflow id defined in the swadl file, by default, only the active version is returned" } ] } @@ -274,9 +203,9 @@ "response": [] }, { - "name": "Set an active workflow version", + "name": "Set an active workflow version or/and expiration date", "request": { - "method": "POST", + "method": "PUT", "header": [ { "key": "X-Management-Token", @@ -290,74 +219,33 @@ } ], "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId/versions/:version", + "raw": "{{wdk-uri}}/wdk/v1/workflows/:workflowId?expiration_date=\"2023-12-31T12:00:00.000000Z\"", "host": [ "{{wdk-uri}}" ], "path": [ "wdk", "v1", - "management", "workflows", - ":workflowId", - "versions", - ":version" + ":workflowId" ], - "variable": [ + "query": [ { - "key": "workflowId", - "value": "my-workflow" + "key": "version", + "value": "1675952881966104", + "description": "target deploy version", + "disabled": true }, { - "key": "version", - "value": "1" - } - ] - } - }, - "response": [] - }, - { - "name": "Schedule workflow expiration", - "request": { - "method": "POST", - "header": [ - { - "key": "X-Management-Token", - "value": "{{management-token}}", - "type": "default" - }, - { - "key": "Content-Type", - "value": "application/json", - "type": "default" - } - ], - "body": { - "mode": "raw", - "raw": "\"2023-12-31T12:00:00.000000Z\"", - "options": { - "raw": { - "language": "json" + "key": "expiration_date", + "value": "\"2023-12-31T12:00:00.000000Z\"", + "description": "set expiration date on the workflow" } - } - }, - "url": { - "raw": "{{wdk-uri}}/wdk/v1/management/workflows/:workflowId", - "host": [ - "{{wdk-uri}}" - ], - "path": [ - "wdk", - "v1", - "management", - "workflows", - ":workflowId" ], "variable": [ { "key": "workflowId", - "value": "my-workflow" + "value": null } ] } @@ -404,12 +292,12 @@ "description": "pending,completed", "disabled": true }, - { - "key": "version", - "value": null, - "description": "workflow version", - "disabled": true - } + { + "key": "version", + "value": "", + "description": "workflow version", + "disabled": true + } ], "variable": [ { @@ -531,7 +419,7 @@ "response": [] }, { - "name": "List activities definitions for a workflow given by its Id", + "name": "List activities graph nodes for a workflow given by its Id", "request": { "method": "GET", "header": [ @@ -547,7 +435,7 @@ } ], "url": { - "raw": "{{wdk-uri}}/wdk/v1/workflows/:workflowId/definitions", + "raw": "{{wdk-uri}}/wdk/v1/workflows/:workflowId/nodes", "host": [ "{{wdk-uri}}" ], @@ -556,13 +444,13 @@ "v1", "workflows", ":workflowId", - "definitions" + "nodes" ], "query": [ { "key": "version", - "value": null, - "description": "workflow version", + "value": "1675952881966104", + "description": "workflow version", "disabled": true } ], @@ -675,4 +563,4 @@ "response": [] } ] -} +} \ No newline at end of file diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsApi.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsApi.java index f2480e99..bbd936b0 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsApi.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsApi.java @@ -2,9 +2,9 @@ import com.symphony.bdk.workflow.api.v1.dto.ErrorResponse; import com.symphony.bdk.workflow.api.v1.dto.VariableView; -import com.symphony.bdk.workflow.api.v1.dto.WorkflowDefinitionView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowExecutionRequest; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstView; +import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesStateView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowView; @@ -47,7 +47,7 @@ ResponseEntity executeWorkflowById( @ApiResponses( value = {@ApiResponse(code = 200, message = "OK", response = WorkflowView.class, responseContainer = "List"), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) - @GetMapping("/") + @GetMapping ResponseEntity> listAllWorkflows( @ApiParam("Workflows monitoring token to authenticate the request") @RequestHeader(name = X_MONITORING_TOKEN_KEY) String token); @@ -67,10 +67,10 @@ ResponseEntity> listWorkflowInstances( @RequestParam(required = false) Long version); @ApiOperation("List the completed activities in a given instance for a given workflow") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = WorkflowNodesView.class), + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = WorkflowNodesStateView.class), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) @GetMapping("/{workflowId}/instances/{instanceId}/states") - ResponseEntity getInstanceState( + ResponseEntity getInstanceState( @ApiParam(value = "Workflow's id to list instance activities", required = true) @PathVariable String workflowId, @ApiParam(value = "Workflow's instance id to list activities", required = true) @PathVariable String instanceId, @ApiParam("Workflows monitoring token to authenticate the request") @@ -97,11 +97,11 @@ ResponseEntity getInstanceState( @RequestParam(required = false, name = "finished_after") Instant finishedAfter ); - @ApiOperation("Get activities definitions for a given workflow") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = WorkflowDefinitionView.class), + @ApiOperation("Get activities graph nodes for a given workflow") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = WorkflowNodesView.class), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) - @GetMapping("/{workflowId}/definitions") - ResponseEntity getWorkflowDefinition( + @GetMapping("/{workflowId}/nodes") + ResponseEntity getWorkflowGraphNodes( @ApiParam(value = "Workflow's id to get activities definitions", required = true) @PathVariable String workflowId, @ApiParam("Workflows monitoring token to authenticate the request") @RequestHeader(name = X_MONITORING_TOKEN_KEY) String token, diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsMgtApi.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsMgtApi.java index 47f29479..ac1e79a4 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsMgtApi.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/WorkflowsMgtApi.java @@ -18,8 +18,8 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; -import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyEmitter; import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; @@ -56,65 +56,53 @@ ResponseEntity updateSwadl( @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, @ApiParam(value = "Workflow SWADL form to update") @ModelAttribute SwadlView swadlView); - @ApiOperation("Get all versioned workflows by the given ID.") + @ApiOperation( + "Get the active version of the workflow by the given ID, which is default behavior; if the version parameter" + + "is given, that version will be returned; if all_versions flag is true, all versions will be returned; if" + + "version is provided and versions flag is true, all versions will be returned.") @ApiResponses(value = {@ApiResponse(code = 204, message = ""), @ApiResponse(code = 404, message = "No workflow found with id {id}", response = ErrorResponse.class), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) @ResponseStatus(HttpStatus.NO_CONTENT) - @GetMapping("/{id}") - ResponseEntity> getSwadl( + @GetMapping(path = "/{workflowId}", produces = MediaType.APPLICATION_JSON_VALUE) + ResponseEntity> getVersionedWorkflow( @ApiParam(value = "Workflow's token to authenticate the request", required = true) @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, - @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String id); + @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String workflowId, + @ApiParam(value = "Get a specific version value") @RequestParam(required = false, name = "version") + Long version, + @ApiParam(value = "Get all versions flag", defaultValue = "false") + @RequestParam(required = false, name = "all_versions", defaultValue = "false") Boolean allVersions); - @ApiOperation("Delete the workflow by the given ID.") + @ApiOperation( + "Delete the workflow by the given ID, all versions will be deleted, unless the version parameter is specified.") @ApiResponses(value = {@ApiResponse(code = 204, message = ""), @ApiResponse(code = 404, message = "No workflow found with id {id}", response = ErrorResponse.class), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping("/{id}") - ResponseEntity deleteSwadl( + @DeleteMapping(path = "/{workflowId}") + ResponseEntity deleteWorkflowByIdAndVersion( @ApiParam(value = "Workflow's token to authenticate the request", required = true) @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, - @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String id); + @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String workflowId, + @ApiParam(value = "Workflow's version to delete") @RequestParam(required = false, name = "version") + Long version); - @ApiOperation("Roll back a workflow version.") + @ApiOperation("Fall back to a specific workflow version, or set an expiration time for the workflow.") @ApiResponses(value = {@ApiResponse(code = 204, message = ""), @ApiResponse(code = 404, message = "No workflow found with id {id} and version {version}", response = ErrorResponse.class), @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) @ResponseStatus(HttpStatus.NO_CONTENT) - @PostMapping(value = "/{id}/versions/{version}") - ResponseEntity deployActiveVersion( + @PutMapping(path = "/{workflowId}") + ResponseEntity setVersionAndExpirationTime( @ApiParam(value = "Workflow's token to authenticate the request", required = true) @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, - @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String id, - @ApiParam(value = "Workflow's version to roll back to", required = true) @PathVariable Long version); - - @ApiOperation("Get a specific version workflow.") - @ApiResponses(value = {@ApiResponse(code = 204, message = ""), - @ApiResponse(code = 404, message = "No workflow found with id {id} and version {version}", - response = ErrorResponse.class), - @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) - @ResponseStatus(HttpStatus.NO_CONTENT) - @GetMapping(value = "/{id}/versions/{version}") - ResponseEntity getSwadlByVersion( - @ApiParam(value = "Workflow's token to authenticate the request", required = true) - @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, - @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String id, - @ApiParam(value = "Workflow's version to roll back to", required = true) @PathVariable Long version); - - @ApiOperation("Delete the workflow by the given ID and version.") - @ApiResponses(value = {@ApiResponse(code = 204, message = ""), - @ApiResponse(code = 404, message = "No workflow found with id {id}", response = ErrorResponse.class), - @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) - @ResponseStatus(HttpStatus.NO_CONTENT) - @DeleteMapping("/{id}/versions/{version}") - ResponseEntity deleteSwadlByVersion( - @ApiParam(value = "Workflow's token to authenticate the request", required = true) - @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token, - @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String id, - @ApiParam(value = "Workflow version") @PathVariable Long version); + @ApiParam(value = "Workflow's id that is provided in SWADL", required = true) @PathVariable String workflowId, + @ApiParam(value = "Workflow's version to roll back to") @RequestParam(required = false, name = "version") + Long version, + @ApiParam(value = "Expiration date. Instant epoch.") @RequestParam(required = false, name = "expiration_date") + Instant expirationDate); @ApiOperation("Streaming logs in SSE.") @ApiResponses(value = {@ApiResponse(code = 200, message = "", response = ResponseBodyEmitter.class), @@ -125,12 +113,4 @@ SseEmitter streamingLogs( @ApiParam(value = "Workflow's token to authenticate the request", required = true) @RequestHeader(name = X_MANAGEMENT_TOKEN_KEY) String token); - @ApiOperation("Schedule a workflow expiration.") - @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"), - @ApiResponse(code = 404, message = "No workflow found with id {workflowId}"), - @ApiResponse(code = 401, message = "Request is not authorised", response = ErrorResponse.class)}) - @PostMapping(value = "/{workflowId}") - ResponseEntity scheduleWorkflowExpirationJob( - @ApiParam(value = "Workflow's id to expire.", required = true) @PathVariable String workflowId, - @ApiParam(value = "Expiration date. Instant epoch.") @RequestBody Instant expirationDate); } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiController.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiController.java index 41450f86..b96eb8a4 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiController.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiController.java @@ -2,10 +2,10 @@ import com.symphony.bdk.workflow.api.v1.WorkflowsApi; import com.symphony.bdk.workflow.api.v1.dto.VariableView; -import com.symphony.bdk.workflow.api.v1.dto.WorkflowDefinitionView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowExecutionRequest; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstLifeCycleFilter; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstView; +import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesStateView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowView; import com.symphony.bdk.workflow.engine.ExecutionParameters; @@ -54,7 +54,7 @@ public ResponseEntity> listWorkflowInstances(String workf @Override @Authorized(headerTokenKey = X_MONITORING_TOKEN_KEY) - public ResponseEntity getInstanceState(String workflowId, String instanceId, + public ResponseEntity getInstanceState(String workflowId, String instanceId, String token, Instant startedBefore, Instant startedAfter, Instant finishedBefore, Instant finishedAfter) { WorkflowInstLifeCycleFilter lifeCycleFilter = new WorkflowInstLifeCycleFilter(startedBefore, startedAfter, finishedBefore, finishedAfter); @@ -64,7 +64,7 @@ public ResponseEntity getInstanceState(String workflowId, Str @Override @Authorized(headerTokenKey = X_MONITORING_TOKEN_KEY) - public ResponseEntity getWorkflowDefinition(String workflowId, String token, Long version) { + public ResponseEntity getWorkflowGraphNodes(String workflowId, String token, Long version) { return ResponseEntity.ok(monitoringService.getWorkflowDefinition(workflowId, version)); } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiController.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiController.java index da7bb3e3..9b870b8a 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiController.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiController.java @@ -5,7 +5,6 @@ import com.symphony.bdk.workflow.api.v1.dto.SwadlView; import com.symphony.bdk.workflow.api.v1.dto.VersionedWorkflowView; import com.symphony.bdk.workflow.configuration.ConditionalOnPropertyNotEmpty; -import com.symphony.bdk.workflow.exception.NotFoundException; import com.symphony.bdk.workflow.expiration.WorkflowExpirationService; import com.symphony.bdk.workflow.logs.LogsStreamingService; import com.symphony.bdk.workflow.management.WorkflowManagementService; @@ -19,13 +18,14 @@ import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import javax.servlet.http.HttpServletRequest; @RestController @ConditionalOnPropertyNotEmpty("wdk.properties.management-token") -@RequestMapping("/v1/management/workflows") +@RequestMapping("/v1/workflows") @RequiredArgsConstructor @Slf4j public class WorkflowsMgtApiController implements WorkflowsMgtApi { @@ -53,35 +53,39 @@ public ResponseEntity updateSwadl(String token, SwadlView swadlView) { } @Override - public ResponseEntity> getSwadl(String token, String id) { - return ResponseEntity.ok(workflowManagementService.get(id)); + public ResponseEntity> getVersionedWorkflow(String token, String workflowId, Long version, + Boolean allVersions) { + List result = new ArrayList<>(); + if (version == null && !allVersions) { + workflowManagementService.get(workflowId).ifPresent(result::add); + } else if (allVersions) { + result.addAll(workflowManagementService.getAllVersions(workflowId)); + } else { + workflowManagementService.get(workflowId, version).ifPresent(result::add); + } + return ResponseEntity.ok(result); } @Override @Authorized(headerTokenKey = X_MANAGEMENT_TOKEN_KEY) - public ResponseEntity deleteSwadl(String token, String id) { - workflowManagementService.delete(id); + public ResponseEntity deleteWorkflowByIdAndVersion(String token, String workflowId, Long version) { + Optional.ofNullable(version) + .ifPresentOrElse(v -> workflowManagementService.delete(workflowId, version), + () -> workflowManagementService.delete(workflowId)); return ResponseEntity.noContent().build(); } @Override @Authorized(headerTokenKey = X_MANAGEMENT_TOKEN_KEY) - public ResponseEntity deployActiveVersion(String token, String id, Long version) { - workflowManagementService.setActiveVersion(id, version); - return ResponseEntity.noContent().build(); - } - - @Override - public ResponseEntity getSwadlByVersion(String token, String id, Long version) { - Optional workflowView = workflowManagementService.get(id, version); - return workflowView.map(ResponseEntity::ok) - .orElseThrow( - () -> new NotFoundException(String.format("Version %s of workflow %s is not found.", version, id))); - } + public ResponseEntity setVersionAndExpirationTime(String token, String workflowId, Long version, + Instant expirationDate) { + if (version != null) { + workflowManagementService.setActiveVersion(workflowId, version); + } - @Override - public ResponseEntity deleteSwadlByVersion(String token, String id, Long version) { - workflowManagementService.delete(id, version); + if (expirationDate != null) { + workflowExpirationService.scheduleWorkflowExpiration(workflowId, expirationDate); + } return ResponseEntity.noContent().build(); } @@ -92,11 +96,4 @@ public SseEmitter streamingLogs(String token) { logsStreamingService.subscribe(emitter); return emitter; } - - @Override - @Authorized(headerTokenKey = X_MANAGEMENT_TOKEN_KEY) - public ResponseEntity scheduleWorkflowExpirationJob(String workflowId, Instant expirationDate) { - workflowExpirationService.scheduleWorkflowExpiration(workflowId, expirationDate); - return ResponseEntity.ok().build(); - } } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeDefinitionView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeDefinitionView.java deleted file mode 100644 index 6a9645f1..00000000 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeDefinitionView.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.symphony.bdk.workflow.api.v1.dto; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.util.List; - -@Data -@Builder(toBuilder = true) -@AllArgsConstructor -@NoArgsConstructor -public class NodeDefinitionView { - private String nodeId; - private String type; - private String group; - private List parents; - private List children; - - @AllArgsConstructor(staticName = "of") - @NoArgsConstructor - @Data - @JsonInclude(JsonInclude.Include.NON_NULL) - public static class ChildView { - private String nodeId; - private String condition; - - public ChildView(String nodeId) { - this.nodeId = nodeId; - } - - public static ChildView of(String nodeId) { - return new ChildView(nodeId); - } - } -} diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeStateView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeStateView.java new file mode 100644 index 00000000..c3f861f8 --- /dev/null +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeStateView.java @@ -0,0 +1,24 @@ +package com.symphony.bdk.workflow.api.v1.dto; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; +import lombok.Data; + +import java.time.Duration; +import java.time.Instant; +import java.util.Map; + +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +public class NodeStateView { + private String workflowId; + private String instanceId; + private String nodeId; + private String type; + private String group; + private Instant startDate; + private Instant endDate; + private Duration duration; + private Map outputs; +} diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeView.java index e67b8e7f..058ff739 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeView.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/NodeView.java @@ -1,24 +1,38 @@ package com.symphony.bdk.workflow.api.v1.dto; import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.NoArgsConstructor; -import java.time.Duration; -import java.time.Instant; -import java.util.Map; +import java.util.List; @Data -@Builder -@JsonInclude(JsonInclude.Include.NON_NULL) +@Builder(toBuilder = true) +@AllArgsConstructor +@NoArgsConstructor public class NodeView { - private String workflowId; - private String instanceId; private String nodeId; private String type; private String group; - private Instant startDate; - private Instant endDate; - private Duration duration; - private Map outputs; + private List parents; + private List children; + + @AllArgsConstructor(staticName = "of") + @NoArgsConstructor + @Data + @JsonInclude(JsonInclude.Include.NON_NULL) + public static class ChildView { + private String nodeId; + private String condition; + + public ChildView(String nodeId) { + this.nodeId = nodeId; + } + + public static ChildView of(String nodeId) { + return new ChildView(nodeId); + } + } } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/VersionedWorkflowView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/VersionedWorkflowView.java index 0028ed3e..7d19c9e8 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/VersionedWorkflowView.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/VersionedWorkflowView.java @@ -30,7 +30,9 @@ public class VersionedWorkflowView { @JsonProperty(access = JsonProperty.Access.READ_ONLY) private Long createdBy; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private String swadl; + @JsonProperty(access = JsonProperty.Access.READ_ONLY) private String description; } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowDefinitionView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesStateView.java similarity index 50% rename from workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowDefinitionView.java rename to workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesStateView.java index a775274f..d136bc52 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowDefinitionView.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesStateView.java @@ -1,18 +1,15 @@ package com.symphony.bdk.workflow.api.v1.dto; import com.fasterxml.jackson.annotation.JsonInclude; -import lombok.Builder; import lombok.Data; import java.util.List; import java.util.Map; @Data -@Builder @JsonInclude(JsonInclude.Include.NON_NULL) -public class WorkflowDefinitionView { - private String workflowId; - private Long version; - private Map variables; - private List flowNodes; +public class WorkflowNodesStateView { + private List nodes; + private VariableView globalVariables; + private Map error; } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesView.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesView.java index 4c60be23..66a5cfd9 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesView.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/api/v1/dto/WorkflowNodesView.java @@ -1,15 +1,18 @@ package com.symphony.bdk.workflow.api.v1.dto; import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.Builder; import lombok.Data; import java.util.List; import java.util.Map; @Data +@Builder @JsonInclude(JsonInclude.Include.NON_NULL) public class WorkflowNodesView { - private List nodes; - private VariableView globalVariables; - private Map error; + private String workflowId; + private Long version; + private Map variables; + private List flowNodes; } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/management/WorkflowManagementService.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/management/WorkflowManagementService.java index 5dde6a95..d6abd840 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/management/WorkflowManagementService.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/management/WorkflowManagementService.java @@ -96,9 +96,9 @@ private void setCurrentActiveVersionToInactive(String workflow) { }); } - public List get(String id) { - List workflows = versionRepository.findByWorkflowId(id); - return objectConverter.convertCollection(workflows, VersionedWorkflowView.class); + public Optional get(String id) { + Optional activeVersion = versionRepository.findByWorkflowIdAndActiveTrue(id); + return activeVersion.map(w -> objectConverter.convert(w, VersionedWorkflowView.class)); } public Optional get(String id, Long version) { @@ -106,6 +106,11 @@ public Optional get(String id, Long version) { return versionedWorkflow.map(w -> objectConverter.convert(w, VersionedWorkflowView.class)); } + public List getAllVersions(String id) { + List workflows = versionRepository.findByWorkflowId(id); + return objectConverter.convertCollection(workflows, VersionedWorkflowView.class); + } + public void delete(String id) { this.delete(id, null); } diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/MonitoringService.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/MonitoringService.java index 800b1319..17e25f66 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/MonitoringService.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/MonitoringService.java @@ -2,13 +2,13 @@ import static com.symphony.bdk.workflow.engine.WorkflowDirectedGraph.NodeChildren; -import com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView; +import com.symphony.bdk.workflow.api.v1.dto.NodeStateView; import com.symphony.bdk.workflow.api.v1.dto.NodeView; import com.symphony.bdk.workflow.api.v1.dto.StatusEnum; import com.symphony.bdk.workflow.api.v1.dto.VariableView; -import com.symphony.bdk.workflow.api.v1.dto.WorkflowDefinitionView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstLifeCycleFilter; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstView; +import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesStateView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowView; import com.symphony.bdk.workflow.converter.ObjectConverter; @@ -81,7 +81,7 @@ public List listWorkflowInstances(String workflowId, String st return objectConverter.convertCollection(allById, WorkflowInstView.class); } - public WorkflowNodesView listWorkflowInstanceNodes(String workflowId, String instanceId, + public WorkflowNodesStateView listWorkflowInstanceNodes(String workflowId, String instanceId, WorkflowInstLifeCycleFilter lifeCycleFilter) { // check if the instance belongs to the provided workflow WorkflowInstView instance = this.checkIsInstanceOfWorkflow(workflowId, instanceId); @@ -90,18 +90,18 @@ public WorkflowNodesView listWorkflowInstanceNodes(String workflowId, String ins activityQueryRepository.findAllByWorkflowInstanceId(workflowId, instanceId, lifeCycleFilter); WorkflowDirectedGraph directGraph = getWorkflowDirectedGraph(workflowId, instance.getVersion()); - List nodes = getNodeViews(activityInstances, directGraph); + List nodes = getNodeViews(activityInstances, directGraph); VariablesDomain globalVariables = this.variableQueryRepository.findVarsByWorkflowInstanceIdAndVarName(instanceId, ActivityExecutorContext.VARIABLES); VariablesDomain error = this.variableQueryRepository.findVarsByWorkflowInstanceIdAndVarName(instanceId, ActivityExecutorContext.ERROR); - return buildWorkflowNodesView(nodes, globalVariables, error); + return buildWorkflowNodesStateView(nodes, globalVariables, error); } - private static WorkflowNodesView buildWorkflowNodesView(List nodes, VariablesDomain globalVariables, - VariablesDomain error) { - WorkflowNodesView result = new WorkflowNodesView(); + private static WorkflowNodesStateView buildWorkflowNodesStateView(List nodes, + VariablesDomain globalVariables, VariablesDomain error) { + WorkflowNodesStateView result = new WorkflowNodesStateView(); result.setNodes(nodes.stream().filter(a -> a.getType() != null).collect(Collectors.toList())); result.setGlobalVariables(new VariableView(globalVariables)); if (!error.getOutputs().isEmpty()) { @@ -110,9 +110,9 @@ private static WorkflowNodesView buildWorkflowNodesView(List nodes, Va return result; } - private List getNodeViews(List activityInstances, + private List getNodeViews(List activityInstances, WorkflowDirectedGraph directGraph) { - List nodes = objectConverter.convertCollection(activityInstances, NodeView.class); + List nodes = objectConverter.convertCollection(activityInstances, NodeStateView.class); nodes.stream() .filter(node -> directGraph.isRegistered(node.getNodeId())) .forEach(node -> { @@ -124,22 +124,22 @@ private List getNodeViews(List activityInstanc return nodes; } - public WorkflowDefinitionView getWorkflowDefinition(String workflowId) { + public WorkflowNodesView getWorkflowDefinition(String workflowId) { return this.getWorkflowDefinition(workflowId, null); } - public WorkflowDefinitionView getWorkflowDefinition(String workflowId, Long version) { + public WorkflowNodesView getWorkflowDefinition(String workflowId, Long version) { WorkflowDirectedGraph directedGraph = getWorkflowDirectedGraph(workflowId, version); Map dictionary = directedGraph.getDictionary(); - List activities = dictionary.keySet().stream().map(node -> { + List activities = dictionary.keySet().stream().map(node -> { WorkflowNode workflowNode = dictionary.get(node); NodeChildren children = directedGraph.getChildren(node); List parents = directedGraph.getParents(node); return buildNode(dictionary, node, workflowNode, children, parents); }).collect(Collectors.toList()); - return WorkflowDefinitionView.builder() + return WorkflowNodesView.builder() .workflowId(workflowId) .flowNodes(activities) .version(directedGraph.getVersion()) @@ -158,14 +158,14 @@ private WorkflowDirectedGraph getWorkflowDirectedGraph(String workflowId, Long v return directGraph; } - private static NodeDefinitionView buildNode(Map dictionary, String key, + private static NodeView buildNode(Map dictionary, String key, WorkflowNode workflowNode, NodeChildren children, List parents) { - NodeDefinitionView.NodeDefinitionViewBuilder nodeBuilder = NodeDefinitionView.builder() + NodeView.NodeViewBuilder nodeBuilder = NodeView.builder() .nodeId(key) .parents(parents) .children(children.getChildren() .stream() - .map(c -> NodeDefinitionView.ChildView.of(c, determineCondition(dictionary.get(c), key))) + .map(c -> NodeView.ChildView.of(c, determineCondition(dictionary.get(c), key))) .collect(Collectors.toList())); String name = WorkflowNodeTypeHelper.toUpperUnderscore(workflowNode.getWrappedType().getSimpleName()); diff --git a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverter.java b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverter.java index 6301bdfc..b5c89bf2 100644 --- a/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverter.java +++ b/workflow-bot-app/src/main/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverter.java @@ -1,17 +1,17 @@ package com.symphony.bdk.workflow.monitoring.service.converter; -import com.symphony.bdk.workflow.api.v1.dto.NodeView; +import com.symphony.bdk.workflow.api.v1.dto.NodeStateView; import com.symphony.bdk.workflow.converter.Converter; import com.symphony.bdk.workflow.monitoring.repository.domain.ActivityInstanceDomain; import org.springframework.stereotype.Component; @Component -public class ActivityInstViewConverter implements Converter { +public class ActivityInstViewConverter implements Converter { @Override - public NodeView apply(ActivityInstanceDomain domain) { - return NodeView.builder() + public NodeStateView apply(ActivityInstanceDomain domain) { + return NodeStateView.builder() .nodeId(domain.getName()) .instanceId(domain.getProcInstId()) .workflowId(domain.getWorkflowId()) diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/CustomActivityIntegrationTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/CustomActivityIntegrationTest.java index 0de0a662..051b064e 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/CustomActivityIntegrationTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/CustomActivityIntegrationTest.java @@ -31,7 +31,7 @@ void customActivity() throws Exception { .header("X-Monitoring-Token", "MONITORING_TOKEN_VALUE") .contentType(ContentType.JSON) .when() - .get(String.format("/wdk/v1/workflows/%s/definitions", "custom-activity")) + .get(String.format("/wdk/v1/workflows/%s/nodes", "custom-activity")) .thenReturn(); // actual flow nodes diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/MonitoringApiIntegrationTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/MonitoringApiIntegrationTest.java index 8fc55ac6..4efdb5b5 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/MonitoringApiIntegrationTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/MonitoringApiIntegrationTest.java @@ -1,7 +1,7 @@ package com.symphony.bdk.workflow; -import static com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView.ChildView; -import static com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView.builder; +import static com.symphony.bdk.workflow.api.v1.dto.NodeView.ChildView; +import static com.symphony.bdk.workflow.api.v1.dto.NodeView.builder; import static io.restassured.RestAssured.given; import static org.assertj.core.api.Assertions.assertThat; import static org.hamcrest.Matchers.empty; @@ -18,7 +18,7 @@ import com.symphony.bdk.core.service.message.model.Message; import com.symphony.bdk.gen.api.model.V4Message; -import com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView; +import com.symphony.bdk.workflow.api.v1.dto.NodeView; import com.symphony.bdk.workflow.engine.WorkflowNodeTypeHelper; import com.symphony.bdk.workflow.swadl.SwadlParser; import com.symphony.bdk.workflow.swadl.v1.Workflow; @@ -51,7 +51,7 @@ class MonitoringApiIntegrationTest extends IntegrationTest { private static final String LIST_WORKFLOW_INSTANCES_PATH = "wdk/v1/workflows/%s/instances"; private static final String LIST_WORKFLOW_INSTANCE_ACTIVITIES_PATH = "wdk/v1/workflows/%s/instances/%s/states"; - private static final String LIST_WORKFLOW_DEFINITIONS_PATH = "/wdk/v1/workflows/%s/definitions"; + private static final String LIST_WORKFLOW_NODES_PATH = "/wdk/v1/workflows/%s/nodes"; private static final String LIST_WORKFLOW_GLOBAL_VARIABLES = "/wdk/v1/workflows/%s/instances/%s/variables"; private static final String X_MONITORING_TOKEN_HEADER_KEY = "X-Monitoring-Token"; private static final String X_MONITORING_TOKEN_HEADER_VALUE = "MONITORING_TOKEN_VALUE"; @@ -65,7 +65,8 @@ class MonitoringApiIntegrationTest extends IntegrationTest { @ParameterizedTest @CsvSource(value = {LIST_WORKFLOWS_PATH, LIST_WORKFLOW_INSTANCES_PATH, LIST_WORKFLOW_INSTANCE_ACTIVITIES_PATH, - LIST_WORKFLOW_DEFINITIONS_PATH}) + LIST_WORKFLOW_NODES_PATH + }) void badToken(String path) { given() .header(X_MONITORING_TOKEN_HEADER_KEY, "BAD_TOKEN") @@ -80,7 +81,8 @@ void badToken(String path) { @ParameterizedTest @CsvSource(value = {LIST_WORKFLOWS_PATH, LIST_WORKFLOW_INSTANCES_PATH, LIST_WORKFLOW_INSTANCE_ACTIVITIES_PATH, - LIST_WORKFLOW_DEFINITIONS_PATH}) + LIST_WORKFLOW_NODES_PATH + }) void missingTokenHeader(String path) { given() .contentType(ContentType.JSON) @@ -1003,18 +1005,18 @@ void listWorkflowStatesDefinitions() throws Exception { .header(X_MONITORING_TOKEN_HEADER_KEY, X_MONITORING_TOKEN_HEADER_VALUE) .contentType(ContentType.JSON) .when() - .get(String.format(LIST_WORKFLOW_DEFINITIONS_PATH, "testingWorkflow1")) + .get(String.format(LIST_WORKFLOW_NODES_PATH, "testingWorkflow1")) .thenReturn(); // actual flow nodes ObjectMapper objectMapper = new ObjectMapper(); - List nodeDefinitionViews = new ArrayList<>(); + List nodeViews = new ArrayList<>(); List flowNodes = response.body().jsonPath().getList("flowNodes"); flowNodes.forEach(flowNode -> { try { - nodeDefinitionViews.add( - objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeDefinitionView.class)); + nodeViews.add( + objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeView.class)); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Unexpected error when converting api response to TaskDefinitionView class"); @@ -1022,7 +1024,7 @@ void listWorkflowStatesDefinitions() throws Exception { }); // expected flow nodes - NodeDefinitionView expectedSendMessageActivity1 = builder() + NodeView expectedSendMessageActivity1 = builder() .nodeId("testingWorkflow1SendMsg1") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1030,7 +1032,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(Collections.singletonList(ChildView.of("sendForm"))) .build(); - NodeDefinitionView expectedSendMessageActivity2 = builder() + NodeView expectedSendMessageActivity2 = builder() .nodeId("sendForm") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1038,7 +1040,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(List.of(ChildView.of("form-reply_sendForm"), ChildView.of("form-reply_sendForm_timeout", "expired"))) .build(); - NodeDefinitionView expectedMessageReceivedEventTask = builder() + NodeView expectedMessageReceivedEventTask = builder() .nodeId("message-received_/testingWorkflow1") .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) @@ -1046,7 +1048,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(Collections.singletonList(ChildView.of("testingWorkflow1SendMsg1"))) .build(); - NodeDefinitionView expectedFormRepliedEventTask = NodeDefinitionView.builder() + NodeView expectedFormRepliedEventTask = NodeView.builder() .nodeId("form-reply_sendForm") .type(WorkflowNodeTypeHelper.toType("FORM_REPLIED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("FORM_REPLIED_EVENT")) @@ -1054,7 +1056,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(Collections.singletonList(ChildView.of("receiveForm"))) .build(); - NodeDefinitionView expectedFormRepliedTimeoutEventTask = NodeDefinitionView.builder() + NodeView expectedFormRepliedTimeoutEventTask = NodeView.builder() .nodeId("form-reply_sendForm_timeout") .type(WorkflowNodeTypeHelper.toType("ACTIVITY_EXPIRED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("ACTIVITY_EXPIRED_EVENT")) @@ -1062,7 +1064,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(Collections.emptyList()) .build(); - NodeDefinitionView expectedReceiveFormTask = NodeDefinitionView.builder() + NodeView expectedReceiveFormTask = NodeView.builder() .nodeId("receiveForm") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1070,7 +1072,7 @@ void listWorkflowStatesDefinitions() throws Exception { .children(Collections.emptyList()) .build(); - List expectedTaskDefinitions = + List expectedTaskDefinitions = Arrays.asList(expectedSendMessageActivity1, expectedSendMessageActivity2, expectedMessageReceivedEventTask, expectedFormRepliedEventTask, expectedFormRepliedTimeoutEventTask, expectedReceiveFormTask); @@ -1079,7 +1081,7 @@ void listWorkflowStatesDefinitions() throws Exception { assertThat(response.body().jsonPath().getString("workflowId")).isEqualTo("testingWorkflow1"); assertThat(response.body().jsonPath().getMap("variables")).isEmpty(); - assertThat(nodeDefinitionViews) + assertThat(nodeViews) .hasSameSizeAs(expectedTaskDefinitions) .hasSameElementsAs(expectedTaskDefinitions); @@ -1101,18 +1103,18 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { .header(X_MONITORING_TOKEN_HEADER_KEY, X_MONITORING_TOKEN_HEADER_VALUE) .contentType(ContentType.JSON) .when() - .get(String.format(LIST_WORKFLOW_DEFINITIONS_PATH, "on-activity-failed-one-of")) + .get(String.format(LIST_WORKFLOW_NODES_PATH, "on-activity-failed-one-of")) .thenReturn(); // actual flow nodes ObjectMapper objectMapper = new ObjectMapper(); - List nodeDefinitionViews = new ArrayList<>(); + List nodeViews = new ArrayList<>(); List flowNodes = response.body().jsonPath().getList("flowNodes"); flowNodes.forEach(flowNode -> { try { - nodeDefinitionViews.add( - objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeDefinitionView.class)); + nodeViews.add( + objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeView.class)); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Unexpected error when converting api response to TaskDefinitionView class"); @@ -1120,7 +1122,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { }); // expected flow nodes - NodeDefinitionView expectedSendMessageActivity1 = builder() + NodeView expectedSendMessageActivity1 = builder() .nodeId("first") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1128,7 +1130,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { .children(List.of(ChildView.of("second"), ChildView.of("fallback", "failed"))) .build(); - NodeDefinitionView expectedSendMessageActivity2 = builder() + NodeView expectedSendMessageActivity2 = builder() .nodeId("second") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1136,7 +1138,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { .children(List.of(ChildView.of("fallback", "failed"))) .build(); - NodeDefinitionView expectedSendMessageFallback = builder() + NodeView expectedSendMessageFallback = builder() .nodeId("fallback") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1144,7 +1146,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { .children(Collections.emptyList()) .build(); - NodeDefinitionView expectedMessageReceivedEventTask = builder() + NodeView expectedMessageReceivedEventTask = builder() .nodeId("message-received_/failure") .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) @@ -1152,7 +1154,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { .children(Collections.singletonList(ChildView.of("first"))) .build(); - List expectedTaskDefinitions = + List expectedTaskDefinitions = Arrays.asList(expectedSendMessageActivity1, expectedSendMessageActivity2, expectedSendMessageFallback, expectedMessageReceivedEventTask); @@ -1161,7 +1163,7 @@ void listWorkflow_oneOf_activityFailedEvent_Definitions() throws Exception { assertThat(response.body().jsonPath().getString("workflowId")).isEqualTo("on-activity-failed-one-of"); assertThat(response.body().jsonPath().getMap("variables")).isEmpty(); - assertThat(nodeDefinitionViews) + assertThat(nodeViews) .hasSameSizeAs(expectedTaskDefinitions) .hasSameElementsAs(expectedTaskDefinitions); @@ -1183,18 +1185,18 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .header(X_MONITORING_TOKEN_HEADER_KEY, X_MONITORING_TOKEN_HEADER_VALUE) .contentType(ContentType.JSON) .when() - .get(String.format(LIST_WORKFLOW_DEFINITIONS_PATH, "all-of-messages-received")) + .get(String.format(LIST_WORKFLOW_NODES_PATH, "all-of-messages-received")) .thenReturn(); // actual flow nodes ObjectMapper objectMapper = new ObjectMapper(); - List nodeDefinitionViews = new ArrayList<>(); + List nodeViews = new ArrayList<>(); List flowNodes = response.body().jsonPath().getList("flowNodes"); flowNodes.forEach(flowNode -> { try { - nodeDefinitionViews.add( - objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeDefinitionView.class)); + nodeViews.add( + objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeView.class)); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Unexpected error when converting api response to TaskDefinitionView class"); @@ -1202,7 +1204,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { }); // expected flow nodes - NodeDefinitionView expectedSendMessageStart = builder() + NodeView expectedSendMessageStart = builder() .nodeId("start") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1210,7 +1212,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(List.of(ChildView.of("scriptTrue", "${variables.allOf == true}"), ChildView.of("scriptFalse"))) .build(); - NodeDefinitionView expectedScriptTrue = builder() + NodeView expectedScriptTrue = builder() .nodeId("scriptTrue") .type(WorkflowNodeTypeHelper.toType("EXECUTE_SCRIPT")) .group(WorkflowNodeTypeHelper.toGroup("EXECUTE_SCRIPT")) @@ -1219,7 +1221,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { ChildView.of("endMessage_join_gateway"))) .build(); - NodeDefinitionView expectedScriptFalse = builder() + NodeView expectedScriptFalse = builder() .nodeId("scriptFalse") .type(WorkflowNodeTypeHelper.toType("EXECUTE_SCRIPT")) .group(WorkflowNodeTypeHelper.toGroup("EXECUTE_SCRIPT")) @@ -1227,7 +1229,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(Collections.emptyList()) .build(); - NodeDefinitionView expectedMessageReceivedEventTask = builder() + NodeView expectedMessageReceivedEventTask = builder() .nodeId("message-received_/start") .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) @@ -1235,7 +1237,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(Collections.singletonList(ChildView.of("start"))) .build(); - NodeDefinitionView expectedReceiveMessageEnd = builder() + NodeView expectedReceiveMessageEnd = builder() .nodeId("message-received_/message") .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) @@ -1243,7 +1245,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(List.of(ChildView.of("endMessage_join_gateway"))) .build(); - NodeDefinitionView expectedUserJoinedGateway = builder() + NodeView expectedUserJoinedGateway = builder() .nodeId("user-joined-room") .type(WorkflowNodeTypeHelper.toType("USER_JOINED_ROOM_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("USER_JOINED_ROOM_EVENT")) @@ -1251,7 +1253,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(List.of(ChildView.of("endMessage_join_gateway"))) .build(); - NodeDefinitionView expectedJoinGateway = builder() + NodeView expectedJoinGateway = builder() .nodeId("endMessage_join_gateway") .type(WorkflowNodeTypeHelper.toType("JOIN_GATEWAY")) .group(WorkflowNodeTypeHelper.toGroup("JOIN_GATEWAY")) @@ -1259,7 +1261,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(List.of(ChildView.of("endMessage"))) .build(); - NodeDefinitionView expectedSendMessageEnd = builder() + NodeView expectedSendMessageEnd = builder() .nodeId("endMessage") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1267,7 +1269,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { .children(Collections.emptyList()) .build(); - List expectedTaskDefinitions = + List expectedTaskDefinitions = Arrays.asList(expectedMessageReceivedEventTask, expectedSendMessageStart, expectedScriptTrue, expectedScriptFalse, expectedReceiveMessageEnd, expectedUserJoinedGateway, expectedJoinGateway, expectedSendMessageEnd); @@ -1276,7 +1278,7 @@ void listWorkflow_oneOf_allOf_gateway_definitions() throws Exception { assertThat(response.body().jsonPath().getString("workflowId")).isEqualTo("all-of-messages-received"); assertThat(response.body().jsonPath().getMap("variables")).hasSize(1); - assertThat(nodeDefinitionViews) + assertThat(nodeViews) .hasSameSizeAs(expectedTaskDefinitions) .hasSameElementsAs(expectedTaskDefinitions); @@ -1298,25 +1300,25 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .header(X_MONITORING_TOKEN_HEADER_KEY, X_MONITORING_TOKEN_HEADER_VALUE) .contentType(ContentType.JSON) .when() - .get(String.format(LIST_WORKFLOW_DEFINITIONS_PATH, "diagram-test")) + .get(String.format(LIST_WORKFLOW_NODES_PATH, "diagram-test")) .thenReturn(); // actual flow nodes ObjectMapper objectMapper = new ObjectMapper(); - List nodeDefinitionViews = new ArrayList<>(); + List nodeViews = new ArrayList<>(); List flowNodes = response.body().jsonPath().getList("flowNodes"); flowNodes.forEach(flowNode -> { try { - nodeDefinitionViews.add( - objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeDefinitionView.class)); + nodeViews.add( + objectMapper.readValue(objectMapper.writeValueAsString(flowNode), NodeView.class)); } catch (JsonProcessingException e) { e.printStackTrace(); fail("Unexpected error when converting api response to TaskDefinitionView class"); } }); - NodeDefinitionView messageReceived = builder() + NodeView messageReceived = builder() .nodeId("message-received_diagram") .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) @@ -1325,7 +1327,7 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .build(); // expected flow nodes - NodeDefinitionView expectedSendMessageStart = builder() + NodeView expectedSendMessageStart = builder() .nodeId("init") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1333,7 +1335,7 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .children(List.of(ChildView.of("abc"), ChildView.of("def"))) .build(); - NodeDefinitionView abc = builder() + NodeView abc = builder() .nodeId("abc") .type(WorkflowNodeTypeHelper.toType("EXECUTE_SCRIPT")) .group(WorkflowNodeTypeHelper.toGroup("EXECUTE_SCRIPT")) @@ -1341,7 +1343,7 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .children(List.of(ChildView.of("completed_join_gateway"))) .build(); - NodeDefinitionView def = builder() + NodeView def = builder() .nodeId("def") .type(WorkflowNodeTypeHelper.toType("EXECUTE_SCRIPT")) .group(WorkflowNodeTypeHelper.toGroup("EXECUTE_SCRIPT")) @@ -1349,7 +1351,7 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .children(List.of(ChildView.of("completed_join_gateway"))) .build(); - NodeDefinitionView gateway = builder() + NodeView gateway = builder() .nodeId("completed_join_gateway") .type(WorkflowNodeTypeHelper.toType("JOIN_GATEWAY")) .group(WorkflowNodeTypeHelper.toGroup("JOIN_GATEWAY")) @@ -1357,7 +1359,7 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .children(Collections.singletonList(ChildView.of("completed"))) .build(); - NodeDefinitionView expectedSendMessageEnd = builder() + NodeView expectedSendMessageEnd = builder() .nodeId("completed") .type(WorkflowNodeTypeHelper.toType("SEND_MESSAGE")) .group(WorkflowNodeTypeHelper.toGroup("SEND_MESSAGE")) @@ -1365,14 +1367,14 @@ void listWorkflow_allOf_onActivities_definitions() throws Exception { .children(Collections.emptyList()) .build(); - List expectedTaskDefinitions = + List expectedTaskDefinitions = Arrays.asList(messageReceived, expectedSendMessageStart, abc, def, gateway, expectedSendMessageEnd); assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()); assertThat(response.body().jsonPath().getString("workflowId")).isEqualTo("diagram-test"); assertThat(response.body().jsonPath().getMap("variables")).isEmpty(); - assertThat(nodeDefinitionViews) + assertThat(nodeViews) .hasSameSizeAs(expectedTaskDefinitions) .hasSameElementsAs(expectedTaskDefinitions); @@ -1389,7 +1391,7 @@ void listWorkflowActivitiesDefinitions_unknownWorkflowId() { .header(X_MONITORING_TOKEN_HEADER_KEY, X_MONITORING_TOKEN_HEADER_VALUE) .contentType(ContentType.JSON) .when() - .get(String.format(LIST_WORKFLOW_DEFINITIONS_PATH, unknownWorkflowId)) + .get(String.format(LIST_WORKFLOW_NODES_PATH, unknownWorkflowId)) .then() .assertThat() .statusCode(HttpStatus.NOT_FOUND.value()) diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/ApiTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/ApiTest.java index 1b1b678f..855a8a61 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/ApiTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/ApiTest.java @@ -1,5 +1,7 @@ package com.symphony.bdk.workflow.api.v1.controller; +import static org.mockito.Mockito.clearInvocations; + import com.symphony.bdk.workflow.engine.WorkflowEngine; import com.symphony.bdk.workflow.engine.camunda.CamundaTranslatedWorkflowContext; import com.symphony.bdk.workflow.expiration.WorkflowExpirationService; @@ -7,12 +9,13 @@ import com.symphony.bdk.workflow.management.WorkflowManagementService; import com.symphony.bdk.workflow.monitoring.service.MonitoringService; +import org.junit.jupiter.api.BeforeEach; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.test.web.servlet.MockMvc; -@WebMvcTest(properties = {"wdk.properties.management-token=myToken"}) +@WebMvcTest(properties = {"wdk.properties.management-token=myToken", "logging.level.web=TRACE"}) public class ApiTest { @Autowired MockMvc mockMvc; @@ -29,5 +32,13 @@ public class ApiTest { @MockBean WorkflowManagementService workflowManagementService; - @MockBean WorkflowExpirationService workflowExpirationService; + @MockBean + WorkflowExpirationService workflowExpirationService; + + @BeforeEach + void cleanup() { + clearInvocations(workflowExpirationService); + clearInvocations(workflowManagementService); + clearInvocations(monitoringService); + } } diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiControllerTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiControllerTest.java index b4a11c45..f1a70def 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiControllerTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsApiControllerTest.java @@ -1,6 +1,6 @@ package com.symphony.bdk.workflow.api.v1.controller; -import static com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView.ChildView; +import static com.symphony.bdk.workflow.api.v1.dto.NodeView.ChildView; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; @@ -13,13 +13,13 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -import com.symphony.bdk.workflow.api.v1.dto.NodeDefinitionView; +import com.symphony.bdk.workflow.api.v1.dto.NodeStateView; import com.symphony.bdk.workflow.api.v1.dto.NodeView; import com.symphony.bdk.workflow.api.v1.dto.StatusEnum; import com.symphony.bdk.workflow.api.v1.dto.VariableView; -import com.symphony.bdk.workflow.api.v1.dto.WorkflowDefinitionView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstLifeCycleFilter; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstView; +import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesStateView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowView; import com.symphony.bdk.workflow.engine.ExecutionParameters; @@ -42,11 +42,11 @@ class WorkflowsApiControllerTest extends ApiTest { private static final String WORKFLOW_EXECUTE_PATH = "/v1/workflows/wfId/execute"; - private static final String LIST_WORKFLOWS_PATH = "/v1/workflows/"; + private static final String LIST_WORKFLOWS_PATH = "/v1/workflows"; private static final String LIST_WORKFLOW_INSTANCES_PATH = "/v1/workflows/%s/instances"; private static final String LIST_WORKFLOW_INSTANCE_ACTIVITIES_PATH = "/v1/workflows/%s/instances/%s/states"; - private static final String GET_WORKFLOW_DEFINITIONS_PATH = "/v1/workflows/%s/definitions"; + private static final String GET_WORKFLOW_DEFINITIONS_PATH = "/v1/workflows/%s/nodes"; private static final String LIST_WORKFLOW_INSTANCE_GLOBAL_VARS_PATH = "/v1/workflows/%s/instances/%s/variables"; private static final String MONITORING_TOKEN_VALUE = "MONITORING_TOKEN_VALUE"; @@ -221,20 +221,20 @@ void listWorkflowInstanceStates() throws Exception { globalVariables.setRevision(0); globalVariables.setUpdateTime(Instant.ofEpochMilli(333L)); - NodeView nodeView1 = + NodeStateView nodeStateView1 = activityInstanceView(workflowId, "activity0", instanceId, "SEND_MESSAGE", "ACTIVITY", new VariableView(activityOutputs), 222L, 666L); - NodeView nodeView2 = + NodeStateView nodeStateView2 = activityInstanceView(workflowId, "activity1", instanceId, "CREATE_ROOM", "ACTIVITY", new VariableView(activityOutputs), 333L, 777L); - WorkflowNodesView workflowNodesView = new WorkflowNodesView(); - workflowNodesView.setNodes(Arrays.asList(nodeView1, nodeView2)); - workflowNodesView.setGlobalVariables(new VariableView(globalVariables)); + WorkflowNodesStateView workflowNodesStateView = new WorkflowNodesStateView(); + workflowNodesStateView.setNodes(Arrays.asList(nodeStateView1, nodeStateView2)); + workflowNodesStateView.setGlobalVariables(new VariableView(globalVariables)); when(monitoringService.listWorkflowInstanceNodes(eq(workflowId), eq(instanceId), - any(WorkflowInstLifeCycleFilter.class))).thenReturn(workflowNodesView); + any(WorkflowInstLifeCycleFilter.class))).thenReturn(workflowNodesStateView); mockMvc.perform( request(HttpMethod.GET, String.format(LIST_WORKFLOW_INSTANCE_ACTIVITIES_PATH, workflowId, instanceId)) @@ -307,29 +307,29 @@ void listWorkflowInstanceActivities_illegalArgument() throws Exception { void getWorkflowDefinitions() throws Exception { final String workflowId = "testWorkflowId"; - NodeDefinitionView activity0 = - new NodeDefinitionView("activity0", "SEND_MESSAGE", + NodeView activity0 = + new NodeView("activity0", "SEND_MESSAGE", "ACTIVITY", Collections.emptyList(), Collections.singletonList(ChildView.of("event0"))); - NodeDefinitionView event = - new NodeDefinitionView("event0", "ROOM_UPDATED", + NodeView event = + new NodeView("event0", "ROOM_UPDATED", "EVENT", Collections.singletonList("activity0"), Collections.singletonList(ChildView.of("activity1"))); - NodeDefinitionView activity1 = - new NodeDefinitionView("activity1", "SEND_MESSAGE", + NodeView activity1 = + new NodeView("activity1", "SEND_MESSAGE", "ACTIVITY", Collections.singletonList("event0"), Collections.emptyList()); - WorkflowDefinitionView workflowDefinitionView = WorkflowDefinitionView.builder() + WorkflowNodesView workflowNodesView = WorkflowNodesView.builder() .workflowId(workflowId) .version(1L) .variables(Collections.emptyMap()) .flowNodes(Arrays.asList(activity0, event, activity1)) .build(); - when(monitoringService.getWorkflowDefinition(eq(workflowId), eq(1L))).thenReturn(workflowDefinitionView); + when(monitoringService.getWorkflowDefinition(eq(workflowId), eq(1L))).thenReturn(workflowNodesView); mockMvc.perform( request(HttpMethod.GET, String.format(GET_WORKFLOW_DEFINITIONS_PATH, workflowId)) @@ -438,9 +438,9 @@ private WorkflowInstView workflowInstView(String workflowId, String instanceId, .build(); } - private NodeView activityInstanceView(String workflowId, String activityId, String instanceId, + private NodeStateView activityInstanceView(String workflowId, String activityId, String instanceId, String type, String group, VariableView variables, Long start, Long end) { - return NodeView.builder() + return NodeStateView.builder() .workflowId(workflowId) .instanceId(instanceId) .nodeId(activityId) diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiControllerTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiControllerTest.java index ceb5f5e0..9007e316 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiControllerTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/api/v1/controller/WorkflowsMgtApiControllerTest.java @@ -10,7 +10,10 @@ import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.request; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.put; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.symphony.bdk.core.auth.jwt.UserClaim; @@ -20,202 +23,255 @@ import com.symphony.bdk.workflow.exception.NotFoundException; import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Nested; import org.junit.jupiter.api.Test; import org.mockito.ArgumentCaptor; -import org.springframework.http.HttpMethod; import org.springframework.http.MediaType; import java.time.Instant; import java.util.List; import java.util.Optional; +@DisplayName("Test workflow management api") class WorkflowsMgtApiControllerTest extends ApiTest { - private static final String URL = "/v1/management/workflows"; - - @Test - void test_managementRequests_deploy() throws Exception { - doNothing().when(workflowManagementService).deploy(any(SwadlView.class)); - - mockMvc.perform(request(HttpMethod.POST, URL) - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) - .param("swadl", "content") - .param("description", "description")) - .andExpect(status().isNoContent()); - - verify(workflowManagementService).deploy(any(SwadlView.class)); + private static final String URL = "/v1/workflows"; + + + @Nested + @DisplayName("Deployment api") + class Deployment { + @Test + @DisplayName("Save deployment") + void testDeploy() throws Exception { + doNothing().when(workflowManagementService).deploy(any(SwadlView.class)); + + mockMvc.perform(post(URL).header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .param("swadl", "content") + .param("description", "description")).andExpect(status().isNoContent()); + + verify(workflowManagementService).deploy(any(SwadlView.class)); + } + + @Test + @DisplayName("Deploy workflow request with owner") + void test_deployRequests_withOwner() throws Exception { + doNothing().when(workflowManagementService).deploy(any(SwadlView.class)); + UserClaim user = mock(UserClaim.class); + when(user.getId()).thenReturn(12345L); + mockMvc.perform(post(URL) + .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .requestAttr("user", user) + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .param("swadl", "content") + .param("description", "description")) + .andExpect(status().isNoContent()); + + ArgumentCaptor captor = ArgumentCaptor.forClass(SwadlView.class); + verify(workflowManagementService).deploy(captor.capture()); + assertThat(captor.getValue().getCreatedBy()).isEqualTo(12345); + } + + @Test + @DisplayName("Update deployment") + void testUpdate() throws Exception { + doNothing().when(workflowManagementService).update(any(SwadlView.class)); + + mockMvc.perform(put(URL).header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .param("swadl", "content") + .param("description", "description")).andExpect(status().isNoContent()); + + verify(workflowManagementService).update(any(SwadlView.class)); + } + + @Test + @DisplayName("Missing token bad request") + void test_missingToken_badRequest() throws Exception { + mockMvc.perform(post(URL).contentType(MediaType.MULTIPART_FORM_DATA_VALUE) + .param("swadl", "content") + .param("description", "description")).andExpect(status().isBadRequest()); + } } - @Test - @DisplayName("Deploy workflow request with owner") - void test_deployRequests_withOwner() throws Exception { - doNothing().when(workflowManagementService).deploy(any(SwadlView.class)); - UserClaim user = mock(UserClaim.class); - when(user.getId()).thenReturn(12345L); - mockMvc.perform(request(HttpMethod.POST, URL) - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .requestAttr("user", user) - .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) - .param("swadl", "content") - .param("description", "description")) - .andExpect(status().isNoContent()); - - ArgumentCaptor captor = ArgumentCaptor.forClass(SwadlView.class); - verify(workflowManagementService).deploy(captor.capture()); - assertThat(captor.getValue().getCreatedBy()).isEqualTo(12345); - } - - @Test - void test_managementRequests_update() throws Exception { - doNothing().when(workflowManagementService).update(any(SwadlView.class)); - - mockMvc.perform(request(HttpMethod.PUT, URL) - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) - .param("swadl", "content") - .param("description", "description")) - .andExpect(status().isNoContent()); - verify(workflowManagementService).update(any(SwadlView.class)); - } + @Nested + @DisplayName("Get workflows") + class GetMethods { + String getUri = URL + "/{workflowId}"; - @Test - void test_managementRequests_get() throws Exception { - when(workflowManagementService.get(anyString())).thenReturn(List.of()); + @Test + @DisplayName("Get active version") + void testGetActiveVersion() throws Exception { + when(workflowManagementService.get(anyString())).thenReturn(Optional.of(VersionedWorkflowView.builder().build())); - mockMvc.perform(request(HttpMethod.GET, URL + "/id") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) - .andExpect(status().isOk()); + mockMvc.perform(get(getUri, "id").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) + .andExpect(status().isOk()); - verify(workflowManagementService).get(anyString()); - } + verify(workflowManagementService).get(anyString()); + } - @Test - void test_managementRequests_delete() throws Exception { - doNothing().when(workflowManagementService).delete(anyString()); + @Test + @DisplayName("Get not found version") + void testGetNotFoundVersion() throws Exception { + when(workflowManagementService.get(anyString(), anyLong())).thenReturn(Optional.empty()); - mockMvc.perform(request(HttpMethod.DELETE, URL + "/id") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .contentType("text/plain")) - .andExpect(status().isNoContent()); + mockMvc.perform(get(getUri, "/wfId").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .queryParam("version", "1674651222294886")).andExpect(status().isOk()); - verify(workflowManagementService).delete(anyString()); - } + verify(workflowManagementService).get(eq("wfId"), eq(1674651222294886L)); + } - @Test - void test_missingToken_badRequest() throws Exception { - mockMvc.perform(request(HttpMethod.POST, URL) - .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) - .param("swadl", "content") - .param("description", "description")) - .andExpect(status().isBadRequest()); - } + @Test + @DisplayName("Get specific version") + void testGetSpecificVersion() throws Exception { + when(workflowManagementService.get(anyString(), anyLong())).thenReturn( + Optional.of(VersionedWorkflowView.builder().build())); - @Test - void test_streamingLogs_missingToken_badRequest() throws Exception { - mockMvc.perform(request(HttpMethod.GET, URL + "/logs") - .contentType("text/plain")) - .andExpect(status().isBadRequest()); - } + mockMvc.perform(get(getUri, "/wfId").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .queryParam("version", "1674651222294886")).andExpect(status().isOk()); - @Test - void test_streamingLogs_returnOk() throws Exception { - mockMvc.perform(request(HttpMethod.GET, URL + "/logs") - .contentType("text/plain") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) - .andExpect(status().isOk()); - } + verify(workflowManagementService).get(eq("wfId"), eq(1674651222294886L)); + } - @Test - void test_getWorkflowByVersion_notFound() throws Exception { - when(workflowManagementService.get(anyString(), anyLong())).thenReturn(Optional.empty()); + @Test + @DisplayName("Get all versions") + void testAllVersions() throws Exception { + when(workflowManagementService.getAllVersions(anyString())).thenReturn( + List.of(VersionedWorkflowView.builder().build())); - mockMvc.perform(request(HttpMethod.GET, URL + "/wfId/versions/1674651222294886") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) - .andExpect(status().isNotFound()); + mockMvc.perform(get(getUri, "/wfId").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .queryParam("all_versions", "true")).andExpect(status().isOk()); - verify(workflowManagementService).get(eq("wfId"), eq(1674651222294886L)); + verify(workflowManagementService).getAllVersions(eq("wfId")); + } } - @Test - void test_getWorkflowByVersion_returnOk() throws Exception { - when(workflowManagementService.get(anyString(), anyLong())).thenReturn(Optional.of(VersionedWorkflowView.builder() - .build())); - mockMvc.perform(request(HttpMethod.GET, URL + "/wfId/versions/1674651222294886") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) - .andExpect(status().isOk()); + @Nested + @DisplayName("Delete workflow") + class DeleteMethods { + String deleteUri = URL + "/{workflowId}"; - verify(workflowManagementService).get(eq("wfId"), eq(1674651222294886L)); - } - - @Test - void test_deleteByVersion_delete() throws Exception { - doNothing().when(workflowManagementService).delete(anyString(), anyLong()); - - mockMvc.perform(request(HttpMethod.DELETE, URL + "/wfId/versions/1674651222294886") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) - .andExpect(status().isNoContent()); + @Test + @DisplayName("by ID") + void testDeleteWorkflow() throws Exception { + doNothing().when(workflowManagementService).delete(anyString()); - verify(workflowManagementService).delete(anyString(), anyLong()); - } - - @Test - void test_setActiveVersion_badRequest() throws Exception { - mockMvc.perform(request(HttpMethod.POST, URL + "/wfid/versions/1674651222294886") - .contentType("text/plain") - .content("content")) - .andExpect(status().isBadRequest()); - } + mockMvc.perform(delete(deleteUri, "id").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType("application/json")).andExpect(status().isNoContent()); - @Test - void test_setActiveVersion_returnOk() throws Exception { - doNothing().when(workflowManagementService).setActiveVersion(anyString(), anyLong()); + verify(workflowManagementService).delete(anyString()); + } - mockMvc.perform(request(HttpMethod.POST, URL + "/wfId/versions/1674651222294886") - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .contentType("text/plain")) - .andExpect(status().isNoContent()); + @Test + @DisplayName("by version") + void testDeleteByVersion() throws Exception { + doNothing().when(workflowManagementService).delete(anyString(), anyLong()); - verify(workflowManagementService).setActiveVersion(eq("wfId"), eq(1674651222294886L)); + mockMvc.perform(delete(deleteUri, "id").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType("application/json") + .queryParam("version", "1674651222294886")) + .andExpect(status().isNoContent()); + verify(workflowManagementService).delete(anyString(), anyLong()); + } } - @Test - void test_scheduleWorkflowExpiration_badRequest() throws Exception { - mockMvc.perform(request(HttpMethod.POST, URL + "/wfid") - .contentType("application/json") - .content(Instant.now().toString())) - .andExpect(status().isBadRequest()); - } - - @Test - void test_scheduleWorkflowExpiration_exceptionThrown() throws Exception { - final String workflowId = "wfId"; - final Instant now = Instant.now(); - - doThrow(NotFoundException.class).when(workflowExpirationService) - .scheduleWorkflowExpiration(eq(workflowId), eq(now)); - mockMvc.perform(request(HttpMethod.POST, URL + "/" + workflowId) - .contentType("application/json") - .content(Instant.now().toString())) - .andExpect(status().isBadRequest()); + @Nested + @DisplayName("Test Streaming logs") + class StreamLog { + String streamLogUri = URL + "/logs"; + + @Test + @DisplayName("Streaming logs missing token") + void test_streamingLogs_missingToken_badRequest() throws Exception { + mockMvc.perform(get(streamLogUri).contentType("text/plain")).andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Streaming logs") + void test_streamingLogs_returnOk() throws Exception { + mockMvc.perform( + get(streamLogUri).contentType("text/plain").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken")) + .andExpect(status().isOk()); + } } - @Test - void test_scheduleWorkflowExpiration_returnOk() throws Exception { - final String workflowId = "wfId"; - final Instant now = Instant.now(); - doNothing().when(workflowExpirationService).scheduleWorkflowExpiration(eq(workflowId), eq(now)); - mockMvc.perform(request(HttpMethod.POST, URL + "/" + workflowId) - .header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") - .contentType("application/json") - .content("\"" + now.toString() + "\"")) - .andExpect(status().isOk()); - - verify(workflowExpirationService).scheduleWorkflowExpiration(eq(workflowId), eq(now)); + @Nested + @DisplayName("Set active version and expiration time of workflow") + class ActiveVersion { + String getVersionUri = URL + "/{workflowId}"; + + @Test + @DisplayName("Set active version successfully") + void testActiveVersion() throws Exception { + doNothing().when(workflowManagementService).setActiveVersion(anyString(), anyLong()); + + mockMvc.perform(put(getVersionUri, "/wfId").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .queryParam("version", "1674651222294886") + .contentType("application/json")).andExpect(status().isNoContent()); + + verify(workflowManagementService).setActiveVersion(eq("wfId"), eq(1674651222294886L)); + } + + @Test + @DisplayName("Set active version and expiration time") + void testActiveVersionAndExpiration() throws Exception { + doNothing().when(workflowManagementService).setActiveVersion(anyString(), anyLong()); + final Instant now = Instant.now(); + doNothing().when(workflowExpirationService).scheduleWorkflowExpiration(eq("wfId"), eq(now)); + + mockMvc.perform(put(getVersionUri, "/wfId").header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType("application/json") + .queryParam("version", "1674651222294886") + .queryParam("expiration_date", now.toString())) + .andExpect(status().isNoContent()); + + verify(workflowManagementService).setActiveVersion(eq("wfId"), eq(1674651222294886L)); + verify(workflowExpirationService).scheduleWorkflowExpiration(eq("wfId"), eq(now)); + } + + @Test + @DisplayName("Token is missing") + void testTokenMissing() throws Exception { + mockMvc.perform(put(getVersionUri, "/wfId").contentType("application/json") + .queryParam("expiration_date", Instant.now().toString())) + .andExpect(status().isBadRequest()); + } + + @Test + @DisplayName("Workflow not found") + void testWorkflowNotFound() throws Exception { + final String workflowId = "wfId"; + final Instant now = Instant.now(); + + doThrow(NotFoundException.class).when(workflowExpirationService) + .scheduleWorkflowExpiration(eq(workflowId), eq(now)); + + mockMvc.perform(put(getVersionUri, workflowId).header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType("application/json") + .queryParam("expiration_date", now.toString())) + .andExpect(status().isNotFound()); + } + + @Test + @DisplayName("Schedule workflow expiration successfully") + void testScheduleWorkflowExpiration() throws Exception { + final String workflowId = "wfId"; + final Instant now = Instant.now(); + + doNothing().when(workflowExpirationService).scheduleWorkflowExpiration(eq(workflowId), eq(now)); + mockMvc.perform(put(getVersionUri, workflowId).header(WorkflowsMgtApi.X_MANAGEMENT_TOKEN_KEY, "myToken") + .contentType("application/json") + .queryParam("expiration_date", now.toString())) + .andExpect(status().isNoContent()); + + verify(workflowExpirationService).scheduleWorkflowExpiration(eq(workflowId), eq(now)); + } } + } diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/MonitoringServiceTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/MonitoringServiceTest.java index c5427264..64f6f6d0 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/MonitoringServiceTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/MonitoringServiceTest.java @@ -10,12 +10,12 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.symphony.bdk.workflow.api.v1.dto.NodeView; +import com.symphony.bdk.workflow.api.v1.dto.NodeStateView; import com.symphony.bdk.workflow.api.v1.dto.StatusEnum; import com.symphony.bdk.workflow.api.v1.dto.VariableView; -import com.symphony.bdk.workflow.api.v1.dto.WorkflowDefinitionView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstLifeCycleFilter; import com.symphony.bdk.workflow.api.v1.dto.WorkflowInstView; +import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesStateView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowNodesView; import com.symphony.bdk.workflow.api.v1.dto.WorkflowView; import com.symphony.bdk.workflow.converter.ObjectConverter; @@ -156,7 +156,7 @@ void listWorkflowInstancesBadStatus() { @ValueSource(strings = {"", "errors"}) void listWorkflowInstanceActivities(String errors) { // given - NodeView view1 = NodeView.builder() + NodeStateView view1 = NodeStateView.builder() .instanceId("instance") .nodeId("activity1") .workflowId("workflow") @@ -166,7 +166,7 @@ void listWorkflowInstanceActivities(String errors) { .type(WorkflowNodeTypeHelper.toType("MESSAGE_RECEIVED_EVENT")) .group(WorkflowNodeTypeHelper.toGroup("MESSAGE_RECEIVED_EVENT")) .outputs(Maps.newHashMap("key", "value1")).build(); - NodeView view2 = NodeView.builder() + NodeStateView view2 = NodeStateView.builder() .instanceId("instance") .nodeId("activity2") .workflowId("workflow") @@ -184,7 +184,7 @@ void listWorkflowInstanceActivities(String errors) { when(activityQueryRepository.findAllByWorkflowInstanceId(anyString(), anyString(), any(WorkflowInstLifeCycleFilter.class))).thenReturn(Collections.singletonList(ActivityInstanceDomain.builder() .build())); // returns at least one item, otherwise an IllegalArgumentException will be thrown - when(objectConverter.convertCollection(anyList(), eq(NodeView.class))).thenReturn( + when(objectConverter.convertCollection(anyList(), eq(NodeStateView.class))).thenReturn( List.of(view1, view2)); when(objectConverter.convertCollection(anyList(), eq(WorkflowInstView.class))).thenReturn( List.of(workflowInstView)); @@ -231,7 +231,7 @@ void listWorkflowInstanceActivities(String errors) { } // when - WorkflowNodesView workflowInstanceActivities = service.listWorkflowInstanceNodes("workflow", "instance", + WorkflowNodesStateView workflowInstanceActivities = service.listWorkflowInstanceNodes("workflow", "instance", new WorkflowInstLifeCycleFilter(null, null, null, null)); // then @@ -292,7 +292,7 @@ void getWorkflowDefinition(Long version) { directedGraph.getChildren("activity1").addChild("activity2"); directedGraph.getVariables().put("variable", "value"); - WorkflowDefinitionView definitionView; + WorkflowNodesView definitionView; if (Optional.ofNullable(version).isPresent()) { when(workflowDirectedGraphService.getDirectedGraph(eq("workflow"), eq(version))).thenReturn(directedGraph); definitionView = service.getWorkflowDefinition("workflow", version); diff --git a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverterTest.java b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverterTest.java index b7a76cdd..e8dae9ac 100644 --- a/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverterTest.java +++ b/workflow-bot-app/src/test/java/com/symphony/bdk/workflow/monitoring/service/converter/ActivityInstViewConverterTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.BDDAssertions.then; -import com.symphony.bdk.workflow.api.v1.dto.NodeView; +import com.symphony.bdk.workflow.api.v1.dto.NodeStateView; import com.symphony.bdk.workflow.monitoring.repository.domain.ActivityInstanceDomain; import com.symphony.bdk.workflow.monitoring.repository.domain.VariablesDomain; @@ -40,7 +40,7 @@ void apply_convertTask(String task) { // when ActivityInstViewConverter converter = new ActivityInstViewConverter(); - NodeView instanceView = converter.apply(domain); + NodeStateView instanceView = converter.apply(domain); // then then(instanceView.getNodeId()).isEqualTo("activity");