diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/helpers/GitFileUtils.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/helpers/GitFileUtils.java index cca0f20f08..21927e88a0 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/helpers/GitFileUtils.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/helpers/GitFileUtils.java @@ -258,6 +258,7 @@ public class GitFileUtils { // Don't commit application name as while importing we are using the repoName as application name application.setName(null); application.setPublishedPages(null); + application.setIsPublic(null); application.setSlug(null); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCE.java index dd8bc17df1..808aa5fb3b 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCE.java @@ -34,7 +34,7 @@ public interface CustomApplicationRepositoryCE extends AppsmithRepository getApplicationByGitBranchAndDefaultApplicationId(String defaultApplicationId, String branchName, AclPermission aclPermission); - Flux getApplicationByGitDefaultApplicationId(String defaultApplicationId); + Flux getApplicationByGitDefaultApplicationId(String defaultApplicationId, AclPermission permission); Mono> getAllApplicationId(String organizationId); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCEImpl.java index f866785ff3..11277302dd 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomApplicationRepositoryCEImpl.java @@ -139,12 +139,12 @@ public class CustomApplicationRepositoryCEImpl extends BaseAppsmithRepositoryImp } @Override - public Flux getApplicationByGitDefaultApplicationId(String defaultApplicationId) { + public Flux getApplicationByGitDefaultApplicationId(String defaultApplicationId, AclPermission permission) { String gitApplicationMetadata = fieldName(QApplication.application.gitApplicationMetadata); Criteria applicationIdCriteria = where(gitApplicationMetadata + "." + fieldName(QApplication.application.gitApplicationMetadata.defaultApplicationId)).is(defaultApplicationId); Criteria deletionCriteria = where(fieldName(QApplication.application.deleted)).ne(true); - return queryAll(List.of(applicationIdCriteria, deletionCriteria), AclPermission.MANAGE_APPLICATIONS); + return queryAll(List.of(applicationIdCriteria, deletionCriteria), permission); } /** diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationPageServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationPageServiceCEImpl.java index f5469c66b9..b88a257608 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationPageServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationPageServiceCEImpl.java @@ -400,7 +400,7 @@ public class ApplicationPageServiceCEImpl implements ApplicationPageServiceCE { // Delete git repo from local and delete the applications from DB return gitFileUtils.detachRemote(repoPath) .flatMapMany(isCleared -> applicationService - .findAllApplicationsByDefaultApplicationId(gitData.getDefaultApplicationId())); + .findAllApplicationsByDefaultApplicationId(gitData.getDefaultApplicationId(), MANAGE_APPLICATIONS)); } return Flux.fromIterable(List.of(application)); }) diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCE.java index befa831434..c7791a4002 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCE.java @@ -55,7 +55,7 @@ public interface ApplicationServiceCE extends CrudService { Mono findBranchedApplicationId(String branchName, String defaultApplicationId, AclPermission permission); - Flux findAllApplicationsByDefaultApplicationId(String defaultApplicationId); + Flux findAllApplicationsByDefaultApplicationId(String defaultApplicationId, AclPermission permission); Mono getGitConnectedApplicationsCountWithPrivateRepoByOrgId(String organizationId); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCEImpl.java index 586fd4bafa..7470cbd85f 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/ApplicationServiceCEImpl.java @@ -266,9 +266,12 @@ public class ApplicationServiceCEImpl extends BaseService changeViewAccess(String defaultApplicationId, String branchName, ApplicationAccessDTO applicationAccessDTO) { - return this.findByBranchNameAndDefaultApplicationId(branchName, defaultApplicationId, MAKE_PUBLIC_APPLICATIONS) + // For git connected application update the policy for all the branch's + return findAllApplicationsByDefaultApplicationId(defaultApplicationId, MAKE_PUBLIC_APPLICATIONS) + .switchIfEmpty(this.findByBranchNameAndDefaultApplicationId(branchName, defaultApplicationId, MAKE_PUBLIC_APPLICATIONS)) .flatMap(branchedApplication -> changeViewAccess(branchedApplication.getId(), applicationAccessDTO)) - .map(responseUtils::updateApplicationWithDefaultResources); + .then(repository.findById(defaultApplicationId, MAKE_PUBLIC_APPLICATIONS) + .map(responseUtils::updateApplicationWithDefaultResources)); } @Override @@ -535,8 +538,8 @@ public class ApplicationServiceCEImpl extends BaseService findAllApplicationsByDefaultApplicationId(String defaultApplicationId) { - return repository.getApplicationByGitDefaultApplicationId(defaultApplicationId); + public Flux findAllApplicationsByDefaultApplicationId(String defaultApplicationId, AclPermission permission) { + return repository.getApplicationByGitDefaultApplicationId(defaultApplicationId, permission); } @Override diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ImportExportApplicationServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ImportExportApplicationServiceCEImpl.java index 3e8bb15f7b..22cf4f0753 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ImportExportApplicationServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/solutions/ce/ImportExportApplicationServiceCEImpl.java @@ -672,7 +672,8 @@ public class ImportExportApplicationServiceCEImpl implements ImportExportApplica // 1. Assign the policies for the imported application // 2. Check for possible duplicate names, // 3. Save the updated application - applicationPageService.setApplicationPolicies(currUserMono, organizationId, importedApplication) + + Mono.just(importedApplication) .zipWith(currUserMono) .map(objects -> { Application application = objects.getT1(); @@ -698,28 +699,37 @@ public class ImportExportApplicationServiceCEImpl implements ImportExportApplica // the changes from remote // We are using the save instead of update as we are using @Encrypted // for GitAuth - return applicationService.save(existingApplication) - .onErrorResume(DuplicateKeyException.class, error -> { - if (error.getMessage() != null) { - return applicationPageService - .createOrUpdateSuffixedApplication( - existingApplication, - existingApplication.getName(), - 0 - ); - } - throw error; + return applicationService.findById(existingApplication.getGitApplicationMetadata().getDefaultApplicationId()) + .flatMap(application1 -> { + // Set the policies from the defaultApplication + existingApplication.setPolicies(application1.getPolicies()); + importedApplication.setPolicies(application1.getPolicies()); + return applicationService.save(existingApplication) + .onErrorResume(DuplicateKeyException.class, error -> { + if (error.getMessage() != null) { + return applicationPageService + .createOrUpdateSuffixedApplication( + existingApplication, + existingApplication.getName(), + 0 + ); + } + throw error; + }); }); }); } + Mono applicationMono = applicationPageService.setApplicationPolicies(currUserMono, organizationId, importedApplication); return applicationService .findByOrganizationId(organizationId, MANAGE_APPLICATIONS) .collectList() - .flatMap(applicationList -> { - + .zipWith(applicationMono) + .flatMap(objects -> { + Application application1 = objects.getT2(); + List applicationList = objects.getT1(); Application duplicateNameApp = applicationList .stream() - .filter(application1 -> StringUtils.equals(application1.getName(), application.getName())) + .filter(application2 -> StringUtils.equals(application2.getName(), application1.getName())) .findAny() .orElse(null); diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ApplicationServiceTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ApplicationServiceTest.java index cd3880ea96..1735820efd 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ApplicationServiceTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/ApplicationServiceTest.java @@ -792,6 +792,16 @@ public class ApplicationServiceTest { ApplicationAccessDTO applicationAccessDTO = new ApplicationAccessDTO(); applicationAccessDTO.setPublicAccess(true); + // Create a branch + Application testApplication = new Application(); + testApplication.setName("branch1"); + testApplication.setOrganizationId(orgId); + GitApplicationMetadata gitApplicationMetadata = new GitApplicationMetadata(); + gitApplicationMetadata.setDefaultApplicationId(gitConnectedApp.getId()); + gitApplicationMetadata.setBranchName("test"); + testApplication.setGitApplicationMetadata(gitApplicationMetadata); + Application application = applicationPageService.createApplication(testApplication).block(); + Mono publicAppMono = applicationService .changeViewAccess(gitConnectedApp.getId(), "testBranch", applicationAccessDTO) .cache(); @@ -815,6 +825,15 @@ public class ApplicationServiceTest { assertThat(page.getPolicies()).containsAll(Set.of(managePagePolicy, readPagePolicy)); }) .verifyComplete(); + + // Get branch application + Mono branchApplicationMono = applicationService.findById(application.getId()); + StepVerifier + .create(branchApplicationMono) + .assertNext(branchApplication -> { + assertThat(branchApplication.getPolicies()).containsAll(Set.of(manageAppPolicy, readAppPolicy)); + }) + .verifyComplete(); } @Test @@ -834,13 +853,23 @@ public class ApplicationServiceTest { .users(Set.of("api_user")) .build(); + // Create a branch + Application testApplication = new Application(); + testApplication.setName("branch2"); + testApplication.setOrganizationId(orgId); + GitApplicationMetadata gitApplicationMetadata = new GitApplicationMetadata(); + gitApplicationMetadata.setDefaultApplicationId(gitConnectedApp.getId()); + gitApplicationMetadata.setBranchName("test2"); + testApplication.setGitApplicationMetadata(gitApplicationMetadata); + Application application = applicationPageService.createApplication(testApplication).block(); + ApplicationAccessDTO applicationAccessDTO = new ApplicationAccessDTO(); applicationAccessDTO.setPublicAccess(true); Mono privateAppMono = applicationService.changeViewAccess(gitConnectedApp.getId(), "testBranch", applicationAccessDTO) .flatMap(application1 -> { applicationAccessDTO.setPublicAccess(false); - return applicationService.changeViewAccess(application1.getId(), applicationAccessDTO); + return applicationService.changeViewAccess(application1.getId(), "testBranch", applicationAccessDTO); }) .cache(); @@ -863,6 +892,16 @@ public class ApplicationServiceTest { assertThat(page.getPolicies()).containsAll(Set.of(managePagePolicy, readPagePolicy)); }) .verifyComplete(); + + // Get branch application + Mono branchApplicationMono = applicationService.findById(application.getId()); + StepVerifier + .create(branchApplicationMono) + .assertNext(branchApplication -> { + assertThat(branchApplication.getIsPublic()).isFalse(); + assertThat(branchApplication.getPolicies()).containsAll(Set.of(readAppPolicy, manageAppPolicy)); + }) + .verifyComplete(); } @Test @@ -1027,7 +1066,7 @@ public class ApplicationServiceTest { assertThat(clonedPageList).isNotEmpty(); for (PageDTO page : clonedPageList) { - assertThat(page.getPolicies()).containsAll(Set.of(managePagePolicy, readPagePolicy)); + assertThat(page.getPolicies()).containsAll(Set.of(readPagePolicy, managePagePolicy)); assertThat(page.getApplicationId()).isEqualTo(clonedApplication.getId()); } }) @@ -1176,7 +1215,7 @@ public class ApplicationServiceTest { assertThat(clonedActionList).isNotEmpty(); assertThat(defaultClonedActionIdsFromDb).isNotEmpty(); for (NewAction newAction : clonedActionList) { - assertThat(newAction.getPolicies()).containsAll(Set.of(manageActionPolicy, readActionPolicy, executeActionPolicy)); + assertThat(newAction.getPolicies()).containsAll(Set.of(readActionPolicy, executeActionPolicy, manageActionPolicy)); assertThat(newAction.getApplicationId()).isEqualTo(clonedApplication.getId()); assertThat(newAction.getUnpublishedAction().getPageId()).isEqualTo(newAction.getUnpublishedAction().getDefaultResources().getPageId()); } diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ImportExportApplicationServiceTests.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ImportExportApplicationServiceTests.java index f91555b375..501bb77aec 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ImportExportApplicationServiceTests.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/solutions/ImportExportApplicationServiceTests.java @@ -38,6 +38,7 @@ import com.appsmith.server.repositories.PluginRepository; import com.appsmith.server.repositories.ThemeRepository; 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; @@ -159,6 +160,9 @@ public class ImportExportApplicationServiceTests { @Autowired ThemeService themeService; + @Autowired + ApplicationService applicationService; + private static final String INVALID_JSON_FILE = "invalid json file"; private static Plugin installedPlugin; private static String orgId; @@ -1101,7 +1105,11 @@ public class ImportExportApplicationServiceTests { gitData.setBranchName("testBranch"); testApplication.setGitApplicationMetadata(gitData); - Application savedApplication = applicationPageService.createApplication(testApplication, orgId).block(); + Application savedApplication = applicationPageService.createApplication(testApplication, orgId) + .flatMap(application1 -> { + application1.getGitApplicationMetadata().setDefaultApplicationId(application1.getId()); + return applicationService.save(application1); + }).block(); Mono result = newPageService.findNewPagesByApplicationId(savedApplication.getId(), READ_PAGES).collectList() .flatMap(newPages -> { @@ -1259,7 +1267,11 @@ public class ImportExportApplicationServiceTests { gitData.setBranchName("master"); testApplication.setGitApplicationMetadata(gitData); - Application application = applicationPageService.createApplication(testApplication, orgId).block(); + Application application = applicationPageService.createApplication(testApplication, orgId) + .flatMap(application1 -> { + application1.getGitApplicationMetadata().setDefaultApplicationId(application1.getId()); + return applicationService.save(application1); + }).block(); String gitSyncIdBeforeImport = newPageService.findById(application.getPages().get(0).getId(), MANAGE_PAGES).block().getGitSyncId(); PageDTO page = new PageDTO(); @@ -1319,7 +1331,11 @@ public class ImportExportApplicationServiceTests { gitData.setBranchName("master"); testApplication.setGitApplicationMetadata(gitData); - Application application = applicationPageService.createApplication(testApplication, orgId).block(); + Application application = applicationPageService.createApplication(testApplication, orgId) + .flatMap(application1 -> { + application1.getGitApplicationMetadata().setDefaultApplicationId(application1.getId()); + return applicationService.save(application1); + }).block(); String gitSyncIdBeforeImport = newPageService.findById(application.getPages().get(0).getId(), MANAGE_PAGES).block().getGitSyncId(); @@ -1434,10 +1450,19 @@ public class ImportExportApplicationServiceTests { final Mono resultMonoWithDiscardOperation = resultMonoWithoutDiscardOperation .flatMap(importedApplication -> applicationJsonMono - .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") - ) + .flatMap(applicationJson -> + { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } + ) ); StepVerifier @@ -1519,9 +1544,17 @@ public class ImportExportApplicationServiceTests { final Mono resultMonoWithDiscardOperation = resultMonoWithoutDiscardOperation .flatMap(importedApplication -> applicationJsonMono - .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") + .flatMap(applicationJson -> { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } ) ); @@ -1612,8 +1645,17 @@ public class ImportExportApplicationServiceTests { .flatMap(importedApplication -> applicationJsonMono .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") + { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } ) ); @@ -1694,8 +1736,17 @@ public class ImportExportApplicationServiceTests { .flatMap(importedApplication -> applicationJsonMono .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") + { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } ) ); @@ -1771,8 +1822,17 @@ public class ImportExportApplicationServiceTests { .flatMap(importedApplication -> applicationJsonMono .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") + { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } ) ); @@ -1849,8 +1909,17 @@ public class ImportExportApplicationServiceTests { .flatMap(importedApplication -> applicationJsonMono .flatMap(applicationJson -> - importExportApplicationService - .importApplicationInOrganization(importedApplication.getOrganizationId(), applicationJson, importedApplication.getId(), "main") + { + importedApplication.setGitApplicationMetadata(new GitApplicationMetadata()); + importedApplication.getGitApplicationMetadata().setDefaultApplicationId(importedApplication.getId()); + return applicationService.save(importedApplication) + .then(importExportApplicationService.importApplicationInOrganization( + importedApplication.getOrganizationId(), + applicationJson, + importedApplication.getId(), + "main") + ); + } ) );