From 35b0c223345eb4f0e36aa00e5cb7d819bcd3bbc7 Mon Sep 17 00:00:00 2001 From: Arpit Mohan Date: Fri, 6 Mar 2020 06:17:00 +0000 Subject: [PATCH] Adding /profile endpoint to return enhanced user profile to the client. --- .../server/controllers/UserController.java | 8 ++++ .../com/appsmith/server/domains/User.java | 3 ++ .../server/dtos/ApplicationNameIdDTO.java | 13 ++++++ .../appsmith/server/dtos/UserProfileDTO.java | 19 +++++++++ .../appsmith/server/services/UserService.java | 3 ++ .../server/services/UserServiceImpl.java | 41 ++++++++++++++++++- 6 files changed, 86 insertions(+), 1 deletion(-) create mode 100644 app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ApplicationNameIdDTO.java create mode 100644 app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/UserProfileDTO.java diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/UserController.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/UserController.java index 347459d6fa..18744c7550 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/UserController.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/controllers/UserController.java @@ -5,6 +5,7 @@ import com.appsmith.server.domains.InviteUser; import com.appsmith.server.domains.User; import com.appsmith.server.dtos.ResetUserPasswordDTO; import com.appsmith.server.dtos.ResponseDTO; +import com.appsmith.server.dtos.UserProfileDTO; import com.appsmith.server.services.SessionUserService; import com.appsmith.server.services.UserOrganizationService; import com.appsmith.server.services.UserService; @@ -77,12 +78,19 @@ public class UserController extends BaseController { .map(result -> new ResponseDTO<>(HttpStatus.OK.value(), result, null)); } + @Deprecated @GetMapping("/me") public Mono> getUserProfile() { return sessionUserService.getCurrentUser() .map(user -> new ResponseDTO<>(HttpStatus.OK.value(), user, null)); } + @GetMapping("/profile") + public Mono> getEnhancedUserProfile() { + return service.getUserProfile() + .map(user -> new ResponseDTO<>(HttpStatus.OK.value(), user, null)); + } + /** * This function creates an invite for a new user to join the Appsmith platform. We require the Origin header * in order to construct client facing URLs that will be sent to the user via email. diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/User.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/User.java index 234e38bf5d..83fbbff986 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/User.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/domains/User.java @@ -1,11 +1,13 @@ package com.appsmith.server.domains; import com.appsmith.external.models.BaseDomain; +import com.appsmith.server.dtos.ApplicationNameIdDTO; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; +import org.springframework.data.annotation.Transient; import org.springframework.data.mongodb.core.index.Indexed; import org.springframework.data.mongodb.core.mapping.Document; import org.springframework.security.core.GrantedAuthority; @@ -14,6 +16,7 @@ import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; import java.util.HashSet; +import java.util.List; import java.util.Set; import java.util.stream.Collectors; diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ApplicationNameIdDTO.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ApplicationNameIdDTO.java new file mode 100644 index 0000000000..42d6b1b5b9 --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/ApplicationNameIdDTO.java @@ -0,0 +1,13 @@ +package com.appsmith.server.dtos; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ApplicationNameIdDTO { + + String id; + + String name; +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/UserProfileDTO.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/UserProfileDTO.java new file mode 100644 index 0000000000..7733221ffc --- /dev/null +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/dtos/UserProfileDTO.java @@ -0,0 +1,19 @@ +package com.appsmith.server.dtos; + +import com.appsmith.server.domains.Organization; +import com.appsmith.server.domains.User; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class UserProfileDTO { + + User user; + + Organization currentOrganization; + + List applications; +} diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserService.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserService.java index f8b4103621..e0f88ade7d 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserService.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserService.java @@ -3,6 +3,7 @@ package com.appsmith.server.services; import com.appsmith.server.domains.InviteUser; import com.appsmith.server.domains.User; import com.appsmith.server.dtos.ResetUserPasswordDTO; +import com.appsmith.server.dtos.UserProfileDTO; import reactor.core.publisher.Mono; public interface UserService extends CrudService { @@ -22,4 +23,6 @@ public interface UserService extends CrudService { Mono verifyInviteToken(String email, String token); Mono confirmInviteUser(InviteUser inviteUser); + + Mono getUserProfile(); } diff --git a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java index 1174000ee7..b2b6fbf63e 100644 --- a/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java +++ b/app/server/appsmith-server/src/main/java/com/appsmith/server/services/UserServiceImpl.java @@ -1,21 +1,26 @@ package com.appsmith.server.services; import com.appsmith.server.constants.FieldName; +import com.appsmith.server.domains.Application; import com.appsmith.server.domains.InviteUser; import com.appsmith.server.domains.LoginSource; import com.appsmith.server.domains.Organization; import com.appsmith.server.domains.PasswordResetToken; import com.appsmith.server.domains.User; +import com.appsmith.server.dtos.ApplicationNameIdDTO; import com.appsmith.server.dtos.ResetUserPasswordDTO; +import com.appsmith.server.dtos.UserProfileDTO; import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.helpers.BeanCopyUtils; import com.appsmith.server.notifications.EmailSender; +import com.appsmith.server.repositories.ApplicationRepository; import com.appsmith.server.repositories.InviteUserRepository; import com.appsmith.server.repositories.PasswordResetTokenRepository; import com.appsmith.server.repositories.UserRepository; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Example; import org.springframework.data.mongodb.core.ReactiveMongoTemplate; import org.springframework.data.mongodb.core.convert.MongoConverter; import org.springframework.security.core.userdetails.ReactiveUserDetailsService; @@ -49,6 +54,7 @@ public class UserServiceImpl extends BaseService i private final GroupService groupService; private final InviteUserRepository inviteUserRepository; private final UserOrganizationService userOrganizationService; + private final ApplicationRepository applicationRepository; private static final String WELCOME_USER_EMAIL_TEMPLATE = "email/welcomeUserTemplate.html"; private static final String INVITE_USER_EMAIL_TEMPLATE = "email/inviteUserTemplate.html"; @@ -70,7 +76,8 @@ public class UserServiceImpl extends BaseService i EmailSender emailSender, GroupService groupService, InviteUserRepository inviteUserRepository, - UserOrganizationService userOrganizationService) { + UserOrganizationService userOrganizationService, + ApplicationRepository applicationRepository) { super(scheduler, validator, mongoConverter, reactiveMongoTemplate, repository, analyticsService); this.repository = repository; this.organizationService = organizationService; @@ -82,6 +89,7 @@ public class UserServiceImpl extends BaseService i this.groupService = groupService; this.inviteUserRepository = inviteUserRepository; this.userOrganizationService = userOrganizationService; + this.applicationRepository = applicationRepository; } @Override @@ -487,4 +495,35 @@ public class UserServiceImpl extends BaseService i // Doesn't work without this. .map(user -> (UserDetails) user); } + + @Override + public Mono getUserProfile() { + return sessionUserService.getCurrentUser() + .flatMap(user -> { + String currentOrganizationId = user.getCurrentOrganizationId(); + UserProfileDTO userProfile = new UserProfileDTO(); + userProfile.setUser(user); + + Mono userProfileDTOMono = organizationService.findById(currentOrganizationId) + .flatMap(org -> { + userProfile.setCurrentOrganization(org); + + Application applicationExample = new Application(); + applicationExample.setOrganizationId(org.getId()); + return applicationRepository.findAll(Example.of(applicationExample)) + .map(application -> { + ApplicationNameIdDTO dto = new ApplicationNameIdDTO(); + dto.setId(application.getId()); + dto.setName(application.getName()); + return dto; + }).collectList() + .map(dtos -> { + userProfile.setApplications(dtos); + return userProfile; + + }); + }); + return userProfileDTOMono; + }); + } }