Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -1004,7 +1004,7 @@ public Flux<ActionDTO> getUnpublishedActions(
Mono<NewPage> branchedPageMono = !StringUtils.hasLength(params.getFirst(FieldName.PAGE_ID))
? Mono.just(new NewPage())
: newPageService.findByBranchNameAndBasePageId(
branchName, params.getFirst(FieldName.PAGE_ID), pagePermission.getReadPermission());
branchName, params.getFirst(FieldName.PAGE_ID), pagePermission.getReadPermission(), null);
Comment thread
subrata71 marked this conversation as resolved.
Mono<Application> branchedApplicationMono = !StringUtils.hasLength(params.getFirst(FieldName.APPLICATION_ID))
? Mono.just(new Application())
: applicationService.findByBranchNameAndBaseApplicationId(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@ public interface NewPageServiceCE extends CrudService<NewPage, String> {
Flux<NewPage> findNewPagesByApplicationId(
String applicationId, AclPermission permission, List<String> includeFields);

Mono<NewPage> findByIdAndBranchName(String id, String branchName);

Mono<PageDTO> saveUnpublishedPage(PageDTO page);

Mono<PageDTO> createDefault(PageDTO object);
Expand Down Expand Up @@ -71,7 +69,8 @@ Mono<PageDTO> findByNameAndApplicationIdAndViewMode(

Mono<String> getNameByPageId(String pageId, boolean isPublishedName);

Mono<NewPage> findByBranchNameAndBasePageId(String branchName, String defaultPageId, AclPermission permission);
Mono<NewPage> findByBranchNameAndBasePageId(
Comment thread
subrata71 marked this conversation as resolved.
String branchName, String defaultPageId, AclPermission permission, List<String> projectedFieldNames);

Mono<NewPage> findByBranchNameAndBasePageIdAndApplicationMode(
String branchName, String basePageId, ApplicationMode mode);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -136,11 +136,6 @@ public Flux<PageDTO> findByApplicationId(String applicationId, AclPermission per
return findNewPagesByApplicationId(applicationId, permission).flatMap(page -> getPageByViewMode(page, view));
}

@Override
public Mono<NewPage> findByIdAndBranchName(String id, String branchName) {
return this.findByBranchNameAndBasePageId(branchName, id, pagePermission.getReadPermission());
}

@Override
public Mono<PageDTO> saveUnpublishedPage(PageDTO page) {

Expand Down Expand Up @@ -511,19 +506,21 @@ public Mono<String> getNameByPageId(String pageId, boolean isPublishedName) {
}

@Override
public Mono<NewPage> findByBranchNameAndBasePageId(String branchName, String basePageId, AclPermission permission) {
public Mono<NewPage> findByBranchNameAndBasePageId(
Comment thread
sneha122 marked this conversation as resolved.
String branchName, String basePageId, AclPermission permission, List<String> projectedFieldNames) {

if (!StringUtils.hasText(basePageId)) {
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.PAGE_ID));
} else if (!StringUtils.hasText(branchName)) {
return this.findById(basePageId, permission)
return repository
Comment thread
NilanshBansal marked this conversation as resolved.
.findById(basePageId, permission, projectedFieldNames)
.name(GET_PAGE_WITHOUT_BRANCH)
.tap(Micrometer.observation(observationRegistry))
.switchIfEmpty(Mono.error(
new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE, basePageId)));
}
return repository
.findPageByBranchNameAndBasePageId(branchName, basePageId, permission)
.findPageByBranchNameAndBasePageId(branchName, basePageId, permission, projectedFieldNames)
.name(GET_PAGE_WITH_BRANCH)
.tap(Micrometer.observation(observationRegistry))
.switchIfEmpty(Mono.error(new AppsmithException(
Expand All @@ -541,7 +538,8 @@ public Mono<NewPage> findByBranchNameAndBasePageIdAndApplicationMode(
permission = pagePermission.getReadPermission();
}

return this.findByBranchNameAndBasePageId(branchName, basePageId, permission)
return this.findByBranchNameAndBasePageId(
branchName, basePageId, permission, List.of(NewPage.Fields.id, NewPage.Fields.applicationId))
.name(getQualifiedSpanName(GET_PAGE, mode))
.tap(Micrometer.observation(observationRegistry));
}
Expand All @@ -556,7 +554,7 @@ public Mono<String> findBranchedPageId(String branchName, String basePageId, Acl
return Mono.just(basePageId);
}
return repository
.findPageByBranchNameAndBasePageId(branchName, basePageId, permission)
.findPageByBranchNameAndBasePageId(branchName, basePageId, permission, null)
.switchIfEmpty(Mono.error(new AppsmithException(
AppsmithError.NO_RESOURCE_FOUND, FieldName.PAGE_ID, basePageId + ", " + branchName)))
.map(NewPage::getId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@

public interface CustomNewPageRepositoryCE extends AppsmithRepository<NewPage> {

Mono<NewPage> findById(String id, AclPermission permission, List<String> projectedFields);

Flux<NewPage> findByApplicationId(String applicationId, AclPermission aclPermission);

Flux<NewPage> findByApplicationId(String applicationId, AclPermission aclPermission, List<String> includeFields);
Expand All @@ -30,7 +32,8 @@ Mono<NewPage> findByNameAndApplicationIdAndViewMode(

Mono<String> getNameByPageId(String pageId, boolean isPublishedName);

Mono<NewPage> findPageByBranchNameAndBasePageId(String branchName, String basePageId, AclPermission permission);
Mono<NewPage> findPageByBranchNameAndBasePageId(
String branchName, String basePageId, AclPermission permission, List<String> projectedFieldNames);

Flux<NewPage> findAllByApplicationIds(List<String> branchedArtifactIds, List<String> includedFields);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,15 @@ public class CustomNewPageRepositoryCEImpl extends BaseAppsmithRepositoryImpl<Ne
private final MongoTemplate mongoTemplate;
private final ObservationRegistry observationRegistry;

@Override
public Mono<NewPage> findById(String id, AclPermission permission, List<String> projectedFields) {
return queryBuilder()
.criteria(Bridge.equal(NewPage.Fields.id, id))
.permission(permission)
.fields(projectedFields)
.one();
}

@Override
public Flux<NewPage> findByApplicationId(String applicationId, AclPermission aclPermission) {
return queryBuilder()
Expand Down Expand Up @@ -161,7 +170,7 @@ public Mono<String> getNameByPageId(String pageId, boolean isPublishedName) {

@Override
public Mono<NewPage> findPageByBranchNameAndBasePageId(
String branchName, String basePageId, AclPermission permission) {
String branchName, String basePageId, AclPermission permission, List<String> projectedFieldNames) {

final BridgeQuery<NewPage> q =
// defaultPageIdCriteria
Expand All @@ -177,6 +186,7 @@ public Mono<NewPage> findPageByBranchNameAndBasePageId(
return queryBuilder()
.criteria(q)
.permission(permission)
.fields(projectedFieldNames)
.one()
.name(FETCH_PAGE_FROM_DB)
.tap(Micrometer.observation(observationRegistry));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -311,7 +311,7 @@ public Mono<PageDTO> getPageAndMigrateDslByBranchAndBasePageId(
ApplicationMode applicationMode = viewMode ? ApplicationMode.PUBLISHED : ApplicationMode.EDIT;
// Fetch the page with read permission in both editor and in viewer.
return newPageService
.findByBranchNameAndBasePageId(branchName, defaultPageId, pagePermission.getReadPermission())
.findByBranchNameAndBasePageId(branchName, defaultPageId, pagePermission.getReadPermission(), null)
.flatMap(newPage -> getPageDTOAfterMigratingDSL(newPage, viewMode, migrateDsl)
.name(getQualifiedSpanName(MIGRATE_DSL, applicationMode))
.tap(Micrometer.observation(observationRegistry)));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@
import com.appsmith.server.services.UserDataService;
import com.appsmith.server.services.UserService;
import com.appsmith.server.themes.base.ThemeService;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import io.micrometer.observation.ObservationRegistry;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -82,6 +84,20 @@ public class ConsolidatedAPIServiceCEImpl implements ConsolidatedAPIServiceCE {
public static final String INTERNAL_SERVER_ERROR_CODE = AppsmithError.INTERNAL_SERVER_ERROR.getAppErrorCode();
public static final String EMPTY_WORKSPACE_ID_ON_ERROR = "";

/**
* Cache to store mappings between default page IDs and default application IDs.
*
* <p>This cache uses an LRU (Least Recently Used) eviction policy and is configured to
* hold a maximum of 330,000 entries. Each entry consists of a key-value pair where both
* the key and the value are UUIDs (Version 4). Since each UUID is 16 bytes, a single
* key-value pair consumes 32 bytes of memory.</p>
*
* <p>The total capacity of the cache is therefore approximately 10 MB (330,000 entries
* * 32 bytes per entry = 10,560,000 bytes, which is roughly 10.08 MB).</p>
*/
private final Cache<String, String> viewModeDefaultPageIdToDefaultAppIdLRUCache =
Comment thread
subrata71 marked this conversation as resolved.
Outdated
CacheBuilder.newBuilder().maximumSize(330_000L).build();

private final SessionUserService sessionUserService;
private final UserService userService;
private final UserDataService userDataService;
Expand Down Expand Up @@ -197,20 +213,43 @@ public Mono<ConsolidatedAPIResponseDTO> getConsolidatedInfoForPageLoad(

/* Fetch default application id if not provided */
Mono<Application> branchedApplicationMonoCached;
if (isViewMode) {
// Attempt to retrieve the application ID associated with the given base page ID from the cache.
baseApplicationId = viewModeDefaultPageIdToDefaultAppIdLRUCache.getIfPresent(basePageId);
}

// Check if the application ID was found in the cache.
if (isBlank(baseApplicationId)) {
// Cache miss detected. We need to fetch the application ID and update the cache.

// Retrieve the application ID by querying the new page service using branch name, base page ID, and
// application mode.
branchedApplicationMonoCached = newPageService
.findByBranchNameAndBasePageIdAndApplicationMode(branchName, basePageId, mode)
.map(NewPage::getApplicationId)
Comment thread
subrata71 marked this conversation as resolved.
.flatMap(applicationId ->
applicationService.findByBranchedApplicationIdAndApplicationMode(applicationId, mode))
.name(getQualifiedSpanName(APPLICATION_ID_SPAN, mode))
.tap(Micrometer.observation(observationRegistry))
.flatMap(branchedPage ->
// Use the application ID to find the complete application details.
applicationService
.findByBranchedApplicationIdAndApplicationMode(
branchedPage.getApplicationId(), mode)
.doOnNext(application -> {
if (isViewMode) {
// Update the cache with the new application鈥檚 base ID for future queries.
viewModeDefaultPageIdToDefaultAppIdLRUCache.put(
basePageId, application.getBaseId());
}
}))
.name(getQualifiedSpanName(APPLICATION_ID_SPAN, mode)) // Name the span for tracing.
.tap(Micrometer.observation(observationRegistry)) // Observe metrics for performance monitoring.
.cache();

} else {
// Cache hit! We already have the application ID, so we can directly fetch the application details.

// Retrieve the application details from the application service using the cached application ID.
branchedApplicationMonoCached = applicationService
.findByBaseIdBranchNameAndApplicationMode(baseApplicationId, branchName, mode)
.name(getQualifiedSpanName(APPLICATION_ID_SPAN, mode))
.tap(Micrometer.observation(observationRegistry))
.name(getQualifiedSpanName(APPLICATION_ID_SPAN, mode)) // Name the span for tracing.
.tap(Micrometer.observation(observationRegistry)) // Observe metrics for performance monitoring.
.cache();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -107,7 +107,8 @@ public Mono<ActionDTO> importAction(

protected Mono<String> getBranchedContextId(CreatorContextType contextType, String contextId, String branchName) {
return newPageService
.findByBranchNameAndBasePageId(branchName, contextId, pagePermission.getActionCreatePermission())
.findByBranchNameAndBasePageId(
branchName, contextId, pagePermission.getActionCreatePermission(), List.of(NewPage.Fields.id))
.map(NewPage::getId);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ void publishPages_WhenIdMatches_Published() {
@Test
void findPageWithoutBranchName() {
StepVerifier.create(newPageRepository.findPageByBranchNameAndBasePageId(
null, "pageId", AclPermission.PAGE_CREATE_PAGE_ACTIONS))
null, "pageId", AclPermission.PAGE_CREATE_PAGE_ACTIONS, null))
.verifyComplete();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,8 @@ public void testCreateCollection_withRepeatedActionName_throwsError() throws IOE
final NewPage newPage = objectMapper.convertValue(jsonNode.get("newPage"), NewPage.class);
Mockito.when(newPageService.findById(Mockito.any(), Mockito.<AclPermission>any()))
.thenReturn(Mono.just(newPage));
Mockito.when(newPageService.findByBranchNameAndBasePageId(Mockito.any(), Mockito.any(), Mockito.any()))
Mockito.when(newPageService.findByBranchNameAndBasePageId(
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(newPage));
Mockito.when(refactoringService.isNameAllowed(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(false));
Expand Down Expand Up @@ -223,7 +224,8 @@ public void testCreateCollection_createActionFailure_returnsWithIncompleteCollec

Mockito.when(newPageService.findById(Mockito.any(), Mockito.<AclPermission>any()))
.thenReturn(Mono.just(newPage));
Mockito.when(newPageService.findByBranchNameAndBasePageId(Mockito.any(), Mockito.any(), Mockito.any()))
Mockito.when(newPageService.findByBranchNameAndBasePageId(
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(newPage));
Mockito.when(refactoringService.isNameAllowed(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(true));
Expand Down Expand Up @@ -280,7 +282,8 @@ public void testCreateCollection_validCollection_returnsPopulatedCollection() th

Mockito.when(newPageService.findById(Mockito.any(), Mockito.<AclPermission>any()))
.thenReturn(Mono.just(newPage));
Mockito.when(newPageService.findByBranchNameAndBasePageId(Mockito.any(), Mockito.any(), Mockito.any()))
Mockito.when(newPageService.findByBranchNameAndBasePageId(
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(newPage));
Mockito.when(refactoringService.isNameAllowed(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(true));
Expand Down Expand Up @@ -375,7 +378,8 @@ public void testUpdateUnpublishedActionCollection_withInvalidId_throwsError() th
Mockito.when(actionCollectionRepository.findById(Mockito.anyString(), Mockito.<AclPermission>any()))
.thenReturn(Mono.empty());

Mockito.when(newPageService.findByBranchNameAndBasePageId(Mockito.any(), Mockito.any(), Mockito.any()))
Mockito.when(newPageService.findByBranchNameAndBasePageId(
Mockito.any(), Mockito.any(), Mockito.any(), Mockito.any()))
.thenReturn(Mono.just(newPage));

Mockito.when(newPageService.findById(Mockito.any(), Mockito.<AclPermission>any()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ public void testPageLoadResponseForViewMode() {
mockNewPage.setApplicationId("mockApplicationId");
doReturn(Mono.just(mockNewPage))
.when(spyNewPageService)
.findByBranchNameAndBasePageId(anyString(), anyString(), any());
.findByBranchNameAndBasePageId(anyString(), anyString(), any(), any());

doReturn(Mono.just(List.of(mockNewPage)))
.when(spyApplicationPageService)
Expand Down Expand Up @@ -406,16 +406,16 @@ public void testPageLoadResponseForEditMode() {
sampleApplicationPagesDTO.setWorkspaceId("sampleWorkspaceId");

Application mockApplication = new Application();
mockApplication.setId("mockApplicationId");
mockApplication.setId("mockApplicationId123");
doReturn(Mono.just(mockApplication))
.when(spyApplicationService)
.findByBranchedApplicationIdAndApplicationMode(anyString(), any());

NewPage mockNewPage = new NewPage();
mockNewPage.setApplicationId("mockApplicationId");
mockNewPage.setApplicationId("mockApplicationId123");
Comment thread
subrata71 marked this conversation as resolved.
Outdated
doReturn(Mono.just(mockNewPage))
.when(spyNewPageService)
.findByBranchNameAndBasePageId(anyString(), anyString(), any());
.findByBranchNameAndBasePageId(anyString(), anyString(), any(), any());

doReturn(Mono.just(List.of(mockNewPage)))
.when(spyApplicationPageService)
Expand Down Expand Up @@ -507,7 +507,8 @@ public void testPageLoadResponseForEditMode() {
when(mockMockDataService.getMockDataSet()).thenReturn(Mono.just(sampleMockDataDTO));

Mono<ConsolidatedAPIResponseDTO> consolidatedInfoForPageLoad =
consolidatedAPIService.getConsolidatedInfoForPageLoad("pageId", null, "branch", ApplicationMode.EDIT);
consolidatedAPIService.getConsolidatedInfoForPageLoad(
"pageId123", null, "branch", ApplicationMode.EDIT);
StepVerifier.create(consolidatedInfoForPageLoad)
.assertNext(consolidatedAPIResponseDTO -> {
assertNotNull(consolidatedAPIResponseDTO.getUserProfile());
Expand Down Expand Up @@ -720,7 +721,7 @@ public void testErrorResponseWhenAnonymousUserAccessPrivateApp() {
when(mockProductAlertService.getSingleApplicableMessage())
.thenReturn(Mono.just(List.of(sampleProductAlertResponseDTO)));

when(mockNewPageRepository.findPageByBranchNameAndBasePageId(anyString(), anyString(), any()))
when(mockNewPageRepository.findPageByBranchNameAndBasePageId(anyString(), anyString(), any(), any()))
.thenReturn(Mono.empty());
doReturn(Mono.empty())
.when(spyApplicationRepository)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -863,7 +863,7 @@ public void clonePage_whenPageCloned_defaultIdsRetained() {
final Mono<NewPage> pageMono = applicationPageService
.clonePage(page.getId())
.flatMap(pageDTO ->
newPageService.findByBranchNameAndBasePageId(branchName, pageDTO.getId(), MANAGE_PAGES))
newPageService.findByBranchNameAndBasePageId(branchName, pageDTO.getId(), MANAGE_PAGES, null))
.cache();

Mono<List<NewAction>> actionsMono = pageMono.flatMapMany(
Expand Down
Loading