diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationPageServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationPageServiceImpl.java index c8cbdb93b1..b59d1bfe3d 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationPageServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ApplicationPageServiceImpl.java @@ -93,11 +93,18 @@ public class ApplicationPageServiceImpl implements ApplicationPageService { if (layoutList == null) { layoutList = new ArrayList<>(); } + if (layoutList.isEmpty()) { layoutList.add(newPageService.createDefaultLayout()); page.setLayouts(layoutList); } + for (final Layout layout : layoutList) { + if (StringUtils.isEmpty(layout.getId())) { + layout.setId(new ObjectId().toString()); + } + } + Mono applicationMono = applicationService.findById(page.getApplicationId(), AclPermission.MANAGE_APPLICATIONS) .switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.APPLICATION, page.getApplicationId()))) .cache(); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/NewPageServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/NewPageServiceImpl.java index 183fcf15ad..fabc926722 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/NewPageServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/NewPageServiceImpl.java @@ -31,8 +31,8 @@ import java.util.List; import java.util.Set; import java.util.stream.Collectors; -import static com.appsmith.server.acl.AclPermission.READ_PAGES; import static com.appsmith.external.helpers.BeanCopyUtils.copyNewFieldValuesIntoOldObject; +import static com.appsmith.server.acl.AclPermission.READ_PAGES; @Service @Slf4j diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/PageServiceTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/PageServiceTest.java index 149450dcad..ddca47c249 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/services/PageServiceTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/services/PageServiceTest.java @@ -6,6 +6,7 @@ import com.appsmith.external.plugins.PluginExecutor; import com.appsmith.server.constants.FieldName; import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Datasource; +import com.appsmith.server.domains.Layout; import com.appsmith.server.domains.NewAction; import com.appsmith.server.domains.Plugin; import com.appsmith.server.domains.User; @@ -17,6 +18,7 @@ import com.appsmith.server.helpers.MockPluginExecutor; import com.appsmith.server.helpers.PluginExecutorHelper; import com.appsmith.server.repositories.PluginRepository; import lombok.extern.slf4j.Slf4j; +import net.minidev.json.JSONObject; import net.minidev.json.parser.JSONParser; import net.minidev.json.parser.ParseException; import org.junit.After; @@ -34,6 +36,7 @@ import reactor.core.publisher.Mono; import reactor.test.StepVerifier; import java.util.List; +import java.util.Map; import java.util.Set; import java.util.UUID; @@ -161,6 +164,44 @@ public class PageServiceTest { .verifyComplete(); } + @Test + @WithUserDetails(value = "api_user") + public void createValidPageWithLayout() throws ParseException { + Policy managePagePolicy = Policy.builder().permission(MANAGE_PAGES.getValue()) + .users(Set.of("api_user")) + .build(); + Policy readPagePolicy = Policy.builder().permission(READ_PAGES.getValue()) + .users(Set.of("api_user")) + .build(); + + PageDTO testPage = new PageDTO(); + testPage.setName("PageServiceTest TestApp"); + setupTestApplication(); + testPage.setApplicationId(application.getId()); + + final Layout layout = new Layout(); + final JSONObject dsl = new JSONObject(Map.of("text", "{{ query1.data }}")); + layout.setDsl(dsl); + testPage.setLayouts(List.of(layout)); + + Mono pageMono = applicationPageService.createPage(testPage); + + StepVerifier + .create(pageMono) + .assertNext(page -> { + assertThat(page).isNotNull(); + assertThat(page.getId()).isNotNull(); + assertThat("PageServiceTest TestApp".equals(page.getName())); + + assertThat(page.getPolicies()).isNotEmpty(); + assertThat(page.getPolicies()).containsOnly(managePagePolicy, readPagePolicy); + + assertThat(page.getLayouts()).isNotEmpty(); + assertThat(page.getLayouts().get(0).getDsl()).isEqualTo(dsl); + }) + .verifyComplete(); + } + @Test @WithUserDetails(value = "api_user") public void validChangePageName() { @@ -317,4 +358,3 @@ public class PageServiceTest { } } - \ No newline at end of file