Changes for JS actions in the import/export feature (#7892)

This commit is contained in:
Nidhi 2021-09-28 18:13:26 +05:30 committed by GitHub
parent f8442622b3
commit 883b0215a6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 1277 additions and 1002 deletions

View File

@ -18,19 +18,21 @@ import java.util.Set;
public class ApplicationJson {
Application exportedApplication;
List<Datasource> datasourceList;
List<NewPage> pageList;
String publishedDefaultPageName;
String unpublishedDefaultPageName;
List<NewAction> actionList;
List<ActionCollection> actionCollectionList;
Map<String, DecryptedSensitiveFields> decryptedFields;
/**
* Mapping mongoEscapedWidgets with layoutId
*/

View File

@ -8,6 +8,9 @@ import reactor.core.publisher.Flux;
import java.util.List;
public interface CustomActionCollectionRepository extends AppsmithRepository<ActionCollection> {
Flux<ActionCollection> findByApplicationId(String applicationId, AclPermission aclPermission, Sort sort);
Flux<ActionCollection> findByApplicationIdAndViewMode(String applicationId, boolean viewMode, AclPermission aclPermission);
Flux<ActionCollection> findAllActionCollectionsByNameAndPageIdsAndViewMode(String name, List<String> pageIds, boolean viewMode, AclPermission aclPermission, Sort sort);

View File

@ -19,6 +19,15 @@ public class CustomActionCollectionRepositoryImpl extends BaseAppsmithRepository
super(mongoOperations, mongoConverter);
}
@Override
public Flux<ActionCollection> findByApplicationId(String applicationId, AclPermission aclPermission, Sort sort) {
Criteria applicationCriteria = where(fieldName(QActionCollection.actionCollection.applicationId)).is(applicationId);
return queryAll(List.of(applicationCriteria), aclPermission, sort);
}
@Override
public Flux<ActionCollection> findByApplicationIdAndViewMode(String applicationId, boolean viewMode, AclPermission aclPermission) {

View File

@ -29,7 +29,6 @@ public interface ActionCollectionService extends CrudService<ActionCollection, S
Flux<ActionCollectionDTO> getActionCollectionsByViewMode(MultiValueMap<String, String> params, Boolean viewMode);
Mono<ActionCollectionDTO> update(String id, ActionCollectionDTO actionCollectionDTO);
Mono<ActionCollectionDTO> deleteUnpublishedActionCollection(String id);

View File

@ -183,7 +183,6 @@ public class ActionCollectionServiceTest {
.build();
ActionCollectionDTO actionCollectionDTO = new ActionCollectionDTO();
actionCollectionDTO.setName("validActionCollection");
actionCollectionDTO.setName("testActionCollection");
actionCollectionDTO.setApplicationId(testApp.getId());
actionCollectionDTO.setOrganizationId(testApp.getOrganizationId());

View File

@ -2,16 +2,17 @@ package com.appsmith.server.solutions;
import com.appsmith.external.models.ActionConfiguration;
import com.appsmith.external.models.DBAuth;
import com.appsmith.external.models.Datasource;
import com.appsmith.external.models.DatasourceConfiguration;
import com.appsmith.external.models.DecryptedSensitiveFields;
import com.appsmith.external.models.Policy;
import com.appsmith.external.models.Property;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.constants.SerialiseApplicationObjective;
import com.appsmith.server.domains.ActionCollection;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationJson;
import com.appsmith.server.domains.ApplicationPage;
import com.appsmith.external.models.Datasource;
import com.appsmith.server.domains.GitApplicationMetadata;
import com.appsmith.server.domains.Layout;
import com.appsmith.server.domains.NewAction;
@ -19,6 +20,7 @@ import com.appsmith.server.domains.NewPage;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.Plugin;
import com.appsmith.server.domains.PluginType;
import com.appsmith.server.dtos.ActionCollectionDTO;
import com.appsmith.server.dtos.ActionDTO;
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.exceptions.AppsmithError;
@ -27,10 +29,12 @@ import com.appsmith.server.helpers.MockPluginExecutor;
import com.appsmith.server.helpers.PluginExecutorHelper;
import com.appsmith.server.repositories.NewPageRepository;
import com.appsmith.server.repositories.PluginRepository;
import com.appsmith.server.services.ActionCollectionService;
import com.appsmith.server.services.ApplicationPageService;
import com.appsmith.server.services.ApplicationService;
import com.appsmith.server.services.DatasourceService;
import com.appsmith.server.services.LayoutActionService;
import com.appsmith.server.services.LayoutCollectionService;
import com.appsmith.server.services.NewActionService;
import com.appsmith.server.services.NewPageService;
import com.appsmith.server.services.OrganizationService;
@ -70,6 +74,7 @@ import java.util.Map;
import java.util.Set;
import static com.appsmith.server.acl.AclPermission.EXPORT_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.MANAGE_ACTIONS;
import static com.appsmith.server.acl.AclPermission.MANAGE_APPLICATIONS;
import static com.appsmith.server.acl.AclPermission.MANAGE_DATASOURCES;
import static com.appsmith.server.acl.AclPermission.MANAGE_PAGES;
@ -116,10 +121,16 @@ public class ImportExportApplicationServiceTests {
@Autowired
private LayoutActionService layoutActionService;
@Autowired
private NewPageRepository newPageRepository;
@Autowired
private LayoutCollectionService layoutCollectionService;
@Autowired
private ActionCollectionService actionCollectionService;
@MockBean
private PluginExecutorHelper pluginExecutorHelper;
@ -127,8 +138,10 @@ public class ImportExportApplicationServiceTests {
private Plugin installedPlugin;
private String orgId;
private String testAppId;
private Datasource jsDatasource;
private Map<String, Datasource> datasourceMap = new HashMap<>();
private Plugin installedJsPlugin;
private Flux<ActionDTO> getActionsInApplication(Application application) {
return newPageService
// fetch the unpublished pages
@ -178,6 +191,13 @@ public class ImportExportApplicationServiceTests {
auth.setPassword("awesome-password");
ds2.getDatasourceConfiguration().setAuthentication(auth);
jsDatasource = new Datasource();
jsDatasource.setName("Default JS datasource");
jsDatasource.setOrganizationId(orgId);
installedJsPlugin = pluginRepository.findByPackageName("installed-js-plugin").block();
assert installedJsPlugin != null;
jsDatasource.setPluginId(installedJsPlugin.getId());
datasourceMap.put("DS1", ds1);
datasourceMap.put("DS2", ds2);
}
@ -347,7 +367,21 @@ public class ImportExportApplicationServiceTests {
action.setActionConfiguration(actionConfiguration);
action.setDatasource(ds2);
return layoutActionService.createSingleAction(action)
ActionCollectionDTO actionCollectionDTO1 = new ActionCollectionDTO();
actionCollectionDTO1.setName("testCollection1");
actionCollectionDTO1.setPageId(testPage.getId());
actionCollectionDTO1.setApplicationId(testApp.getId());
actionCollectionDTO1.setOrganizationId(testApp.getOrganizationId());
actionCollectionDTO1.setPluginId(jsDatasource.getPluginId());
ActionDTO action1 = new ActionDTO();
action1.setName("testAction1");
action1.setActionConfiguration(new ActionConfiguration());
action1.getActionConfiguration().setBody("mockBody");
actionCollectionDTO1.setActions(List.of(action1));
actionCollectionDTO1.setPluginType(PluginType.JS);
return layoutCollectionService.createCollection(actionCollectionDTO1)
.then(layoutActionService.createSingleAction(action))
.flatMap(createdAction -> newActionService.findById(createdAction.getId(), READ_ACTIONS))
.flatMap(newAction -> newActionService.generateActionByViewMode(newAction, false))
.then(importExportApplicationService.exportApplicationById(testApp.getId()));
@ -360,6 +394,7 @@ public class ImportExportApplicationServiceTests {
Application exportedApp = applicationJson.getExportedApplication();
List<NewPage> pageList = applicationJson.getPageList();
List<NewAction> actionList = applicationJson.getActionList();
List<ActionCollection> actionCollectionList = applicationJson.getActionCollectionList();
List<Datasource> datasourceList = applicationJson.getDatasourceList();
NewPage defaultPage = pageList.get(0);
@ -367,7 +402,7 @@ public class ImportExportApplicationServiceTests {
assertThat(exportedApp.getName()).isEqualTo(testApplication.getName());
assertThat(exportedApp.getOrganizationId()).isNull();
assertThat(exportedApp.getPages()).isNull();
assertThat(exportedApp.getPolicies()).hasSize(0);
assertThat(pageList).hasSize(1);
@ -377,7 +412,10 @@ public class ImportExportApplicationServiceTests {
assertThat(defaultPage.getPolicies()).isEmpty();
assertThat(actionList.isEmpty()).isFalse();
NewAction validAction = actionList.get(0);
assertThat(actionList).hasSize(2);
NewAction validAction = actionList.get(0).getPluginType().equals(PluginType.JS) ?
actionList.get(1) :
actionList.get(0);
assertThat(validAction.getApplicationId()).isNull();
assertThat(validAction.getPluginId()).isEqualTo(installedPlugin.getPackageName());
assertThat(validAction.getPluginType()).isEqualTo(PluginType.API);
@ -388,6 +426,18 @@ public class ImportExportApplicationServiceTests {
assertThat(unpublishedAction.getPageId()).isEqualTo(defaultPage.getUnpublishedPage().getName());
assertThat(unpublishedAction.getDatasource().getPluginId()).isEqualTo(installedPlugin.getPackageName());
assertThat(actionCollectionList.isEmpty()).isFalse();
assertThat(actionCollectionList).hasSize(1);
final ActionCollection actionCollection = actionCollectionList.get(0);
assertThat(actionCollection.getApplicationId()).isNull();
assertThat(actionCollection.getOrganizationId()).isNull();
assertThat(actionCollection.getPolicies()).isNull();
assertThat(actionCollection.getId()).isNotNull();
assertThat(actionCollection.getUnpublishedCollection().getPluginType()).isEqualTo(PluginType.JS);
assertThat(actionCollection.getUnpublishedCollection().getPageId())
.isEqualTo(defaultPage.getUnpublishedPage().getName());
assertThat(actionCollection.getUnpublishedCollection().getPluginId()).isEqualTo(installedJsPlugin.getPackageName());
assertThat(datasourceList).hasSize(1);
Datasource datasource = datasourceList.get(0);
assertThat(datasource.getOrganizationId()).isNull();
@ -593,17 +643,19 @@ public class ImportExportApplicationServiceTests {
StepVerifier
.create(resultMono
.flatMap(application -> Mono.zip(
Mono.just(application),
datasourceService.findAllByOrganizationId(application.getOrganizationId(), MANAGE_DATASOURCES).collectList(),
getActionsInApplication(application).collectList(),
newPageService.findByApplicationId(application.getId(), MANAGE_PAGES, false).collectList()
Mono.just(application),
datasourceService.findAllByOrganizationId(application.getOrganizationId(), MANAGE_DATASOURCES).collectList(),
getActionsInApplication(application).collectList(),
newPageService.findByApplicationId(application.getId(), MANAGE_PAGES, false).collectList(),
actionCollectionService.findAllByApplicationIdAndViewMode(application.getId(), false, MANAGE_ACTIONS, null).collectList()
)))
.assertNext(tuple -> {
final Application application = tuple.getT1();
final List<Datasource> datasourceList = tuple.getT2();
final List<ActionDTO> actionDTOS = tuple.getT3();
final List<PageDTO> pageList = tuple.getT4();
final List<ActionCollection> actionCollectionList = tuple.getT5();
assertThat(application.getName()).isEqualTo("valid_application");
assertThat(application.getOrganizationId()).isNotNull();
assertThat(application.getPages()).hasSize(2);
@ -624,20 +676,25 @@ public class ImportExportApplicationServiceTests {
assertThat(auth.getUsername()).isNotNull();
}
});
assertThat(actionDTOS).isNotEmpty();
actionDTOS.forEach(actionDTO -> {
assertThat(actionDTO.getPageId()).isNotEqualTo(pageList.get(0).getName());
});
assertThat(actionCollectionList).isNotEmpty();
actionCollectionList.forEach(actionCollection -> {
assertThat(actionCollection.getUnpublishedCollection().getPageId()).isNotEqualTo(pageList.get(0).getName());
});
assertThat(pageList).hasSize(2);
ApplicationPage defaultAppPage = application.getPages()
.stream()
.filter(ApplicationPage::getIsDefault)
.findFirst()
.orElse(null);
.stream()
.filter(ApplicationPage::getIsDefault)
.findFirst()
.orElse(null);
assertThat(defaultAppPage).isNotNull();
PageDTO defaultPageDTO = pageList.stream()