Skip to content

Commit

Permalink
Fixed: Select only distinct users in fetchUsers
Browse files Browse the repository at this point in the history
  • Loading branch information
djuarezgf committed Feb 23, 2024
1 parent 030dc85 commit 6b56519
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 12 deletions.
3 changes: 1 addition & 2 deletions src/main/java/de/samply/app/ProjectManagerController.java
Original file line number Diff line number Diff line change
Expand Up @@ -902,12 +902,11 @@ public ResponseEntity<Resource> fetchAllRegisteredBridgeheads() {
@FrontendAction(action = ProjectManagerConst.FETCH_USERS_FOR_AUTOCOMPLETE_ACTION)
@GetMapping(value = ProjectManagerConst.FETCH_USERS_FOR_AUTOCOMPLETE)
public ResponseEntity<String> fetchUsersForAutocomplete(
// Project Code Required for state constraints
@ProjectCode @RequestParam(name = ProjectManagerConst.PROJECT_CODE) String projectCode,
@Bridgehead @RequestParam(name = ProjectManagerConst.BRIDGEHEAD) String bridgehead,
@RequestParam(name = ProjectManagerConst.PARTIAL_EMAIL) String partialEmail
) {
return convertToResponseEntity(() -> this.userService.fetchUsersForAutocomplete(partialEmail, bridgehead));
return convertToResponseEntity(() -> this.userService.fetchUsersForAutocomplete(projectCode, partialEmail, bridgehead));
}

@RoleConstraints(organisationRoles = {OrganisationRole.PROJECT_MANAGER_ADMIN})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,14 @@ public interface ProjectBridgeheadUserRepository extends JpaRepository<ProjectBr
@Query("SELECT DISTINCT pbu FROM ProjectBridgeheadUser pbu WHERE pbu.projectBridgehead.project.type = :projectType AND pbu.projectBridgehead.project.state NOT IN :projectStates")
List<ProjectBridgeheadUser> getByProjectTypeAndNotProjectState(ProjectType projectType, Set<ProjectState> projectStates);

List<ProjectBridgeheadUser> getByEmailContainingAndProjectBridgehead_Bridgehead(String email, String bridgehead);
@Query("SELECT DISTINCT pbu FROM ProjectBridgeheadUser pbu WHERE pbu.email LIKE %:email% AND pbu.projectBridgehead.bridgehead = :bridgehead AND (" +
"(pbu.projectBridgehead.project.code = :projectCode AND pbu.projectBridgehead.project.state = 'DEVELOP' AND pbu.projectRole = 'DEVELOPER') OR " +
"(pbu.projectBridgehead.project.code = :projectCode AND pbu.projectBridgehead.project.state = 'PILOT' AND pbu.projectRole = 'PILOT') OR" +
"(pbu.projectBridgehead.project.code = :projectCode AND pbu.projectBridgehead.project.state = 'FINAL' AND pbu.projectRole = 'FINAL'))")
List<ProjectBridgeheadUser> getDistinctByEmailContainingAndProjectBridgehead_BridgeheadAndUserAlreadySetForThisProjectInThisRole(String email, String bridgehead, String projectCode);

List<ProjectBridgeheadUser> getByProjectRoleAndProjectBridgehead(ProjectRole role, ProjectBridgehead projectBridgehead);
List<ProjectBridgeheadUser> getDistinctByEmailContainingAndProjectBridgehead_Bridgehead(String email, String bridgehead);

List<ProjectBridgeheadUser> getDistinctByProjectRoleAndProjectBridgehead(ProjectRole role, ProjectBridgehead projectBridgehead);

}
20 changes: 12 additions & 8 deletions src/main/java/de/samply/user/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,9 @@

import java.time.Instant;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

@Service
public class UserService {
Expand Down Expand Up @@ -137,21 +138,24 @@ private void changeProjectState(@NotNull String projectCode, @NotNull String bri
"Set project bridgehead user evaluation to " + state, null, null);
}

public List<User> fetchUsersForAutocomplete(@NotNull String partialEmail, @NotNull String bridgehead) {
return projectBridgeheadUserRepository.getByEmailContainingAndProjectBridgehead_Bridgehead(partialEmail, bridgehead).stream().map(DtoFactory::convert).toList();
public Set<User> fetchUsersForAutocomplete(@NotNull String projectCode, @NotNull String partialEmail, @NotNull String bridgehead) {
Set<User> allUsers = projectBridgeheadUserRepository.getDistinctByEmailContainingAndProjectBridgehead_Bridgehead(partialEmail, bridgehead).stream().map(DtoFactory::convert).collect(Collectors.toSet());
Set<User> alreadySetUsers = projectBridgeheadUserRepository.getDistinctByEmailContainingAndProjectBridgehead_BridgeheadAndUserAlreadySetForThisProjectInThisRole(partialEmail, bridgehead, projectCode).stream().map(DtoFactory::convert).collect(Collectors.toSet());
allUsers.removeAll(alreadySetUsers);
return allUsers;
}

public List<User> fetchProjectUsers(@NotNull String projectCode, @NotNull String bridgehead) throws UserServiceException {
public Set<User> fetchProjectUsers(@NotNull String projectCode, @NotNull String bridgehead) throws UserServiceException {
ProjectBridgehead projectBridgehead = fetchProjectBridgehead(projectCode, bridgehead);
return (switch (projectBridgehead.getProject().getState()) {
case DEVELOP ->
this.projectBridgeheadUserRepository.getByProjectRoleAndProjectBridgehead(ProjectRole.DEVELOPER, projectBridgehead);
this.projectBridgeheadUserRepository.getDistinctByProjectRoleAndProjectBridgehead(ProjectRole.DEVELOPER, projectBridgehead);
case PILOT ->
this.projectBridgeheadUserRepository.getByProjectRoleAndProjectBridgehead(ProjectRole.PILOT, projectBridgehead);
this.projectBridgeheadUserRepository.getDistinctByProjectRoleAndProjectBridgehead(ProjectRole.PILOT, projectBridgehead);
case FINAL ->
this.projectBridgeheadUserRepository.getByProjectRoleAndProjectBridgehead(ProjectRole.FINAL, projectBridgehead);
this.projectBridgeheadUserRepository.getDistinctByProjectRoleAndProjectBridgehead(ProjectRole.FINAL, projectBridgehead);
default -> new ArrayList<ProjectBridgeheadUser>();
}).stream().map(DtoFactory::convert).toList();
}).stream().map(DtoFactory::convert).collect(Collectors.toSet());
}

private ProjectBridgehead fetchProjectBridgehead(String projectCode, String bridgehead) throws UserServiceException {
Expand Down

0 comments on commit 6b56519

Please sign in to comment.