diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ActionCollectionController.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ActionCollectionController.java index b5c989d953..2035ba5e44 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ActionCollectionController.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ActionCollectionController.java @@ -3,6 +3,7 @@ package com.appsmith.server.controllers; import com.appsmith.server.constants.Url; import com.appsmith.server.dtos.ActionCollectionDTO; import com.appsmith.server.dtos.ActionCollectionMoveDTO; +import com.appsmith.server.dtos.ActionCollectionViewDTO; import com.appsmith.server.dtos.LayoutDTO; import com.appsmith.server.dtos.RefactorActionCollectionNameDTO; import com.appsmith.server.dtos.RefactorActionNameInCollectionDTO; @@ -72,9 +73,9 @@ public class ActionCollectionController { } @GetMapping("/view") - public Mono>> getAllPublishedActionCollections(@RequestParam MultiValueMap params) { - log.debug("Going to get all published action collections with params : {}", params); - return actionCollectionService.getPopulatedActionCollectionsByViewMode(params, true) + public Mono>> getAllPublishedActionCollections(@RequestParam String applicationId) { + log.debug("Going to get all published action collections with application Id : {}", applicationId); + return actionCollectionService.getActionCollectionsForViewMode(applicationId) .collectList() .map(resources -> new ResponseDTO<>(HttpStatus.OK.value(), resources, null)); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ActionCollectionViewDTO.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ActionCollectionViewDTO.java new file mode 100644 index 0000000000..16ae46fc51 --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ActionCollectionViewDTO.java @@ -0,0 +1,22 @@ +package com.appsmith.server.dtos; + +import com.appsmith.external.models.JSValue; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import lombok.ToString; + +import java.util.List; + +@Getter +@Setter +@NoArgsConstructor +@ToString +public class ActionCollectionViewDTO { + String id; + String name; + String pageId; + String applicationId; + List variables; + List actions; +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionService.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionService.java index cb1509867c..80bd8ecd83 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionService.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionService.java @@ -4,6 +4,7 @@ import com.appsmith.server.acl.AclPermission; import com.appsmith.server.domains.ActionCollection; import com.appsmith.server.domains.NewPage; import com.appsmith.server.dtos.ActionCollectionDTO; +import com.appsmith.server.dtos.ActionCollectionViewDTO; import com.appsmith.server.dtos.ActionDTO; import org.springframework.data.domain.Sort; import org.springframework.util.MultiValueMap; @@ -41,4 +42,5 @@ public interface ActionCollectionService extends CrudService findByPageId(String pageId, AclPermission permission); + Flux getActionCollectionsForViewMode(String applicationId); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionServiceImpl.java index ac48472177..5a9d834fe5 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ActionCollectionServiceImpl.java @@ -9,6 +9,7 @@ import com.appsmith.server.domains.ActionCollection; import com.appsmith.server.domains.NewPage; import com.appsmith.server.domains.Page; import com.appsmith.server.dtos.ActionCollectionDTO; +import com.appsmith.server.dtos.ActionCollectionViewDTO; import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; @@ -33,6 +34,7 @@ import java.util.Set; import java.util.stream.Collectors; import static com.appsmith.external.helpers.BeanCopyUtils.copyNewFieldValuesIntoOldObject; +import static com.appsmith.server.acl.AclPermission.EXECUTE_ACTIONS; import static com.appsmith.server.acl.AclPermission.MANAGE_ACTIONS; import static com.appsmith.server.acl.AclPermission.READ_ACTIONS; import static java.lang.Boolean.TRUE; @@ -146,6 +148,34 @@ public class ActionCollectionServiceImpl extends BaseService getActionCollectionsForViewMode(String applicationId) { + if (applicationId == null || applicationId.isEmpty()) { + return Flux.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.APPLICATION_ID)); + } + + return repository + .findByApplicationIdAndViewMode(applicationId, true, EXECUTE_ACTIONS) + .flatMap(actionCollection -> { + ActionCollectionViewDTO actionCollectionViewDTO = new ActionCollectionViewDTO(); + final ActionCollectionDTO publishedCollection = actionCollection.getPublishedCollection(); + actionCollectionViewDTO.setId(actionCollection.getId()); + actionCollectionViewDTO.setName(publishedCollection.getName()); + actionCollectionViewDTO.setPageId(publishedCollection.getPageId()); + actionCollectionViewDTO.setApplicationId(actionCollection.getApplicationId()); + actionCollectionViewDTO.setVariables(publishedCollection.getVariables()); + return Flux.fromIterable(publishedCollection.getActionIds()) + .flatMap(actionId -> { + return newActionService.findActionDTObyIdAndViewMode(actionId, true, EXECUTE_ACTIONS); + }) + .collectList() + .map(actionDTOList -> { + actionCollectionViewDTO.setActions(actionDTOList); + return actionCollectionViewDTO; + }); + }); + } + @Override public Flux getActionCollectionsByViewMode(MultiValueMap params, Boolean viewMode) { if (params == null || viewMode == null) { diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ActionCollectionServiceTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ActionCollectionServiceTest.java index 81ec0824c3..e8833d2d3c 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ActionCollectionServiceTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ActionCollectionServiceTest.java @@ -2,6 +2,7 @@ package com.appsmith.server.services; import com.appsmith.external.models.ActionConfiguration; import com.appsmith.external.models.Datasource; +import com.appsmith.external.models.JSValue; import com.appsmith.external.models.Policy; import com.appsmith.external.plugins.PluginExecutor; import com.appsmith.server.acl.AclPermission; @@ -16,6 +17,7 @@ import com.appsmith.server.domains.PluginType; import com.appsmith.server.domains.User; import com.appsmith.server.domains.UserRole; import com.appsmith.server.dtos.ActionCollectionDTO; +import com.appsmith.server.dtos.ActionCollectionViewDTO; import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.dtos.LayoutDTO; import com.appsmith.server.dtos.PageDTO; @@ -412,4 +414,64 @@ public class ActionCollectionServiceTest { }) .verifyComplete(); } + + /** + * For a given collection testCollection1, that refers to another action testCollection1.testAction1, + * When the page with this collection is published, + * Then the view mode collection should contain actions and variables + */ + @Test + @WithUserDetails(value = "api_user") + public void testActionCollectionInViewMode() { + Mockito.when(pluginExecutorHelper.getPluginExecutor(Mockito.any())).thenReturn(Mono.just(pluginExecutor)); + Mockito.when(pluginExecutor.getHintMessages(Mockito.any(), Mockito.any())) + .thenReturn(Mono.zip(Mono.just(new HashSet<>()), Mono.just(new HashSet<>()))); + + ActionCollectionDTO actionCollectionDTO = new ActionCollectionDTO(); + actionCollectionDTO.setName("testCollection1"); + actionCollectionDTO.setPageId(testPage.getId()); + actionCollectionDTO.setApplicationId(testApp.getId()); + actionCollectionDTO.setOrganizationId(orgId); + actionCollectionDTO.setPluginId(datasource.getPluginId()); + actionCollectionDTO.setVariables(List.of(new JSValue("test", "String", "test", true))); + ActionDTO action1 = new ActionDTO(); + action1.setName("testAction1"); + action1.setActionConfiguration(new ActionConfiguration()); + action1.getActionConfiguration().setBody("mockBody"); + actionCollectionDTO.setActions(List.of(action1)); + actionCollectionDTO.setPluginType(PluginType.JS); + + final ActionCollectionDTO createdActionCollectionDTO = layoutCollectionService.createCollection(actionCollectionDTO).block(); + assert createdActionCollectionDTO != null; + + final Mono> viewModeCollectionsMono = applicationPageService.publish(testApp.getId(), true) + .thenMany(actionCollectionService.getActionCollectionsForViewMode(testApp.getId())) + .collectList(); + + StepVerifier.create(viewModeCollectionsMono) + .assertNext(viewModeCollections -> { + assertThat(viewModeCollections.size()).isEqualTo(1); + + final ActionCollectionViewDTO actionCollectionViewDTO = viewModeCollections.get(0); + + // Actions + final List actions = actionCollectionViewDTO.getActions(); + assertThat(actions.size()).isEqualTo(1); + assertThat(actions.get(0).getActionConfiguration().getBody()).isEqualTo("mockBody"); + + // Variables + final List variables = actionCollectionViewDTO.getVariables(); + assertThat(variables.size()).isEqualTo(1); + assertThat(variables.get(0).getValue()).isEqualTo("test"); + + // Metadata + assertThat(actionCollectionViewDTO.getId()).isEqualTo(createdActionCollectionDTO.getId()); + assertThat(actionCollectionViewDTO.getName()).isEqualTo("testCollection1"); + assertThat(actionCollectionViewDTO.getApplicationId()).isEqualTo(testApp.getId()); + assertThat(actionCollectionViewDTO.getPageId()).isEqualTo(testPage.getId()); + + }) + .verifyComplete(); + + } }