fix: Return default page id instead of id in restore snapshot API (#23096)

## Description
The restore snapshot API returns the Application object that was
restored. In current implementation, it returns pages with `_id` as the
`id`. This creates problem when the Application is Git connected because
no page will be found with the _id and branch name. This PR fixes this
problem by replacing the `id` with the `defaultPageId`.

#### PR fixes following issue(s)
Fixes #22956
This commit is contained in:
Nayan 2023-05-12 15:18:12 +06:00 committed by GitHub
parent 2a9eb75f51
commit 15bc2d8e43
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 61 additions and 3 deletions

View File

@ -1,5 +1,6 @@
package com.appsmith.server.services;
import com.appsmith.server.helpers.ResponseUtils;
import com.appsmith.server.repositories.ApplicationSnapshotRepository;
import com.appsmith.server.services.ce.ApplicationSnapshotServiceCEImpl;
import com.appsmith.server.solutions.ApplicationPermission;
@ -12,7 +13,7 @@ import org.springframework.stereotype.Service;
@Service
public class ApplicationSnapshotServiceImpl extends ApplicationSnapshotServiceCEImpl implements ApplicationSnapshotService {
public ApplicationSnapshotServiceImpl(ApplicationSnapshotRepository applicationSnapshotRepository, ApplicationService applicationService, ImportExportApplicationService importExportApplicationService, ApplicationPermission applicationPermission, Gson gson) {
super(applicationSnapshotRepository, applicationService, importExportApplicationService, applicationPermission, gson);
public ApplicationSnapshotServiceImpl(ApplicationSnapshotRepository applicationSnapshotRepository, ApplicationService applicationService, ImportExportApplicationService importExportApplicationService, ApplicationPermission applicationPermission, Gson gson, ResponseUtils responseUtils) {
super(applicationSnapshotRepository, applicationService, importExportApplicationService, applicationPermission, gson, responseUtils);
}
}

View File

@ -7,6 +7,7 @@ import com.appsmith.server.domains.ApplicationSnapshot;
import com.appsmith.server.dtos.ApplicationJson;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.ResponseUtils;
import com.appsmith.server.repositories.ApplicationSnapshotRepository;
import com.appsmith.server.services.ApplicationService;
import com.appsmith.server.solutions.ApplicationPermission;
@ -29,6 +30,7 @@ public class ApplicationSnapshotServiceCEImpl implements ApplicationSnapshotServ
private final ImportExportApplicationService importExportApplicationService;
private final ApplicationPermission applicationPermission;
private final Gson gson;
private final ResponseUtils responseUtils;
private static final int MAX_SNAPSHOT_SIZE = 15*1024*1024; // 15 MB
@ -95,7 +97,8 @@ public class ApplicationSnapshotServiceCEImpl implements ApplicationSnapshotServ
.flatMap(application ->
applicationSnapshotRepository.deleteAllByApplicationId(application.getId())
.thenReturn(application)
);
)
.map(responseUtils::updateApplicationWithDefaultResources);
}
private Mono<String> getApplicationJsonStringFromSnapShot(String applicationId) {

View File

@ -3,6 +3,7 @@ package com.appsmith.server.services.ce;
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.constants.SerialiseApplicationObjective;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.ApplicationPage;
import com.appsmith.server.domains.ApplicationSnapshot;
import com.appsmith.server.domains.Layout;
import com.appsmith.server.domains.NewPage;
@ -31,6 +32,7 @@ import java.util.Random;
import static java.util.Arrays.copyOfRange;
import static org.assertj.core.api.Assertions.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.ArgumentMatchers.eq;
@ -144,6 +146,58 @@ public class ApplicationSnapshotServiceUnitTest {
.verifyComplete();
}
@Test
public void restoreSnapshot_WhenApplicationHasDefaultPageIds_IdReplacedWithDefaultPageId() {
String defaultAppId = "default-app-id",
branchedAppId = "branched-app-id",
workspaceId = "workspace-id",
branch = "development";
Application application = new Application();
application.setName("Snapshot test");
application.setWorkspaceId(workspaceId);
application.setId(branchedAppId);
ApplicationPage applicationPage = new ApplicationPage();
applicationPage.setId("original-page-id");
applicationPage.setDefaultPageId("default-page-id");
applicationPage.setSlug("original-page-slug");
applicationPage.setIsDefault(true);
application.setPages(List.of(applicationPage));
Mockito.when(applicationService.findByBranchNameAndDefaultApplicationId(branch, defaultAppId, AclPermission.MANAGE_APPLICATIONS))
.thenReturn(Mono.just(application));
ApplicationJson applicationJson = new ApplicationJson();
applicationJson.setExportedApplication(application);
String jsonString = gson.toJson(applicationJson);
byte[] jsonStringBytes = jsonString.getBytes(StandardCharsets.UTF_8);
List<ApplicationSnapshot> snapshots = List.of(
createSnapshot(branchedAppId, jsonStringBytes, 1)
);
Mockito.when(applicationSnapshotRepository.findByApplicationId(branchedAppId))
.thenReturn(Flux.fromIterable(snapshots));
Mockito.when(importExportApplicationService.importApplicationInWorkspace(eq(application.getWorkspaceId()), any(), eq(branchedAppId), eq(branch)))
.thenReturn(Mono.just(application));
Mockito.when(applicationSnapshotRepository.deleteAllByApplicationId(branchedAppId))
.thenReturn(Mono.just("application").then());
StepVerifier.create(applicationSnapshotService.restoreSnapshot(defaultAppId, branch))
.assertNext(application1 -> {
assertThat(application1.getName()).isEqualTo(application.getName());
application1.getPages().forEach(page -> {
assertThat(page.getId()).isEqualTo(page.getDefaultPageId());
});
})
.verifyComplete();
}
private ApplicationSnapshot createSnapshot(String applicationId, byte [] data, int chunkOrder) {
ApplicationSnapshot applicationSnapshot = new ApplicationSnapshot();
applicationSnapshot.setApplicationId(applicationId);