Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
haiphucnguyen committed Dec 20, 2024
1 parent c6e70b7 commit b1069c6
Show file tree
Hide file tree
Showing 6 changed files with 151 additions and 1 deletion.
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -146,6 +146,10 @@ DEBUG 35926 --- [ restartedMain] io.flowinquiry.FlowInquiryApp.logStarting:54 :
INFO 35926 --- [ restartedMain] io.flowinquiry.FlowInquiryApp.logStartupProfileInfo:658 : The following 1 profile is active: "dev"
DEBUG 35926 --- [ restartedMain] io.flowinquiry.config.WebConfigurer.corsFilter:88 : Registering CORS filter
```
## Deploy FlowInquiry
To ensure a smooth deployment process, we provide detailed guidelines for deploying FlowInquiry in various environments. These instructions cover setup steps, configuration details, and best practices for deploying the service effectively. You can find the deployment documentation [here](https://docs.flowinquiry.io/developer_guides/deployment)
## Related Information
- [FlowInquiry document](https://docs.flowinquiry.io): The centralized document for FlowInquiry products
- [FlowInquiry Server](https://github.com/flowinquiry/flowinquiry-server): Back-end services for FlowInquiry.
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package io.flowinquiry.modules.usermanagement.repository;

import io.flowinquiry.modules.usermanagement.domain.User;
import io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -78,4 +79,51 @@ WHERE ua.authority_name IS NOT NULL OR EXISTS (
""",
nativeQuery = true)
List<Object[]> findResourcesWithHighestPermissionsByUserId(@Param("userId") Long userId);

@Query(
"""
SELECT new io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO(
u.id,
CONCAT(u.firstName, ' ', u.lastName),
u.imageUrl,
null,
null,
null
)
FROM User u
WHERE u.manager IS NULL
""")
List<UserHierarchyDTO> findAllTopLevelUsers();

@Query(
"""
SELECT new io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO(
u.id,
CONCAT(u.firstName, ' ', u.lastName),
u.imageUrl,
m.id,
CONCAT(m.firstName, ' ', m.lastName),
m.imageUrl
)
FROM User u
LEFT JOIN u.manager m
WHERE u.id = :userId
""")
Optional<UserHierarchyDTO> findUserHierarchyById(@Param("userId") Long userId);

@Query(
"""
SELECT new io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO(
u.id,
CONCAT(u.firstName, ' ', u.lastName),
u.imageUrl,
m.id,
CONCAT(m.firstName, ' ', m.lastName),
m.imageUrl
)
FROM User u
LEFT JOIN u.manager m
WHERE m.id = :userId
""")
List<UserHierarchyDTO> findAllSubordinates(@Param("userId") Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@
import io.flowinquiry.modules.usermanagement.repository.UserRepository;
import io.flowinquiry.modules.usermanagement.service.dto.ResourcePermissionDTO;
import io.flowinquiry.modules.usermanagement.service.dto.UserDTO;
import io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO;
import io.flowinquiry.modules.usermanagement.service.dto.UserKey;
import io.flowinquiry.modules.usermanagement.service.event.DeleteUserEvent;
import io.flowinquiry.modules.usermanagement.service.mapper.UserMapper;
import io.flowinquiry.query.QueryDTO;
import io.flowinquiry.security.Constants;
import io.flowinquiry.security.SecurityUtils;
import jakarta.persistence.EntityNotFoundException;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.*;
Expand Down Expand Up @@ -326,4 +328,50 @@ public List<UserDTO> getDirectReports(Long managerId) {
List<User> directReports = userRepository.findByManagerId(managerId);
return directReports.stream().map(userMapper::toDto).collect(Collectors.toList());
}

public UserHierarchyDTO getOrgChart() {
List<UserHierarchyDTO> topLevelUsers = userRepository.findAllTopLevelUsers();

if (topLevelUsers.size() > 1) {
UserHierarchyDTO dummyRoot = new UserHierarchyDTO();
dummyRoot.setId(-1L);
dummyRoot.setName("");
dummyRoot.setImageUrl(null);
dummyRoot.setManagerId(null);
dummyRoot.setManagerName(null);
dummyRoot.setManagerImageUrl(null);
dummyRoot.setSubordinates(topLevelUsers);
return dummyRoot;
}

// Handle case with a single top-level user
if (!topLevelUsers.isEmpty()) {
UserHierarchyDTO rootUser = topLevelUsers.getFirst();
List<UserHierarchyDTO> subordinates =
userRepository.findAllSubordinates(rootUser.getId());
rootUser.setSubordinates(subordinates);
return rootUser;
}

// Handle case with no users
return null;
}

public UserHierarchyDTO getUserHierarchyWithSubordinates(Long userId) {
// Fetch user hierarchy
UserHierarchyDTO userHierarchy =
userRepository
.findUserHierarchyById(userId)
.orElseThrow(
() ->
new EntityNotFoundException(
"User not found with id: " + userId));

// Fetch subordinates
List<UserHierarchyDTO> subordinates = userRepository.findAllSubordinates(userId);

userHierarchy.setSubordinates(subordinates);

return userHierarchy;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package io.flowinquiry.modules.usermanagement.service.dto;

import java.util.List;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

@Data
@NoArgsConstructor
public class UserHierarchyDTO {
private Long id;

private String name;

private String imageUrl;

private Long managerId;

private String managerName;

private String managerImageUrl;

@ToString.Exclude private List<UserHierarchyDTO> subordinates;

public UserHierarchyDTO(
Long id,
String name,
String imageUrl,
Long managerId,
String managerName,
String managerImageUrl) {
this.id = id;
this.name = name;
this.imageUrl = imageUrl;
this.managerId = managerId;
this.managerName = managerName;
this.managerImageUrl = managerImageUrl;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import io.flowinquiry.modules.usermanagement.service.UserService;
import io.flowinquiry.modules.usermanagement.service.dto.ResourcePermissionDTO;
import io.flowinquiry.modules.usermanagement.service.dto.UserDTO;
import io.flowinquiry.modules.usermanagement.service.dto.UserHierarchyDTO;
import io.flowinquiry.modules.usermanagement.web.rest.errors.BadRequestAlertException;
import io.flowinquiry.modules.usermanagement.web.rest.errors.EmailAlreadyUsedException;
import io.flowinquiry.platform.utils.Obfuscator;
Expand Down Expand Up @@ -203,4 +204,14 @@ public ResponseEntity<Void> deleteUser(@PathVariable("userId") Long userId) {
userService.softDeleteUserById(userId);
return ResponseEntity.noContent().build();
}

@GetMapping("/{userId}/hierarchy")
public ResponseEntity<UserHierarchyDTO> getUserHierarchy(@PathVariable Long userId) {
return ResponseEntity.ok(userService.getUserHierarchyWithSubordinates(userId));
}

@GetMapping("/orgChart")
public ResponseEntity<UserHierarchyDTO> getOrgChart() {
return ResponseEntity.ok(userService.getOrgChart());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ void createUserWithExistingEmail() throws Exception {
userDTO.setLastName(DEFAULT_LASTNAME);
userDTO.setEmail(DEFAULT_EMAIL); // this email should already be used
userDTO.setStatus(UserStatus.ACTIVE);
;

userDTO.setImageUrl(DEFAULT_IMAGEURL);
userDTO.setLangKey(DEFAULT_LANGKEY);
userDTO.setAuthorities(Set.of(AuthoritiesConstants.USER));
Expand Down

0 comments on commit b1069c6

Please sign in to comment.