diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ce/PageControllerCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ce/PageControllerCE.java index 7028a21aa55..45500af3331 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ce/PageControllerCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/ce/PageControllerCE.java @@ -32,6 +32,9 @@ import org.springframework.web.bind.annotation.ResponseStatus; import reactor.core.publisher.Mono; +import java.util.List; +import java.util.Map; + @RequestMapping(Url.PAGE_URL) @RequiredArgsConstructor @Slf4j @@ -196,4 +199,15 @@ public Mono> getAllPages( .findApplicationPages(applicationId, pageId, branchName, mode) .map(resources -> new ResponseDTO<>(HttpStatus.OK.value(), resources, null)); } + + @JsonView(Views.Public.class) + @PutMapping("/{defaultPageId}/dependencyMap") + public Mono> updateDependencyMap( + @PathVariable String defaultPageId, + @RequestBody(required = false) Map> dependencyMap, + @RequestHeader(name = FieldName.BRANCH_NAME, required = false) String branchName) { + return newPageService + .updateDependencyMap(defaultPageId, dependencyMap, branchName) + .map(updatedResource -> new ResponseDTO<>(HttpStatus.OK.value(), updatedResource, null)); + } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/NewPage.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/NewPage.java index 3f668df6609..856b38498de 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/NewPage.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/NewPage.java @@ -47,6 +47,7 @@ public static class Fields extends BranchAwareDomain.Fields { public static String unpublishedPage_slug = unpublishedPage + "." + PageDTO.Fields.slug; public static String unpublishedPage_customSlug = unpublishedPage + "." + PageDTO.Fields.customSlug; public static String unpublishedPage_deletedAt = unpublishedPage + "." + PageDTO.Fields.deletedAt; + public static String unpublishedPage_dependencyMap = unpublishedPage + "." + PageDTO.Fields.dependencyMap; public static String publishedPage_layouts = publishedPage + "." + PageDTO.Fields.layouts; public static String publishedPage_name = publishedPage + "." + PageDTO.Fields.name; diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/PageDTO.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/PageDTO.java index 8b4b7921230..4afd5f4e1f8 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/PageDTO.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/PageDTO.java @@ -17,6 +17,7 @@ import java.time.Instant; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Set; @Getter @@ -77,7 +78,11 @@ public class PageDTO { @JsonView(Views.Public.class) DefaultResources defaultResources; + @JsonView(Views.Public.class) + Map> dependencyMap; + public void sanitiseToExportDBObject() { + this.setDependencyMap(null); this.getLayouts().forEach(Layout::sanitiseToExportDBObject); } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCE.java index 4ff02f8620a..2423ea5b1cd 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCE.java @@ -14,6 +14,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Optional; public interface NewPageServiceCE extends CrudService { @@ -98,4 +99,6 @@ Mono findByGitSyncIdAndDefaultApplicationId( Mono createApplicationPagesDTO( Application branchedApplication, List newPages, boolean viewMode, boolean isRecentlyAccessed); + + Mono updateDependencyMap(String pageId, Map> dependencyMap, String branchName); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCEImpl.java index fc3bd101e38..baf462f4b70 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/newpages/base/NewPageServiceCEImpl.java @@ -584,10 +584,9 @@ public Mono findBranchedPageId(String branchName, String defaultPageId, return Mono.just(defaultPageId); } return repository - .findPageByBranchNameAndDefaultPageId(branchName, defaultPageId, permission) + .findBranchedPageId(branchName, defaultPageId, permission) .switchIfEmpty(Mono.error(new AppsmithException( - AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE_ID, defaultPageId + ", " + branchName))) - .map(NewPage::getId); + AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE_ID, defaultPageId + ", " + branchName))); } @Override @@ -670,4 +669,22 @@ public Mono findApplicationPages( public Mono publishPages(Collection pageIds, AclPermission permission) { return repository.publishPages(pageIds, permission); } + + @Override + public Mono updateDependencyMap(String pageId, Map> dependencyMap, String branchName) { + Mono updateResult; + if (branchName != null) { + updateResult = findBranchedPageId(branchName, pageId, AclPermission.MANAGE_PAGES) + .flatMap(branchPageId -> repository.updateDependencyMap(branchPageId, dependencyMap)); + } else { + updateResult = repository.updateDependencyMap(pageId, dependencyMap); + } + + return updateResult.flatMap(count -> { + if (count == 0) { + return Mono.error(new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE, pageId)); + } + return Mono.just(count.toString()); + }); + } } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCE.java index ec442ee2046..b2ff7c65f2c 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCE.java @@ -8,6 +8,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Optional; public interface CustomNewPageRepositoryCE extends AppsmithRepository { @@ -42,4 +43,8 @@ Mono findByGitSyncIdAndDefaultApplicationId( Mono publishPages(Collection pageIds, AclPermission permission); Flux findAllByApplicationIdsWithoutPermission(List applicationIds, List includeFields); + + Mono findBranchedPageId(String branchName, String defaultPageId, AclPermission permission); + + Mono updateDependencyMap(String pageId, Map> dependencyMap); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCEImpl.java index 6bf66e0b6be..5ae6802aec4 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomNewPageRepositoryCEImpl.java @@ -7,6 +7,7 @@ import com.appsmith.server.dtos.PageDTO; import com.appsmith.server.helpers.ce.bridge.Bridge; import com.appsmith.server.helpers.ce.bridge.BridgeQuery; +import com.appsmith.server.helpers.ce.bridge.BridgeUpdate; import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -21,6 +22,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.Set; @@ -160,6 +162,20 @@ public Mono findPageByBranchNameAndDefaultPageId( return queryBuilder().criteria(q).permission(permission).one(); } + public Mono findBranchedPageId(String branchName, String defaultPageId, AclPermission permission) { + final BridgeQuery q = + // defaultPageIdCriteria + Bridge.equal(NewPage.Fields.defaultResources_pageId, defaultPageId); + q.equal(NewPage.Fields.defaultResources_branchName, branchName); + + return queryBuilder() + .criteria(q) + .permission(permission) + .fields("id") + .one() + .map(NewPage::getId); + } + @Override public Flux findSlugsByApplicationIds(List applicationIds, AclPermission aclPermission) { return queryBuilder() @@ -238,4 +254,13 @@ public Flux findAllByApplicationIdsWithoutPermission( .fields(includeFields) .all(); } + + @Override + public Mono updateDependencyMap(String pageId, Map> dependencyMap) { + final BridgeQuery q = Bridge.equal(NewPage.Fields.id, pageId); + + BridgeUpdate update = Bridge.update(); + update.set(NewPage.Fields.unpublishedPage_dependencyMap, dependencyMap); + return queryBuilder().criteria(q).updateFirst(update); + } } diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/NewPageServiceTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/NewPageServiceTest.java index c0dc3487112..d8485fb0531 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/NewPageServiceTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/NewPageServiceTest.java @@ -33,8 +33,10 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.UUID; import java.util.function.Function; @@ -406,4 +408,108 @@ public void verifyCreateApplicationPagesDTO_ReturnsRightNumberOfPages_BasedOnVie .isEqualTo(AppsmithError.ACL_NO_RESOURCE_FOUND.getAppErrorCode()); }); } + + @Test + @WithUserDetails("api_user") + public void updateDependencyMap_NotNullValue_shouldUpdateDependencyMap() { + String randomId = UUID.randomUUID().toString(); + Application application = new Application(); + application.setName("app_" + randomId); + Mono newPageMono = applicationPageService + .createApplication(application, workspaceId) + .flatMap(application1 -> { + PageDTO pageDTO = new PageDTO(); + pageDTO.setName("page_" + randomId); + pageDTO.setApplicationId(application1.getId()); + return applicationPageService.createPage(pageDTO); + }) + .flatMap(pageDTO -> { + Map> dependencyMap = new HashMap<>(); + dependencyMap.put("key", List.of("val1", "val2")); + dependencyMap.put("key1", List.of("val1", "val2")); + dependencyMap.put("key2", List.of("val1", "val2")); + dependencyMap.put("key3", List.of("val1", "val2")); + return newPageService + .updateDependencyMap(pageDTO.getId(), dependencyMap, null) + .then(newPageService.findById(pageDTO.getId(), Optional.empty())); + }); + + StepVerifier.create(newPageMono) + .assertNext(newPage -> { + assertThat(newPage.getUnpublishedPage().getDependencyMap()).isNotNull(); + assertThat(newPage.getUnpublishedPage().getDependencyMap().size()) + .isEqualTo(4); + assertThat(newPage.getUnpublishedPage().getDependencyMap().get("key")) + .isEqualTo(List.of("val1", "val2")); + }) + .verifyComplete(); + } + + @Test + @WithUserDetails("api_user") + public void updateDependencyMap_NotNullValueAndPublishApplication_shouldUpdateDependencyMap() { + String randomId = UUID.randomUUID().toString(); + Application application = new Application(); + application.setName("app_" + randomId); + Mono newPageMono = applicationPageService + .createApplication(application, workspaceId) + .flatMap(application1 -> { + PageDTO pageDTO = new PageDTO(); + pageDTO.setName("page_" + randomId); + pageDTO.setApplicationId(application1.getId()); + return applicationPageService.createPage(pageDTO); + }) + .flatMap(pageDTO -> { + Map> dependencyMap = new HashMap<>(); + dependencyMap.put("key", List.of("val1", "val2")); + dependencyMap.put("key1", List.of("val1", "val2")); + dependencyMap.put("key2", List.of("val1", "val2")); + dependencyMap.put("key3", List.of("val1", "val2")); + return newPageService + .updateDependencyMap(pageDTO.getId(), dependencyMap, null) + .flatMap(page -> applicationPageService.publish(application.getId(), null, false)) + .then(newPageService.findById(pageDTO.getId(), Optional.empty())); + }); + + StepVerifier.create(newPageMono) + .assertNext(newPage -> { + assertThat(newPage.getUnpublishedPage().getDependencyMap()).isNotNull(); + assertThat(newPage.getUnpublishedPage().getDependencyMap().size()) + .isEqualTo(4); + assertThat(newPage.getUnpublishedPage().getDependencyMap().get("key")) + .isEqualTo(List.of("val1", "val2")); + + assertThat(newPage.getPublishedPage().getDependencyMap()).isNotNull(); + assertThat(newPage.getPublishedPage().getDependencyMap().size()) + .isEqualTo(4); + assertThat(newPage.getPublishedPage().getDependencyMap().get("key")) + .isEqualTo(List.of("val1", "val2")); + }) + .verifyComplete(); + } + + @Test + @WithUserDetails("api_user") + public void updateDependencyMap_nullValue_shouldUpdateDependencyMap() { + String randomId = UUID.randomUUID().toString(); + Application application = new Application(); + application.setName("app_" + randomId); + Mono newPageMono = applicationPageService + .createApplication(application, workspaceId) + .flatMap(application1 -> { + PageDTO pageDTO = new PageDTO(); + pageDTO.setName("page_" + randomId); + pageDTO.setApplicationId(application1.getId()); + return applicationPageService.createPage(pageDTO); + }) + .flatMap(pageDTO -> newPageService + .updateDependencyMap(pageDTO.getId(), null, null) + .then(newPageService.findById(pageDTO.getId(), Optional.empty()))); + + StepVerifier.create(newPageMono) + .assertNext(newPage -> { + assertThat(newPage.getUnpublishedPage().getDependencyMap()).isNull(); + }) + .verifyComplete(); + } }