Bug Root Cause : New users have no applications inside the organizations(s). In this case, get all applications does not return back organizationApplications object.

Fix : In getAllApplications, instead of iterating over collections of applications which could be empty, we iterate over organizations where we are guaranteed to have atleast one organization.
This commit is contained in:
Trisha Anand 2020-05-28 13:31:24 +05:30
parent a24633e391
commit d6670c70cc
3 changed files with 48 additions and 12 deletions

View File

@ -8,8 +8,8 @@ import com.appsmith.server.domains.ApplicationPage;
import com.appsmith.server.domains.Layout;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.User;
import com.appsmith.server.dtos.UserHomepageDTO;
import com.appsmith.server.dtos.OrganizationApplicationsDTO;
import com.appsmith.server.dtos.UserHomepageDTO;
import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.PolicyUtils;
@ -205,16 +205,20 @@ public class ApplicationServiceImpl extends BaseService<ApplicationRepository, A
Map<String, Collection<Application>> applicationsCollectionByOrgId = tuple.getT1();
Map<String, Organization> organizationsMap = tuple.getT2();
Iterator<Map.Entry<String, Collection<Application>>> itr =
applicationsCollectionByOrgId.entrySet().iterator();
List<OrganizationApplicationsDTO> organizationApplicationsDTOS = new ArrayList<>();
while (itr.hasNext()) {
Map.Entry<String, Collection<Application>> next = itr.next();
String orgId = next.getKey();
Collection<Application> applicationCollection = next.getValue();
List<Application> applicationList = applicationCollection.stream().collect(Collectors.toList());
Organization organization = organizationsMap.get(orgId);
Iterator<Map.Entry<String, Organization>> orgIterator = organizationsMap.entrySet().iterator();
while (orgIterator.hasNext()) {
Map.Entry<String, Organization> organizationEntry = orgIterator.next();
String orgId = organizationEntry.getKey();
Organization organization = organizationEntry.getValue();
Collection<Application> applicationCollection = applicationsCollectionByOrgId.get(orgId);
List<Application> applicationList = null;
if (applicationCollection!=null && !applicationCollection.isEmpty()) {
applicationList = applicationCollection.stream().collect(Collectors.toList());
}
OrganizationApplicationsDTO organizationApplicationsDTO = new OrganizationApplicationsDTO();
organizationApplicationsDTO.setOrganization(organization);

View File

@ -69,7 +69,7 @@ public class SeedMongoData {
.build();
Policy userManageOrgPolicy = Policy.builder().permission(USER_MANAGE_ORGANIZATIONS.getValue())
.users(Set.of(API_USER_EMAIL))
.users(Set.of(API_USER_EMAIL, TEST_USER_EMAIL))
.build();
Policy managePagePolicy = Policy.builder().permission(MANAGE_PAGES.getValue())
@ -101,7 +101,7 @@ public class SeedMongoData {
.build();
Object[][] userData = {
{"user test", TEST_USER_EMAIL, UserState.ACTIVATED, Set.of(readTestUserPolicy)},
{"user test", TEST_USER_EMAIL, UserState.ACTIVATED, Set.of(readTestUserPolicy, userManageOrgPolicy)},
{"api_user", API_USER_EMAIL, UserState.ACTIVATED, Set.of(userManageOrgPolicy, readApiUserPolicy, manageApiUserPolicy)},
};
Object[][] orgData = {

View File

@ -3,6 +3,7 @@ package com.appsmith.server.services;
import com.appsmith.external.models.Policy;
import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.Organization;
import com.appsmith.server.domains.Page;
import com.appsmith.server.domains.User;
import com.appsmith.server.dtos.OrganizationApplicationsDTO;
@ -51,6 +52,9 @@ public class ApplicationServiceTest {
@Autowired
UserService userService;
@Autowired
OrganizationService organizationService;
String orgId;
@Before
@ -290,4 +294,32 @@ public class ApplicationServiceTest {
}
@Test
@WithUserDetails(value = "usertest@usertest.com")
public void getAllApplicationsForHomeWhenNoApplicationPresent() {
// Create an organization for this user first.
Organization organization = new Organization();
organization.setName("usertest's organization");
Mono<Organization> organizationMono = organizationService.create(organization);
Mono<UserHomepageDTO> allApplications = organizationMono
.then(applicationService.getAllApplications());
StepVerifier
.create(allApplications)
.assertNext(userHomepageDTO -> {
assertThat(userHomepageDTO).isNotNull();
//In case of anonymous user, we should have errored out. Assert that the user is not anonymous.
assertThat(userHomepageDTO.getUser().getIsAnonymous()).isFalse();
List<OrganizationApplicationsDTO> organizationApplications = userHomepageDTO.getOrganizationApplications();
// There should be atleast one organization present in the output.
OrganizationApplicationsDTO orgAppDto = organizationApplications.get(0);
assertThat(orgAppDto.getOrganization().getUserPermissions().contains("read:organizations"));
})
.verifyComplete();
}
}