fix: Expose actions with collections in view mode (#8509)

* fix: Expose actions with collections in view mode

* Dummy commit for tests to pass

* Test fixes
This commit is contained in:
Nidhi 2021-10-14 12:23:46 +05:30 committed by GitHub
parent 23dbc6c6d7
commit 1cefa7e51b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 120 additions and 3 deletions

View File

@ -3,6 +3,7 @@ package com.appsmith.server.controllers;
import com.appsmith.server.constants.Url; import com.appsmith.server.constants.Url;
import com.appsmith.server.dtos.ActionCollectionDTO; import com.appsmith.server.dtos.ActionCollectionDTO;
import com.appsmith.server.dtos.ActionCollectionMoveDTO; import com.appsmith.server.dtos.ActionCollectionMoveDTO;
import com.appsmith.server.dtos.ActionCollectionViewDTO;
import com.appsmith.server.dtos.LayoutDTO; import com.appsmith.server.dtos.LayoutDTO;
import com.appsmith.server.dtos.RefactorActionCollectionNameDTO; import com.appsmith.server.dtos.RefactorActionCollectionNameDTO;
import com.appsmith.server.dtos.RefactorActionNameInCollectionDTO; import com.appsmith.server.dtos.RefactorActionNameInCollectionDTO;
@ -72,9 +73,9 @@ public class ActionCollectionController {
} }
@GetMapping("/view") @GetMapping("/view")
public Mono<ResponseDTO<List<ActionCollectionDTO>>> getAllPublishedActionCollections(@RequestParam MultiValueMap<String, String> params) { public Mono<ResponseDTO<List<ActionCollectionViewDTO>>> getAllPublishedActionCollections(@RequestParam String applicationId) {
log.debug("Going to get all published action collections with params : {}", params); log.debug("Going to get all published action collections with application Id : {}", applicationId);
return actionCollectionService.getPopulatedActionCollectionsByViewMode(params, true) return actionCollectionService.getActionCollectionsForViewMode(applicationId)
.collectList() .collectList()
.map(resources -> new ResponseDTO<>(HttpStatus.OK.value(), resources, null)); .map(resources -> new ResponseDTO<>(HttpStatus.OK.value(), resources, null));
} }

View File

@ -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<JSValue> variables;
List<ActionDTO> actions;
}

View File

@ -4,6 +4,7 @@ import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.ActionCollection; import com.appsmith.server.domains.ActionCollection;
import com.appsmith.server.domains.NewPage; import com.appsmith.server.domains.NewPage;
import com.appsmith.server.dtos.ActionCollectionDTO; import com.appsmith.server.dtos.ActionCollectionDTO;
import com.appsmith.server.dtos.ActionCollectionViewDTO;
import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.dtos.ActionDTO;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.util.MultiValueMap; import org.springframework.util.MultiValueMap;
@ -41,4 +42,5 @@ public interface ActionCollectionService extends CrudService<ActionCollection, S
Flux<ActionCollection> findByPageId(String pageId, AclPermission permission); Flux<ActionCollection> findByPageId(String pageId, AclPermission permission);
Flux<ActionCollectionViewDTO> getActionCollectionsForViewMode(String applicationId);
} }

View File

@ -9,6 +9,7 @@ import com.appsmith.server.domains.ActionCollection;
import com.appsmith.server.domains.NewPage; import com.appsmith.server.domains.NewPage;
import com.appsmith.server.domains.Page; import com.appsmith.server.domains.Page;
import com.appsmith.server.dtos.ActionCollectionDTO; import com.appsmith.server.dtos.ActionCollectionDTO;
import com.appsmith.server.dtos.ActionCollectionViewDTO;
import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.dtos.ActionDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.exceptions.AppsmithException;
@ -33,6 +34,7 @@ import java.util.Set;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static com.appsmith.external.helpers.BeanCopyUtils.copyNewFieldValuesIntoOldObject; 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.MANAGE_ACTIONS;
import static com.appsmith.server.acl.AclPermission.READ_ACTIONS; import static com.appsmith.server.acl.AclPermission.READ_ACTIONS;
import static java.lang.Boolean.TRUE; import static java.lang.Boolean.TRUE;
@ -146,6 +148,34 @@ public class ActionCollectionServiceImpl extends BaseService<ActionCollectionRep
}); });
} }
@Override
public Flux<ActionCollectionViewDTO> 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 @Override
public Flux<ActionCollectionDTO> getActionCollectionsByViewMode(MultiValueMap<String, String> params, Boolean viewMode) { public Flux<ActionCollectionDTO> getActionCollectionsByViewMode(MultiValueMap<String, String> params, Boolean viewMode) {
if (params == null || viewMode == null) { if (params == null || viewMode == null) {

View File

@ -2,6 +2,7 @@ package com.appsmith.server.services;
import com.appsmith.external.models.ActionConfiguration; import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.Datasource; import com.appsmith.external.models.Datasource;
import com.appsmith.external.models.JSValue;
import com.appsmith.external.models.Policy; import com.appsmith.external.models.Policy;
import com.appsmith.external.plugins.PluginExecutor; import com.appsmith.external.plugins.PluginExecutor;
import com.appsmith.server.acl.AclPermission; 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.User;
import com.appsmith.server.domains.UserRole; import com.appsmith.server.domains.UserRole;
import com.appsmith.server.dtos.ActionCollectionDTO; import com.appsmith.server.dtos.ActionCollectionDTO;
import com.appsmith.server.dtos.ActionCollectionViewDTO;
import com.appsmith.server.dtos.ActionDTO; import com.appsmith.server.dtos.ActionDTO;
import com.appsmith.server.dtos.LayoutDTO; import com.appsmith.server.dtos.LayoutDTO;
import com.appsmith.server.dtos.PageDTO; import com.appsmith.server.dtos.PageDTO;
@ -412,4 +414,64 @@ public class ActionCollectionServiceTest {
}) })
.verifyComplete(); .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<List<ActionCollectionViewDTO>> 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<ActionDTO> actions = actionCollectionViewDTO.getActions();
assertThat(actions.size()).isEqualTo(1);
assertThat(actions.get(0).getActionConfiguration().getBody()).isEqualTo("mockBody");
// Variables
final List<JSValue> 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();
}
} }