chore: refactor workspace members api (#17891)

This commit is contained in:
Nilesh Sarupriya 2022-10-27 11:56:08 +05:30 committed by GitHub
parent f91fe64dd8
commit 3ee6572f77
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
14 changed files with 114 additions and 96 deletions

View File

@ -4,7 +4,7 @@ import com.appsmith.server.constants.Url;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UpdatePermissionGroupDTO; import com.appsmith.server.dtos.UpdatePermissionGroupDTO;
import com.appsmith.server.dtos.ResponseDTO; import com.appsmith.server.dtos.ResponseDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.dtos.PermissionGroupInfoDTO; import com.appsmith.server.dtos.PermissionGroupInfoDTO;
import com.appsmith.server.services.WorkspaceService; import com.appsmith.server.services.WorkspaceService;
import com.appsmith.server.services.UserWorkspaceService; import com.appsmith.server.services.UserWorkspaceService;
@ -47,15 +47,15 @@ public class WorkspaceControllerCE extends BaseController<WorkspaceService, Work
} }
@GetMapping("/{workspaceId}/members") @GetMapping("/{workspaceId}/members")
public Mono<ResponseDTO<List<UserAndPermissionGroupDTO>>> getUserMembersOfWorkspace(@PathVariable String workspaceId) { public Mono<ResponseDTO<List<WorkspaceMemberInfoDTO>>> getUserMembersOfWorkspace(@PathVariable String workspaceId) {
return userWorkspaceService.getWorkspaceMembers(workspaceId) return userWorkspaceService.getWorkspaceMembers(workspaceId)
.map(users -> new ResponseDTO<>(HttpStatus.OK.value(), users, null)); .map(users -> new ResponseDTO<>(HttpStatus.OK.value(), users, null));
} }
@PutMapping("/{workspaceId}/permissionGroup") @PutMapping("/{workspaceId}/permissionGroup")
public Mono<ResponseDTO<UserAndPermissionGroupDTO>> updatePermissionGroupForMember(@RequestBody UpdatePermissionGroupDTO updatePermissionGroupDTO, public Mono<ResponseDTO<WorkspaceMemberInfoDTO>> updatePermissionGroupForMember(@RequestBody UpdatePermissionGroupDTO updatePermissionGroupDTO,
@PathVariable String workspaceId, @PathVariable String workspaceId,
@RequestHeader(name = "Origin", required = false) String originHeader) { @RequestHeader(name = "Origin", required = false) String originHeader) {
return userWorkspaceService.updatePermissionGroupForMember(workspaceId, updatePermissionGroupDTO, originHeader) return userWorkspaceService.updatePermissionGroupForMember(workspaceId, updatePermissionGroupDTO, originHeader)
.map(user -> new ResponseDTO<>(HttpStatus.OK.value(), user, null)); .map(user -> new ResponseDTO<>(HttpStatus.OK.value(), user, null));
} }

View File

@ -16,5 +16,5 @@ import java.util.List;
public class WorkspaceApplicationsDTO { public class WorkspaceApplicationsDTO {
Workspace workspace; Workspace workspace;
List<Application> applications; List<Application> applications;
List<UserAndPermissionGroupDTO> users; List<WorkspaceMemberInfoDTO> users;
} }

View File

@ -0,0 +1,16 @@
package com.appsmith.server.dtos;
import com.appsmith.server.dtos.ce.WorkspaceMemberInfoCE_DTO;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Setter
@Getter
public class WorkspaceMemberInfoDTO extends WorkspaceMemberInfoCE_DTO {
@Builder
public WorkspaceMemberInfoDTO(String userId, String username, String name, String permissionGroupName, String permissionGroupId) {
super(userId, username, name, permissionGroupName, permissionGroupId);
}
}

View File

@ -1,20 +1,14 @@
package com.appsmith.server.dtos; package com.appsmith.server.dtos.ce;
import lombok.Builder; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
@Data @Data
@Builder @AllArgsConstructor
public class UserAndPermissionGroupDTO { public class WorkspaceMemberInfoCE_DTO {
String userId; String userId;
String username; String username;
String name; String name;
String permissionGroupName; String permissionGroupName;
String permissionGroupId; String permissionGroupId;
} }

View File

