diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/projections/UserDataProfilePhotoProjection.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/projections/UserDataProfilePhotoProjection.java new file mode 100644 index 0000000000..d9e9af857d --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/projections/UserDataProfilePhotoProjection.java @@ -0,0 +1,7 @@ +package com.appsmith.server.projections; + +public interface UserDataProfilePhotoProjection { + String getUserId(); + + String getProfilePhotoAssetId(); +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCE.java index 02be001d38..e86aeb1062 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCE.java @@ -3,7 +3,6 @@ package com.appsmith.server.repositories.ce; import com.appsmith.server.domains.UserData; import com.appsmith.server.repositories.AppsmithRepository; import com.mongodb.client.result.UpdateResult; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; @@ -14,7 +13,5 @@ public interface CustomUserDataRepositoryCE extends AppsmithRepository Mono removeIdFromRecentlyUsedList(String userId, String workspaceId, List applicationIds); - Flux findPhotoAssetsByUserIds(Iterable userId); - Mono fetchMostRecentlyUsedWorkspaceId(String userId); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCEImpl.java index 882db13e82..c306156e1f 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/CustomUserDataRepositoryCEImpl.java @@ -6,16 +6,13 @@ import com.appsmith.server.dtos.QRecentlyUsedEntityDTO; import com.appsmith.server.dtos.RecentlyUsedEntityDTO; import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl; import com.appsmith.server.repositories.CacheableRepositoryHelper; -import com.google.common.collect.Lists; import com.mongodb.BasicDBObject; import com.mongodb.client.result.UpdateResult; import org.springframework.data.mongodb.core.ReactiveMongoOperations; import org.springframework.data.mongodb.core.convert.MongoConverter; -import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.util.CollectionUtils; -import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; import java.util.List; @@ -56,23 +53,6 @@ public class CustomUserDataRepositoryCEImpl extends BaseAppsmithRepositoryImpl findPhotoAssetsByUserIds(Iterable userId) { - // need to convert from Iterable to ArrayList because the "in" method of criteria takes a collection as input - Criteria criteria = where(fieldName(QUserData.userData.userId)).in(Lists.newArrayList(userId)); - return queryAll() - .criteria(criteria) - .fields(fieldName(QUserData.userData.profilePhotoAssetId), fieldName(QUserData.userData.userId)) - .submit(); - } - @Override public Mono fetchMostRecentlyUsedWorkspaceId(String userId) { final Query query = query(where(fieldName(QUserData.userData.userId)).is(userId)); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/UserDataRepositoryCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/UserDataRepositoryCE.java index 7af968b83d..fb849dfb4b 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/UserDataRepositoryCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/repositories/ce/UserDataRepositoryCE.java @@ -1,11 +1,24 @@ package com.appsmith.server.repositories.ce; import com.appsmith.server.domains.UserData; +import com.appsmith.server.projections.UserDataProfilePhotoProjection; import com.appsmith.server.repositories.BaseRepository; import com.appsmith.server.repositories.CustomUserDataRepository; +import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; +import java.util.Collection; + public interface UserDataRepositoryCE extends BaseRepository, CustomUserDataRepository { Mono findByUserId(String userId); + + /** + * Fetches a list of UserData objects from DB where userId matches with the provided a list of userId. + * The returned UserData objects will have only the userId and photoAssetId fields. + * + * @param userIds Collection of userId strings + * @return Flux of UserData with only the photoAssetId and userId fields + */ + Flux findByUserIdIn(Collection userIds); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserWorkspaceServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserWorkspaceServiceImpl.java index f691f37d24..487a58508e 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserWorkspaceServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserWorkspaceServiceImpl.java @@ -1,11 +1,8 @@ package com.appsmith.server.services; -import com.appsmith.server.notifications.EmailSender; -import com.appsmith.server.repositories.UserDataRepository; import com.appsmith.server.repositories.UserRepository; import com.appsmith.server.services.ce.UserWorkspaceServiceCEImpl; import com.appsmith.server.solutions.PermissionGroupPermission; -import com.appsmith.server.solutions.PolicySolution; import com.appsmith.server.solutions.WorkspacePermission; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; @@ -18,9 +15,6 @@ public class UserWorkspaceServiceImpl extends UserWorkspaceServiceCEImpl impleme SessionUserService sessionUserService, WorkspaceService workspaceService, UserRepository userRepository, - UserDataRepository userDataRepository, - PolicySolution policySolution, - EmailSender emailSender, UserDataService userDataService, PermissionGroupService permissionGroupService, TenantService tenantService, @@ -31,9 +25,6 @@ public class UserWorkspaceServiceImpl extends UserWorkspaceServiceCEImpl impleme sessionUserService, workspaceService, userRepository, - userDataRepository, - policySolution, - emailSender, userDataService, permissionGroupService, tenantService, diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCE.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCE.java index 791c6279ee..b4201d90a4 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCE.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCE.java @@ -9,6 +9,7 @@ import org.springframework.http.codec.multipart.Part; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; +import java.util.Collection; import java.util.Map; public interface UserDataServiceCE { @@ -21,6 +22,8 @@ public interface UserDataServiceCE { Mono getForUserEmail(String email); + Mono> getProfilePhotoAssetIdsForUserIds(Collection userIds); + Mono updateForCurrentUser(UserData updates); Mono updateForUser(User user, UserData updates); diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCEImpl.java index b3add6eb9c..91a860ab79 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserDataServiceCEImpl.java @@ -11,6 +11,7 @@ import com.appsmith.server.dtos.RecentlyUsedEntityDTO; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.helpers.CollectionUtils; +import com.appsmith.server.projections.UserDataProfilePhotoProjection; import com.appsmith.server.repositories.ApplicationRepository; import com.appsmith.server.repositories.UserDataRepository; import com.appsmith.server.repositories.UserRepository; @@ -40,6 +41,7 @@ import reactor.core.scheduler.Scheduler; import reactor.util.function.Tuple2; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Map; @@ -125,6 +127,15 @@ public class UserDataServiceCEImpl extends BaseService> getProfilePhotoAssetIdsForUserIds(Collection userIds) { + return repository + .findByUserIdIn(userIds) + .collectMap( + UserDataProfilePhotoProjection::getUserId, + UserDataProfilePhotoProjection::getProfilePhotoAssetId); + } + @Override public Mono updateForCurrentUser(UserData updates) { return sessionUserService diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserWorkspaceServiceCEImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserWorkspaceServiceCEImpl.java index 178ee11083..ca3bff0187 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserWorkspaceServiceCEImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/ce/UserWorkspaceServiceCEImpl.java @@ -12,8 +12,6 @@ import com.appsmith.server.dtos.UpdatePermissionGroupDTO; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.helpers.AppsmithComparators; -import com.appsmith.server.notifications.EmailSender; -import com.appsmith.server.repositories.UserDataRepository; import com.appsmith.server.repositories.UserRepository; import com.appsmith.server.services.PermissionGroupService; import com.appsmith.server.services.SessionUserService; @@ -21,7 +19,6 @@ import com.appsmith.server.services.TenantService; import com.appsmith.server.services.UserDataService; import com.appsmith.server.services.WorkspaceService; import com.appsmith.server.solutions.PermissionGroupPermission; -import com.appsmith.server.solutions.PolicySolution; import com.appsmith.server.solutions.WorkspacePermission; import com.mongodb.client.result.UpdateResult; import lombok.extern.slf4j.Slf4j; @@ -52,9 +49,6 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { private final SessionUserService sessionUserService; private final WorkspaceService workspaceService; private final UserRepository userRepository; - private final UserDataRepository userDataRepository; - private final PolicySolution policySolution; - private final EmailSender emailSender; private final UserDataService userDataService; private final PermissionGroupService permissionGroupService; private final TenantService tenantService; @@ -66,9 +60,6 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { SessionUserService sessionUserService, WorkspaceService workspaceService, UserRepository userRepository, - UserDataRepository userDataRepository, - PolicySolution policySolution, - EmailSender emailSender, UserDataService userDataService, PermissionGroupService permissionGroupService, TenantService tenantService, @@ -77,9 +68,6 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { this.sessionUserService = sessionUserService; this.workspaceService = workspaceService; this.userRepository = userRepository; - this.userDataRepository = userDataRepository; - this.policySolution = policySolution; - this.emailSender = emailSender; this.userDataService = userDataService; this.permissionGroupService = permissionGroupService; this.tenantService = tenantService; @@ -261,27 +249,23 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { userIdsMono.flatMapMany(userRepository::findAllById).collectMap(User::getId); // Create a map of UserData.userUd to UserData - Mono> userDataMapMono = userIdsMono + Mono> userDataMapMono = userIdsMono // get the profile photos of the list of users - .flatMapMany(userIdsSet -> userDataRepository.findPhotoAssetsByUserIds( - userIdsSet.stream().toList())) - .collectMap(UserData::getUserId); + .flatMap(userIdsSet -> userDataService.getProfilePhotoAssetIdsForUserIds( + userIdsSet.stream().toList())); // Update name and username in the list of UserAndGroupDTO userAndPermissionGroupDTOsMono = Mono.zip(userAndPermissionGroupDTOsMono, userMapMono, userDataMapMono) .map(tuple -> { List workspaceMemberInfoDTOList = tuple.getT1(); Map userMap = tuple.getT2(); - Map userDataMap = tuple.getT3(); + Map userDataMap = tuple.getT3(); workspaceMemberInfoDTOList.forEach(userAndPermissionGroupDTO -> { User user = userMap.get(userAndPermissionGroupDTO.getUserId()); - UserData userData = userDataMap.get(userAndPermissionGroupDTO.getUserId()); userAndPermissionGroupDTO.setName( Optional.ofNullable(user.getName()).orElse(user.computeFirstName())); userAndPermissionGroupDTO.setUsername(user.getUsername()); - if (userData != null) { - userAndPermissionGroupDTO.setPhotoId(userData.getProfilePhotoAssetId()); - } + userAndPermissionGroupDTO.setPhotoId(userDataMap.get(userAndPermissionGroupDTO.getUserId())); }); return workspaceMemberInfoDTOList; }); @@ -324,9 +308,8 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { userIdsMono.flatMapMany(userRepository::findAllById).collectMap(User::getId); // Create a map of UserData.userUd to UserData - Mono> userDataMapMono = userIdsMono - .flatMapMany(userDataRepository::findPhotoAssetsByUserIds) - .collectMap(UserData::getUserId); + Mono> userDataMapMono = + userIdsMono.flatMap(userDataService::getProfilePhotoAssetIdsForUserIds); Flux>> permissionGroupsByWorkspaceFlux = permissionGroupsByWorkspacesMono.repeat(); @@ -347,16 +330,14 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE { .map(tuple1 -> { List workspaceMemberInfoDTOList = tuple1.getT1(); Map userMap = tuple1.getT2(); - Map userDataMap = tuple1.getT3(); + Map userDataMap = tuple1.getT3(); workspaceMemberInfoDTOList.forEach(userAndPermissionGroupDTO -> { User user = userMap.get(userAndPermissionGroupDTO.getUserId()); - UserData userData = userDataMap.get(userAndPermissionGroupDTO.getUserId()); userAndPermissionGroupDTO.setName( Optional.ofNullable(user.getName()).orElse(user.computeFirstName())); userAndPermissionGroupDTO.setUsername(user.getUsername()); - if (userData != null) { - userAndPermissionGroupDTO.setPhotoId(userData.getProfilePhotoAssetId()); - } + userAndPermissionGroupDTO.setPhotoId( + userDataMap.get(userAndPermissionGroupDTO.getUserId())); }); return workspaceMemberInfoDTOList; }); diff --git a/app/server/appsmith-server/src/test/java/com/appsmith/server/repositories/CustomUserDataRepositoryTest.java b/app/server/appsmith-server/src/test/java/com/appsmith/server/repositories/CustomUserDataRepositoryTest.java index bd7a7047fc..3de30a5f01 100644 --- a/app/server/appsmith-server/src/test/java/com/appsmith/server/repositories/CustomUserDataRepositoryTest.java +++ b/app/server/appsmith-server/src/test/java/com/appsmith/server/repositories/CustomUserDataRepositoryTest.java @@ -1,6 +1,7 @@ package com.appsmith.server.repositories; import com.appsmith.server.domains.UserData; +import com.appsmith.server.projections.UserDataProfilePhotoProjection; import com.mongodb.client.result.UpdateResult; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; @@ -160,29 +161,25 @@ public class CustomUserDataRepositoryTest { UserData userDataOne = new UserData(); userDataOne.setUserId(firstId); userDataOne.setProfilePhotoAssetId(photoId); - userDataOne.setRecentlyUsedAppIds(List.of("abc")); UserData userDataTwo = new UserData(); userDataTwo.setUserId(secondId); - userDataTwo.setRecentlyUsedAppIds(List.of("abc")); - Flux userDataFlux = userDataRepository + Flux userDataFlux = userDataRepository .saveAll(List.of(userDataOne, userDataTwo)) .map(UserData::getUserId) .collectList() - .flatMapMany(userDataRepository::findPhotoAssetsByUserIds); + .flatMapMany(userDataRepository::findByUserIdIn); - StepVerifier.create(userDataFlux.collectMap(UserData::getUserId)) + StepVerifier.create(userDataFlux.collectMap(UserDataProfilePhotoProjection::getUserId)) .assertNext(userDataMap -> { - assertThat(userDataMap.size()).isEqualTo(2); + assertThat(userDataMap).hasSize(2); - UserData firstUserData = userDataMap.get(firstId); + UserDataProfilePhotoProjection firstUserData = userDataMap.get(firstId); assertThat(firstUserData.getProfilePhotoAssetId()).isEqualTo(photoId); - assertThat(firstUserData.getRecentlyUsedAppIds()).isNull(); - UserData secondUserData = userDataMap.get(secondId); + UserDataProfilePhotoProjection secondUserData = userDataMap.get(secondId); assertThat(secondUserData.getProfilePhotoAssetId()).isNull(); - assertThat(secondUserData.getRecentlyUsedAppIds()).isNull(); }) .verifyComplete(); }