From cf2269df081944eb706932e7ec15859bedb89cb4 Mon Sep 17 00:00:00 2001 From: Anagh Hegde Date: Wed, 8 May 2024 20:17:03 +0530 Subject: [PATCH 1/5] Add API for storing dependencyMap in page object --- .../controllers/ce/PageControllerCE.java | 14 +++++++++++ .../com/appsmith/server/domains/NewPage.java | 1 + .../com/appsmith/server/dtos/PageDTO.java | 4 ++++ .../newpages/base/NewPageServiceCE.java | 3 +++ .../newpages/base/NewPageServiceCEImpl.java | 23 ++++++++++++++++--- .../ce/CustomNewPageRepositoryCE.java | 5 ++++ .../ce/CustomNewPageRepositoryCEImpl.java | 23 +++++++++++++++++++ 7 files changed, 70 insertions(+), 3 deletions(-) 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..4b1dbde98c6 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 @Valid 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..a8b0c9e9488 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,6 +78,9 @@ public class PageDTO { @JsonView(Views.Public.class) DefaultResources defaultResources; + @JsonView(Views.Public.class) + Map> dependencyMap; + public void sanitiseToExportDBObject() { 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 b2d23d65a63..550ba47e637 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 @@ -13,6 +13,7 @@ import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.Optional; public interface NewPageServiceCE extends CrudService { @@ -90,4 +91,6 @@ Mono findByGitSyncIdAndDefaultApplicationId( Flux findPageSlugsByApplicationIds(List applicationIds, AclPermission aclPermission); Mono publishPages(Collection pageIds, AclPermission permission); + + 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 d0792317105..4a8ee0e0f2b 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 @@ -549,10 +549,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 @@ -635,4 +634,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..897a5fa2fc8 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 @@ -15,12 +15,14 @@ import org.springframework.data.mongodb.core.aggregation.AggregationOperation; import org.springframework.data.mongodb.core.aggregation.Fields; import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Update; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; 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,11 @@ public Flux findAllByApplicationIdsWithoutPermission( .fields(includeFields) .all(); } + + @Override + public Mono updateDependencyMap(String pageId, Map> dependencyMap) { + Criteria pageCriteria = where(NewPage.Fields.id).is(pageId); + Update update = new Update().set(NewPage.Fields.unpublishedPage_dependencyMap, dependencyMap); + return queryBuilder().criteria(pageCriteria).updateFirst(update); + } } From bec496f11f734a62871e4c2d489672efc1d3e130 Mon Sep 17 00:00:00 2001 From: Anagh Hegde Date: Fri, 10 May 2024 16:46:22 +0530 Subject: [PATCH 2/5] add tests --- .../server/services/NewPageServiceTest.java | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) 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 9934086e3d9..8590ae00b64 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 @@ -30,7 +30,9 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -313,4 +315,108 @@ public void publishPages_WhenUserDoesNotHavePermissionOnPages_NotPublished() { }) .verifyComplete(); } + + @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.getById(pageDTO.getId())); + }); + + 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.getById(pageDTO.getId())); + }); + + 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.getById(pageDTO.getId()))); + + StepVerifier.create(newPageMono) + .assertNext(newPage -> { + assertThat(newPage.getUnpublishedPage().getDependencyMap()).isNull(); + }) + .verifyComplete(); + } } From 98ee8a29d88cfc1b5d4f4dd9ee20e709eb4a0476 Mon Sep 17 00:00:00 2001 From: Anagh Hegde Date: Mon, 13 May 2024 11:51:55 +0530 Subject: [PATCH 3/5] make dependencyMap optional --- .../com/appsmith/server/controllers/ce/PageControllerCE.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 4b1dbde98c6..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 @@ -204,7 +204,7 @@ public Mono> getAllPages( @PutMapping("/{defaultPageId}/dependencyMap") public Mono> updateDependencyMap( @PathVariable String defaultPageId, - @RequestBody @Valid Map> dependencyMap, + @RequestBody(required = false) Map> dependencyMap, @RequestHeader(name = FieldName.BRANCH_NAME, required = false) String branchName) { return newPageService .updateDependencyMap(defaultPageId, dependencyMap, branchName) From 6180f98d6fa8df50db4395483080e0450b527b0b Mon Sep 17 00:00:00 2001 From: Anagh Hegde Date: Fri, 17 May 2024 15:48:59 +0530 Subject: [PATCH 4/5] use bridge query --- .../repositories/ce/CustomNewPageRepositoryCEImpl.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 897a5fa2fc8..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; @@ -15,7 +16,6 @@ import org.springframework.data.mongodb.core.aggregation.AggregationOperation; import org.springframework.data.mongodb.core.aggregation.Fields; import org.springframework.data.mongodb.core.query.Criteria; -import org.springframework.data.mongodb.core.query.Update; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import reactor.core.scheduler.Schedulers; @@ -257,8 +257,10 @@ public Flux findAllByApplicationIdsWithoutPermission( @Override public Mono updateDependencyMap(String pageId, Map> dependencyMap) { - Criteria pageCriteria = where(NewPage.Fields.id).is(pageId); - Update update = new Update().set(NewPage.Fields.unpublishedPage_dependencyMap, dependencyMap); - return queryBuilder().criteria(pageCriteria).updateFirst(update); + 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); } } From 03e9f01bec1203feb1278118f2286fc66cc548bd Mon Sep 17 00:00:00 2001 From: Anagh Hegde Date: Mon, 27 May 2024 15:44:54 +0530 Subject: [PATCH 5/5] add sanitisation for git --- .../src/main/java/com/appsmith/server/dtos/PageDTO.java | 1 + 1 file changed, 1 insertion(+) 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 a8b0c9e9488..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 @@ -82,6 +82,7 @@ public class PageDTO { Map> dependencyMap; public void sanitiseToExportDBObject() { + this.setDependencyMap(null); this.getLayouts().forEach(Layout::sanitiseToExportDBObject); } }