@ -2,7 +2,7 @@ package com.appsmith.server.events;
import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import lombok.Data; import lombok.Data;
import java.util.List; import java.util.List;
@ -11,7 +11,7 @@ import java.util.List;
public abstract class AbstractCommentEvent { public abstract class AbstractCommentEvent {
private final String authorUserName; private final String authorUserName;
private final Workspace workspace; private final Workspace workspace;
private final List<UserAndPermissionGroupDTO> workspaceMembers; private final List<WorkspaceMemberInfoDTO> workspaceMembers;
private final Application application; private final Application application;
private final String originHeader; private final String originHeader;
private final String pageName; private final String pageName;

View File

@ -3,7 +3,7 @@ package com.appsmith.server.events;
import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.Comment; import com.appsmith.server.domains.Comment;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import lombok.Getter; import lombok.Getter;
import java.util.List; import java.util.List;
@ -14,7 +14,7 @@ public class CommentAddedEvent extends AbstractCommentEvent {
private final Comment comment; private final Comment comment;
private final Set<String> subscribers; private final Set<String> subscribers;
public CommentAddedEvent(Workspace workspace, List<UserAndPermissionGroupDTO> workspaceMembers, Application application, public CommentAddedEvent(Workspace workspace, List<WorkspaceMemberInfoDTO> workspaceMembers, Application application,
String originHeader, Comment comment, Set<String> subscribers, String pageName) { String originHeader, Comment comment, Set<String> subscribers, String pageName) {
super(comment.getAuthorUsername(), workspace, workspaceMembers, application, originHeader, pageName); super(comment.getAuthorUsername(), workspace, workspaceMembers, application, originHeader, pageName);
this.comment = comment; this.comment = comment;

View File

@ -3,7 +3,7 @@ package com.appsmith.server.events;
import com.appsmith.server.domains.Application; import com.appsmith.server.domains.Application;
import com.appsmith.server.domains.CommentThread; import com.appsmith.server.domains.CommentThread;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import lombok.Getter; import lombok.Getter;
import java.util.List; import java.util.List;
@ -12,7 +12,7 @@ import java.util.List;
public class CommentThreadClosedEvent extends AbstractCommentEvent { public class CommentThreadClosedEvent extends AbstractCommentEvent {
private final CommentThread commentThread; private final CommentThread commentThread;
public CommentThreadClosedEvent(String authorUserName, Workspace workspace, List<UserAndPermissionGroupDTO> workspaceMembers, public CommentThreadClosedEvent(String authorUserName, Workspace workspace, List<WorkspaceMemberInfoDTO> workspaceMembers,
Application application, String originHeader, CommentThread commentThread, Application application, String originHeader, CommentThread commentThread,
String pagename) { String pagename) {

View File

@ -1,7 +1,7 @@
package com.appsmith.server.services.ce; package com.appsmith.server.services.ce;
import com.appsmith.server.dtos.UpdatePermissionGroupDTO; import com.appsmith.server.dtos.UpdatePermissionGroupDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.domains.User; import com.appsmith.server.domains.User;
import reactor.core.publisher.Mono; import reactor.core.publisher.Mono;
@ -13,9 +13,9 @@ public interface UserWorkspaceServiceCE {
Mono<User> leaveWorkspace(String workspaceId); Mono<User> leaveWorkspace(String workspaceId);
Mono<UserAndPermissionGroupDTO> updatePermissionGroupForMember(String workspaceId, UpdatePermissionGroupDTO changeUserGroupDTO, String originHeader); Mono<WorkspaceMemberInfoDTO> updatePermissionGroupForMember(String workspaceId, UpdatePermissionGroupDTO changeUserGroupDTO, String originHeader);
Mono<List<UserAndPermissionGroupDTO>> getWorkspaceMembers(String workspaceId); Mono<List<WorkspaceMemberInfoDTO>> getWorkspaceMembers(String workspaceId);
Mono<Map<String, List<UserAndPermissionGroupDTO>>> getWorkspaceMembers(Set<String> workspaceIds); Mono<Map<String, List<WorkspaceMemberInfoDTO>>> getWorkspaceMembers(Set<String> workspaceIds);
} }

View File

@ -6,7 +6,7 @@ import com.appsmith.server.domains.PermissionGroup;
import com.appsmith.server.domains.User; import com.appsmith.server.domains.User;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UpdatePermissionGroupDTO; import com.appsmith.server.dtos.UpdatePermissionGroupDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.PolicyUtils; import com.appsmith.server.helpers.PolicyUtils;
@ -123,7 +123,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
*/ */
@Transactional @Transactional
@Override @Override
public Mono<UserAndPermissionGroupDTO> updatePermissionGroupForMember(String workspaceId, UpdatePermissionGroupDTO changeUserGroupDTO, String originHeader) { public Mono<WorkspaceMemberInfoDTO> updatePermissionGroupForMember(String workspaceId, UpdatePermissionGroupDTO changeUserGroupDTO, String originHeader) {
if (changeUserGroupDTO.getUsername() == null) { if (changeUserGroupDTO.getUsername() == null) {
return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.USERNAME)); return Mono.error(new AppsmithException(AppsmithError.INVALID_PARAMETER, FieldName.USERNAME));
} }
@ -162,7 +162,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
// If new permission group id is not present, just unassign old permission group and return PermissionAndGroupDTO // If new permission group id is not present, just unassign old permission group and return PermissionAndGroupDTO
if (!StringUtils.hasText(changeUserGroupDTO.getNewPermissionGroupId())) { if (!StringUtils.hasText(changeUserGroupDTO.getNewPermissionGroupId())) {
return permissionGroupUnassignedMono.then(userMono) return permissionGroupUnassignedMono.then(userMono)
.map(user -> UserAndPermissionGroupDTO.builder().username(user.getUsername()).name(user.getName()).build()); .map(user -> WorkspaceMemberInfoDTO.builder().username(user.getUsername()).name(user.getName()).build());
} }
// Get the new permission group // Get the new permission group
@ -183,7 +183,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
.map(pair -> { .map(pair -> {
User user = pair.getT2(); User user = pair.getT2();
PermissionGroup newPermissionGroup = pair.getT1(); PermissionGroup newPermissionGroup = pair.getT1();
return UserAndPermissionGroupDTO.builder() return WorkspaceMemberInfoDTO.builder()
.username(user.getUsername()) .username(user.getUsername())
.name(user.getName()) .name(user.getName())
.permissionGroupName(newPermissionGroup.getName()) .permissionGroupName(newPermissionGroup.getName())
@ -193,18 +193,13 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
} }
@Override @Override
public Mono<List<UserAndPermissionGroupDTO>> getWorkspaceMembers(String workspaceId) { public Mono<List<WorkspaceMemberInfoDTO>> getWorkspaceMembers(String workspaceId) {
// Read the workspace
Mono<Workspace> workspaceMono = workspaceRepository.findById(workspaceId, AclPermission.READ_WORKSPACES)
.switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.WORKSPACE, workspaceId)));
// Get default permission groups // Get default permission groups
Flux<PermissionGroup> permissionGroupFlux = workspaceMono Flux<PermissionGroup> permissionGroupFlux = this.getPermissionGroupsForWorkspace(workspaceId);
.flatMapMany(workspace -> permissionGroupService.getByDefaultWorkspace(workspace, AclPermission.READ_PERMISSION_GROUP_MEMBERS));
// Create a list of UserAndGroupDTO // Create a list of UserAndGroupDTO
Mono<List<UserAndPermissionGroupDTO>> userAndPermissionGroupDTOsMono = permissionGroupFlux Mono<List<WorkspaceMemberInfoDTO>> userAndPermissionGroupDTOsMono = permissionGroupFlux
.collectList() .collectList()
.map(this::mapPermissionGroupListToUserAndPermissionGroupDTOList) .map(this::mapPermissionGroupListToUserAndPermissionGroupDTOList)
.cache(); .cache();
@ -212,7 +207,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
// Create a map of User.userId to User // Create a map of User.userId to User
Mono<Map<String, User>> userMapMono = userAndPermissionGroupDTOsMono Mono<Map<String, User>> userMapMono = userAndPermissionGroupDTOsMono
.flatMapMany(Flux::fromIterable) .flatMapMany(Flux::fromIterable)
.map(UserAndPermissionGroupDTO::getUserId) .map(WorkspaceMemberInfoDTO::getUserId)
.collect(Collectors.toSet()) .collect(Collectors.toSet())
.flatMapMany(userIds -> userRepository.findAllById(userIds)) .flatMapMany(userIds -> userRepository.findAllById(userIds))
.collectMap(User::getId) .collectMap(User::getId)
@ -222,46 +217,21 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
userAndPermissionGroupDTOsMono = userAndPermissionGroupDTOsMono userAndPermissionGroupDTOsMono = userAndPermissionGroupDTOsMono
.zipWith(userMapMono) .zipWith(userMapMono)
.map(tuple -> { .map(tuple -> {
List<UserAndPermissionGroupDTO> userAndPermissionGroupDTOList = tuple.getT1(); List<WorkspaceMemberInfoDTO> workspaceMemberInfoDTOList = tuple.getT1();
Map<String, User> userMap = tuple.getT2(); Map<String, User> userMap = tuple.getT2();
userAndPermissionGroupDTOList.forEach(userAndPermissionGroupDTO -> { workspaceMemberInfoDTOList.forEach(userAndPermissionGroupDTO -> {
User user = userMap.get(userAndPermissionGroupDTO.getUserId()); User user = userMap.get(userAndPermissionGroupDTO.getUserId());
userAndPermissionGroupDTO.setName(Optional.ofNullable(user.getName()).orElse(user.computeFirstName())); userAndPermissionGroupDTO.setName(Optional.ofNullable(user.getName()).orElse(user.computeFirstName()));
userAndPermissionGroupDTO.setUsername(user.getUsername()); userAndPermissionGroupDTO.setUsername(user.getUsername());
}); });
return userAndPermissionGroupDTOList; return workspaceMemberInfoDTOList;
}); });
// Sort the members by permission group // Sort the members by permission group
//TODO get users sorted from DB and fill in three buckets - admin, developer and viewer //TODO get users sorted from DB and fill in three buckets - admin, developer and viewer
Mono<List<UserAndPermissionGroupDTO>> sortedListMono = userAndPermissionGroupDTOsMono Mono<List<WorkspaceMemberInfoDTO>> sortedListMono = userAndPermissionGroupDTOsMono
.map(userAndPermissionGroupDTOS -> { .map(userAndPermissionGroupDTOS -> {
Collections.sort(userAndPermissionGroupDTOS, new Comparator<UserAndPermissionGroupDTO>() { Collections.sort(userAndPermissionGroupDTOS, this.getWorkspaceMemberComparator());
@Override
public int compare(UserAndPermissionGroupDTO o1, UserAndPermissionGroupDTO o2) {
int order1 = getOrder(o1.getPermissionGroupName());
int order2 = getOrder(o2.getPermissionGroupName());
// Administrator > Developer > App viewer
int permissionGroupSortOrder = order1 - order2;
if (permissionGroupSortOrder != 0) {
return permissionGroupSortOrder;
}
return o1.getUsername().compareTo(o2.getUsername());
}
private int getOrder(String name) {
if (name.startsWith(FieldName.ADMINISTRATOR)) {
return 0;
} else if (name.startsWith(FieldName.DEVELOPER)) {
return 1;
} else {
return 2;
}
}
});
return userAndPermissionGroupDTOS; return userAndPermissionGroupDTOS;
}); });
@ -270,7 +240,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
} }
@Override @Override
public Mono<Map<String, List<UserAndPermissionGroupDTO>>> getWorkspaceMembers(Set<String> workspaceIds) { public Mono<Map<String, List<WorkspaceMemberInfoDTO>>> getWorkspaceMembers(Set<String> workspaceIds) {
// Get default permission groups // Get default permission groups
Flux<PermissionGroup> permissionGroupFlux = permissionGroupService.getByDefaultWorkspaces(workspaceIds, AclPermission.READ_PERMISSION_GROUP_MEMBERS) Flux<PermissionGroup> permissionGroupFlux = permissionGroupService.getByDefaultWorkspaces(workspaceIds, AclPermission.READ_PERMISSION_GROUP_MEMBERS)
@ -296,7 +266,7 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
Flux<Map<String, Collection<PermissionGroup>>> permissionGroupsByWorkspaceFlux = permissionGroupsByWorkspacesMono Flux<Map<String, Collection<PermissionGroup>>> permissionGroupsByWorkspaceFlux = permissionGroupsByWorkspacesMono
.repeat(); .repeat();
Mono<Map<String, List<UserAndPermissionGroupDTO>>> workspaceMembersMono = permissionGroupsByWorkspacesMono Mono<Map<String, List<WorkspaceMemberInfoDTO>>> workspaceMembersMono = permissionGroupsByWorkspacesMono
.flatMapMany(permissionGroupsByWorkspaces -> Flux.fromIterable(permissionGroupsByWorkspaces.keySet())) .flatMapMany(permissionGroupsByWorkspaces -> Flux.fromIterable(permissionGroupsByWorkspaces.keySet()))
.zipWith(permissionGroupsByWorkspaceFlux) .zipWith(permissionGroupsByWorkspaceFlux)
.flatMap(tuple -> { .flatMap(tuple -> {
@ -304,17 +274,17 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
Map<String, Collection<PermissionGroup>> collectionMap = tuple.getT2(); Map<String, Collection<PermissionGroup>> collectionMap = tuple.getT2();
List<PermissionGroup> permissionGroups = collectionMap.get(workspaceId).stream().collect(Collectors.toList()); List<PermissionGroup> permissionGroups = collectionMap.get(workspaceId).stream().collect(Collectors.toList());
Mono<List<UserAndPermissionGroupDTO>> userAndPermissionGroupDTOsMono = Mono.just(mapPermissionGroupListToUserAndPermissionGroupDTOList(permissionGroups)) Mono<List<WorkspaceMemberInfoDTO>> userAndPermissionGroupDTOsMono = Mono.just(mapPermissionGroupListToUserAndPermissionGroupDTOList(permissionGroups))
.zipWith(userMapMono) .zipWith(userMapMono)
.map(tuple1 -> { .map(tuple1 -> {
List<UserAndPermissionGroupDTO> userAndPermissionGroupDTOList = tuple1.getT1(); List<WorkspaceMemberInfoDTO> workspaceMemberInfoDTOList = tuple1.getT1();
Map<String, User> userMap = tuple1.getT2(); Map<String, User> userMap = tuple1.getT2();
userAndPermissionGroupDTOList.forEach(userAndPermissionGroupDTO -> { workspaceMemberInfoDTOList.forEach(userAndPermissionGroupDTO -> {
User user = userMap.get(userAndPermissionGroupDTO.getUserId()); User user = userMap.get(userAndPermissionGroupDTO.getUserId());
userAndPermissionGroupDTO.setName(Optional.ofNullable(user.getName()).orElse(user.computeFirstName())); userAndPermissionGroupDTO.setName(Optional.ofNullable(user.getName()).orElse(user.computeFirstName()));
userAndPermissionGroupDTO.setUsername(user.getUsername()); userAndPermissionGroupDTO.setUsername(user.getUsername());
}); });
return userAndPermissionGroupDTOList; return workspaceMemberInfoDTOList;
}); });
return Mono.zip(Mono.just(workspaceId), userAndPermissionGroupDTOsMono); return Mono.zip(Mono.just(workspaceId), userAndPermissionGroupDTOsMono);
@ -324,12 +294,12 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
return workspaceMembersMono; return workspaceMembersMono;
} }
private List<UserAndPermissionGroupDTO> mapPermissionGroupListToUserAndPermissionGroupDTOList(List<PermissionGroup> permissionGroupList) { private List<WorkspaceMemberInfoDTO> mapPermissionGroupListToUserAndPermissionGroupDTOList(List<PermissionGroup> permissionGroupList) {
Set<String> userIds = new HashSet<>(); // Set of already collected users Set<String> userIds = new HashSet<>(); // Set of already collected users
List<UserAndPermissionGroupDTO> userAndGroupDTOList = new ArrayList<>(); List<WorkspaceMemberInfoDTO> userAndGroupDTOList = new ArrayList<>();
permissionGroupList.forEach(permissionGroup -> { permissionGroupList.forEach(permissionGroup -> {
Stream.ofNullable(permissionGroup.getAssignedToUserIds()).flatMap(Collection::stream).filter(userId -> !userIds.contains(userId)).forEach(userId -> { Stream.ofNullable(permissionGroup.getAssignedToUserIds()).flatMap(Collection::stream).filter(userId -> !userIds.contains(userId)).forEach(userId -> {
userAndGroupDTOList.add(UserAndPermissionGroupDTO.builder() userAndGroupDTOList.add(WorkspaceMemberInfoDTO.builder()
.userId(userId) .userId(userId)
.permissionGroupName(permissionGroup.getName()) .permissionGroupName(permissionGroup.getName())
.permissionGroupId(permissionGroup.getId()) .permissionGroupId(permissionGroup.getId())
@ -339,4 +309,42 @@ public class UserWorkspaceServiceCEImpl implements UserWorkspaceServiceCE {
}); });
return userAndGroupDTOList; return userAndGroupDTOList;
} }
protected Flux<PermissionGroup> getPermissionGroupsForWorkspace(String workspaceId) {
Mono<Workspace> workspaceMono = workspaceRepository.findById(workspaceId, AclPermission.READ_WORKSPACES)
.switchIfEmpty(Mono.error(new AppsmithException(AppsmithError.NO_RESOURCE_FOUND, FieldName.WORKSPACE, workspaceId)));
// Get default permission groups
return workspaceMono
.flatMapMany(workspace -> permissionGroupService.getByDefaultWorkspace(workspace, AclPermission.READ_PERMISSION_GROUP_MEMBERS));
}
private Comparator<WorkspaceMemberInfoDTO> getWorkspaceMemberComparator() {
return new Comparator<>() {
@Override
public int compare(WorkspaceMemberInfoDTO o1, WorkspaceMemberInfoDTO o2) {
int order1 = getOrder(o1.getPermissionGroupName());
int order2 = getOrder(o2.getPermissionGroupName());
// Administrator > Developer > App viewer
int permissionGroupSortOrder = order1 - order2;
if (permissionGroupSortOrder != 0) {
return permissionGroupSortOrder;
}
return o1.getUsername().compareTo(o2.getUsername());
}
private int getOrder(String name) {
if (name.startsWith(FieldName.ADMINISTRATOR)) {
return 0;
} else if (name.startsWith(FieldName.DEVELOPER)) {
return 1;
} else {
return 2;
}
}
};
}
} }

View File

@ -9,7 +9,7 @@ import com.appsmith.server.domains.UserData;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.PageDTO; import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.dtos.ReleaseNode; import com.appsmith.server.dtos.ReleaseNode;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.dtos.UserHomepageDTO; import com.appsmith.server.dtos.UserHomepageDTO;
import com.appsmith.server.dtos.WorkspaceApplicationsDTO; import com.appsmith.server.dtos.WorkspaceApplicationsDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
@ -144,7 +144,7 @@ public class ApplicationFetcherCEImpl implements ApplicationFetcherCE {
.collectList() .collectList()
.cache(); .cache();
Mono<Map<String, List<UserAndPermissionGroupDTO>>> userAndPermissionGroupMapDTO = workspacesFromRepoFlux Mono<Map<String, List<WorkspaceMemberInfoDTO>>> userAndPermissionGroupMapDTO = workspacesFromRepoFlux
.map(Workspace::getId) .map(Workspace::getId)
.collect(Collectors.toSet()) .collect(Collectors.toSet())
.flatMap(workspaceIds -> userWorkspaceService.getWorkspaceMembers(workspaceIds)); .flatMap(workspaceIds -> userWorkspaceService.getWorkspaceMembers(workspaceIds));
@ -155,7 +155,7 @@ public class ApplicationFetcherCEImpl implements ApplicationFetcherCE {
Map<String, Collection<Application>> applicationsCollectionByWorkspaceId = tuple.getT2(); Map<String, Collection<Application>> applicationsCollectionByWorkspaceId = tuple.getT2();
Map<String, List<UserAndPermissionGroupDTO>> userAndPermissionGroupMapDTOByWorkspaceId = tuple.getT3(); Map<String, List<WorkspaceMemberInfoDTO>> userAndPermissionGroupMapDTOByWorkspaceId = tuple.getT3();
List<WorkspaceApplicationsDTO> workspaceApplicationsDTOS = new ArrayList<>(); List<WorkspaceApplicationsDTO> workspaceApplicationsDTOS = new ArrayList<>();

View File

@ -8,7 +8,7 @@ import com.appsmith.server.domains.CommentThread;
import com.appsmith.server.domains.GitApplicationMetadata; import com.appsmith.server.domains.GitApplicationMetadata;
import com.appsmith.server.domains.UserRole; import com.appsmith.server.domains.UserRole;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.events.CommentAddedEvent; import com.appsmith.server.events.CommentAddedEvent;
import com.appsmith.server.events.CommentThreadClosedEvent; import com.appsmith.server.events.CommentThreadClosedEvent;
import com.appsmith.server.helpers.CommentUtils; import com.appsmith.server.helpers.CommentUtils;
@ -70,7 +70,7 @@ public class EmailEventHandlerCEImpl implements EmailEventHandlerCE {
.zipWith(userWorkspaceService.getWorkspaceMembers(objects.getT1().getWorkspaceId())) .zipWith(userWorkspaceService.getWorkspaceMembers(objects.getT1().getWorkspaceId()))
.map(tuple -> { .map(tuple -> {
Workspace workspace = tuple.getT1(); Workspace workspace = tuple.getT1();
List<UserAndPermissionGroupDTO> workspaceMembers = tuple.getT2(); List<WorkspaceMemberInfoDTO> workspaceMembers = tuple.getT2();
String pagename = objects.getT2(); String pagename = objects.getT2();
applicationEventPublisher.publishEvent( applicationEventPublisher.publishEvent(
new CommentAddedEvent( new CommentAddedEvent(
@ -197,7 +197,7 @@ public class EmailEventHandlerCEImpl implements EmailEventHandlerCE {
return emailSender.sendMail(receiverEmail, emailSubject, COMMENT_ADDED_EMAIL_TEMPLATE, templateParams); return emailSender.sendMail(receiverEmail, emailSubject, COMMENT_ADDED_EMAIL_TEMPLATE, templateParams);
} }
private Mono<Boolean> getAddCommentEmailSenderMono(UserAndPermissionGroupDTO userAndGroupDTO, Comment comment, String originHeader, private Mono<Boolean> getAddCommentEmailSenderMono(WorkspaceMemberInfoDTO userAndGroupDTO, Comment comment, String originHeader,
Application application, String pagename) { Application application, String pagename) {
String receiverName = StringUtils.isEmpty(userAndGroupDTO.getName()) ? "User" : userAndGroupDTO.getName(); String receiverName = StringUtils.isEmpty(userAndGroupDTO.getName()) ? "User" : userAndGroupDTO.getName();
String receiverEmail = userAndGroupDTO.getUsername(); String receiverEmail = userAndGroupDTO.getUsername();
@ -261,12 +261,12 @@ public class EmailEventHandlerCEImpl implements EmailEventHandlerCE {
); );
} }
private Mono<Boolean> sendEmailForCommentAdded(Workspace workspace, List<UserAndPermissionGroupDTO> workspaceMembers, private Mono<Boolean> sendEmailForCommentAdded(Workspace workspace, List<WorkspaceMemberInfoDTO> workspaceMembers,
Application application, Comment comment, String originHeader, Application application, Comment comment, String originHeader,
Set<String> subscribers, String pagename) { Set<String> subscribers, String pagename) {
List<Mono<Boolean>> emailMonos = new ArrayList<>(); List<Mono<Boolean>> emailMonos = new ArrayList<>();
for (UserAndPermissionGroupDTO user : workspaceMembers) { for (WorkspaceMemberInfoDTO user : workspaceMembers) {
if(!comment.getAuthorUsername().equals(user.getUsername()) && subscribers.contains(user.getUsername())) { if(!comment.getAuthorUsername().equals(user.getUsername()) && subscribers.contains(user.getUsername())) {
emailMonos.add(getAddCommentEmailSenderMono(user, comment, originHeader, application, pagename)); emailMonos.add(getAddCommentEmailSenderMono(user, comment, originHeader, application, pagename));
} }

View File

@ -11,7 +11,7 @@ import com.appsmith.server.domains.User;
import com.appsmith.server.domains.UserRole; import com.appsmith.server.domains.UserRole;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.UpdatePermissionGroupDTO; import com.appsmith.server.dtos.UpdatePermissionGroupDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.helpers.PolicyUtils; import com.appsmith.server.helpers.PolicyUtils;
import com.appsmith.server.repositories.ApplicationRepository; import com.appsmith.server.repositories.ApplicationRepository;
@ -162,7 +162,7 @@ public class UserWorkspaceServiceTest {
Set<String> uniqueUsersInWorkspaceBefore = userWorkspaceService.getWorkspaceMembers(workspace.getId()) Set<String> uniqueUsersInWorkspaceBefore = userWorkspaceService.getWorkspaceMembers(workspace.getId())
.flatMapMany(workspaceMembers -> Flux.fromIterable(workspaceMembers)) .flatMapMany(workspaceMembers -> Flux.fromIterable(workspaceMembers))
.map(UserAndPermissionGroupDTO::getUserId) .map(WorkspaceMemberInfoDTO::getUserId)
.collect(Collectors.toSet()) .collect(Collectors.toSet())
.block(); .block();
@ -245,7 +245,7 @@ public class UserWorkspaceServiceTest {
updatePermissionGroupDTO.setNewPermissionGroupId(developerPermissionGroup.getId()); updatePermissionGroupDTO.setNewPermissionGroupId(developerPermissionGroup.getId());
String origin = "http://random-origin.test"; String origin = "http://random-origin.test";
Mono<UserAndPermissionGroupDTO> updateUserRoleMono = userWorkspaceService.updatePermissionGroupForMember(workspace.getId(), updatePermissionGroupDTO, origin); Mono<WorkspaceMemberInfoDTO> updateUserRoleMono = userWorkspaceService.updatePermissionGroupForMember(workspace.getId(), updatePermissionGroupDTO, origin);
StepVerifier.create(updateUserRoleMono).expectErrorMessage( StepVerifier.create(updateUserRoleMono).expectErrorMessage(
AppsmithError.REMOVE_LAST_WORKSPACE_ADMIN_ERROR.getMessage() AppsmithError.REMOVE_LAST_WORKSPACE_ADMIN_ERROR.getMessage()
@ -285,7 +285,7 @@ public class UserWorkspaceServiceTest {
updatePermissionGroupDTO.setNewPermissionGroupId(developerPermissionGroup.getId()); updatePermissionGroupDTO.setNewPermissionGroupId(developerPermissionGroup.getId());
String origin = "http://random-origin.test"; String origin = "http://random-origin.test";
Mono<UserAndPermissionGroupDTO> updateUserRoleMono = userWorkspaceService.updatePermissionGroupForMember(workspace.getId(), updatePermissionGroupDTO, origin); Mono<WorkspaceMemberInfoDTO> updateUserRoleMono = userWorkspaceService.updatePermissionGroupForMember(workspace.getId(), updatePermissionGroupDTO, origin);
StepVerifier.create(updateUserRoleMono) StepVerifier.create(updateUserRoleMono)
.assertNext(userRole1 -> { .assertNext(userRole1 -> {

View File

@ -6,7 +6,7 @@ import com.appsmith.server.constants.FieldName;
import com.appsmith.server.domains.PermissionGroup; import com.appsmith.server.domains.PermissionGroup;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.PermissionGroupInfoDTO; import com.appsmith.server.dtos.PermissionGroupInfoDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.helpers.PolicyUtils; import com.appsmith.server.helpers.PolicyUtils;
import com.appsmith.server.notifications.EmailSender; import com.appsmith.server.notifications.EmailSender;
@ -127,7 +127,7 @@ public class UserWorkspaceServiceUnitTest {
Mockito.when(userRepository.findAllById(ArgumentMatchers.<Iterable<String>>any())) Mockito.when(userRepository.findAllById(ArgumentMatchers.<Iterable<String>>any()))
.thenReturn(Flux.empty()); .thenReturn(Flux.empty());
Mono<List<UserAndPermissionGroupDTO>> workspaceMembers = userWorkspaceService.getWorkspaceMembers(testWorkspace.getId()); Mono<List<WorkspaceMemberInfoDTO>> workspaceMembers = userWorkspaceService.getWorkspaceMembers(testWorkspace.getId());
StepVerifier StepVerifier
.create(workspaceMembers) .create(workspaceMembers)
.assertNext(userAndGroupDTOs -> { .assertNext(userAndGroupDTOs -> {
@ -147,7 +147,7 @@ public class UserWorkspaceServiceUnitTest {
Mockito.when(userRepository.findAllById(ArgumentMatchers.<Iterable<String>>any())) Mockito.when(userRepository.findAllById(ArgumentMatchers.<Iterable<String>>any()))
.thenReturn(Flux.empty()); .thenReturn(Flux.empty());
Mono<List<UserAndPermissionGroupDTO>> workspaceMembers = userWorkspaceService.getWorkspaceMembers(sampleWorkspaceId); Mono<List<WorkspaceMemberInfoDTO>> workspaceMembers = userWorkspaceService.getWorkspaceMembers(sampleWorkspaceId);
StepVerifier StepVerifier
.create(workspaceMembers) .create(workspaceMembers)
.expectErrorMessage(AppsmithError.NO_RESOURCE_FOUND.getMessage(FieldName.WORKSPACE, sampleWorkspaceId)) .expectErrorMessage(AppsmithError.NO_RESOURCE_FOUND.getMessage(FieldName.WORKSPACE, sampleWorkspaceId))

View File

@ -15,7 +15,7 @@ import com.appsmith.server.domains.User;
import com.appsmith.server.domains.Workspace; import com.appsmith.server.domains.Workspace;
import com.appsmith.server.dtos.InviteUsersDTO; import com.appsmith.server.dtos.InviteUsersDTO;
import com.appsmith.server.dtos.PermissionGroupInfoDTO; import com.appsmith.server.dtos.PermissionGroupInfoDTO;
import com.appsmith.server.dtos.UserAndPermissionGroupDTO; import com.appsmith.server.dtos.WorkspaceMemberInfoDTO;
import com.appsmith.server.exceptions.AppsmithError; import com.appsmith.server.exceptions.AppsmithError;
import com.appsmith.server.exceptions.AppsmithException; import com.appsmith.server.exceptions.AppsmithException;
import com.appsmith.server.helpers.TextUtils; import com.appsmith.server.helpers.TextUtils;
@ -751,7 +751,7 @@ public class WorkspaceServiceTest {
inviteUsersDTO.setPermissionGroupId(viewerPermissionGroupId); inviteUsersDTO.setPermissionGroupId(viewerPermissionGroupId);
userAndAccessManagementService.inviteUsers(inviteUsersDTO, origin).block(); userAndAccessManagementService.inviteUsers(inviteUsersDTO, origin).block();
Mono<List<UserAndPermissionGroupDTO>> usersMono = userWorkspaceService.getWorkspaceMembers(createdWorkspace.getId()); Mono<List<WorkspaceMemberInfoDTO>> usersMono = userWorkspaceService.getWorkspaceMembers(createdWorkspace.getId());
StepVerifier StepVerifier
.create(usersMono) .create(usersMono)
@ -759,7 +759,7 @@ public class WorkspaceServiceTest {
assertThat(users).isNotNull(); assertThat(users).isNotNull();
assertThat(users.size()).isEqualTo(6); assertThat(users.size()).isEqualTo(6);
// Assert that the members are sorted by the permission group and then email // Assert that the members are sorted by the permission group and then email
UserAndPermissionGroupDTO userAndGroupDTO = users.get(0); WorkspaceMemberInfoDTO userAndGroupDTO = users.get(0);
assertThat(userAndGroupDTO.getUsername()).isEqualTo("api_user"); assertThat(userAndGroupDTO.getUsername()).isEqualTo("api_user");
assertThat(userAndGroupDTO.getPermissionGroupName()).startsWith(ADMINISTRATOR); assertThat(userAndGroupDTO.getPermissionGroupName()).startsWith(ADMINISTRATOR);
userAndGroupDTO = users.get(1); userAndGroupDTO = users.get(1);