| @@ -37,242 +37,242 @@ import com.ffii.fpsms.modules.user.service.pojo.UserRecord; | |||||
| @Service | @Service | ||||
| public class UserService extends AbstractBaseEntityService<User, Long, UserRepository> { | public class UserService extends AbstractBaseEntityService<User, Long, UserRepository> { | ||||
| private static final String USER_AUTH_SQL = "SELECT a.authority" | |||||
| + " FROM `user` u" | |||||
| + " JOIN user_authority ua ON ua.userId = u.id" | |||||
| + " JOIN authority a ON a.id = ua.authId" | |||||
| + " WHERE u.deleted = 0" | |||||
| + " AND u.id = :userId"; | |||||
| private static final String UNION_SQL = " UNION "; | |||||
| private static final String GROUP_AUTH_SQL = "SELECT a.authority" | |||||
| + " FROM `user` u" | |||||
| + " JOIN user_group ug ON ug.userId = u.id" | |||||
| + " JOIN `group` g ON g.deleted = 0 AND g.id = ug.groupId" | |||||
| + " JOIN group_authority ga ON ga.groupId = g.id" | |||||
| + " JOIN authority a ON a.id = ga.authId" | |||||
| + " WHERE u.deleted = 0" | |||||
| + " AND u.id = :userId"; | |||||
| @Autowired | |||||
| private SettingsService settingsService; | |||||
| @Autowired | |||||
| private PasswordEncoder passwordEncoder; | |||||
| @Autowired | |||||
| UserRepository userRepository; | |||||
| public UserService(JdbcDao jdbcDao, UserRepository userRepository) { | |||||
| super(jdbcDao, userRepository); | |||||
| } | |||||
| public Optional<User> loadUserOptByUsername(String username) { | |||||
| return findByUsername(username) | |||||
| .map(user -> { | |||||
| Set<GrantedAuthority> auths = new LinkedHashSet<GrantedAuthority>(); | |||||
| auths.add(new SimpleGrantedAuthority("ROLE_USER")); | |||||
| jdbcDao.queryForList(USER_AUTH_SQL + UNION_SQL + GROUP_AUTH_SQL, Map.of("userId", user.getId())) | |||||
| .forEach(item -> auths.add(new SimpleGrantedAuthority((String) item.get("authority")))); | |||||
| user.setAuthorities(auths); | |||||
| return user; | |||||
| }); | |||||
| } | |||||
| public User getUserById(Long id) { | |||||
| User user = userRepository.findById(id).orElseThrow(); | |||||
| Set<GrantedAuthority> auths = new LinkedHashSet<GrantedAuthority>(); | |||||
| auths.add(new SimpleGrantedAuthority("ROLE_USER")); | |||||
| jdbcDao.queryForList(USER_AUTH_SQL + UNION_SQL + GROUP_AUTH_SQL, Map.of("userId", user.getId())) | |||||
| .forEach(item -> auths.add(new SimpleGrantedAuthority((String) item.get("authority")))); | |||||
| user.setAuthorities(auths); | |||||
| return user; | |||||
| } | |||||
| public Optional<User> findByUsername(String username) { | |||||
| return userRepository.findByUsernameAndDeletedFalse(username); | |||||
| } | |||||
| // @Transactional(rollbackFor = Exception.class) | |||||
| public List<UserRecord> search(SearchUserReq req) { | |||||
| StringBuilder sql = new StringBuilder("SELECT" | |||||
| + " u.id," | |||||
| + " u.created," | |||||
| + " u.createdBy," | |||||
| + " u.version," | |||||
| + " u.modified," | |||||
| + " u.modifiedBy," | |||||
| + " u.username," | |||||
| + " u.locked," | |||||
| + " u.name," | |||||
| + " u.locale," | |||||
| + " u.firstname," | |||||
| + " u.lastname," | |||||
| + " u.title," | |||||
| + " u.department," | |||||
| + " u.email," | |||||
| + " u.phone1," | |||||
| + " u.phone2," | |||||
| + " u.remarks," | |||||
| private static final String USER_AUTH_SQL = "SELECT a.authority" | |||||
| + " FROM `user` u" | |||||
| + " JOIN user_authority ua ON ua.userId = u.id" | |||||
| + " JOIN authority a ON a.id = ua.authId" | |||||
| + " WHERE u.deleted = 0" | |||||
| + " AND u.id = :userId"; | |||||
| private static final String UNION_SQL = " UNION "; | |||||
| private static final String GROUP_AUTH_SQL = "SELECT a.authority" | |||||
| + " FROM `user` u" | |||||
| + " JOIN user_group ug ON ug.userId = u.id" | |||||
| + " JOIN `group` g ON g.deleted = 0 AND g.id = ug.groupId" | |||||
| + " JOIN group_authority ga ON ga.groupId = g.id" | |||||
| + " JOIN authority a ON a.id = ga.authId" | |||||
| + " WHERE u.deleted = 0" | |||||
| + " AND u.id = :userId"; | |||||
| @Autowired | |||||
| private SettingsService settingsService; | |||||
| @Autowired | |||||
| private PasswordEncoder passwordEncoder; | |||||
| @Autowired | |||||
| UserRepository userRepository; | |||||
| public UserService(JdbcDao jdbcDao, UserRepository userRepository) { | |||||
| super(jdbcDao, userRepository); | |||||
| } | |||||
| public Optional<User> loadUserOptByUsername(String username) { | |||||
| return findByUsername(username) | |||||
| .map(user -> { | |||||
| Set<GrantedAuthority> auths = new LinkedHashSet<GrantedAuthority>(); | |||||
| auths.add(new SimpleGrantedAuthority("ROLE_USER")); | |||||
| jdbcDao.queryForList(USER_AUTH_SQL + UNION_SQL + GROUP_AUTH_SQL, Map.of("userId", user.getId())) | |||||
| .forEach(item -> auths.add(new SimpleGrantedAuthority((String) item.get("authority")))); | |||||
| user.setAuthorities(auths); | |||||
| return user; | |||||
| }); | |||||
| } | |||||
| public User getUserById(Long id) { | |||||
| User user = userRepository.findById(id).orElseThrow(); | |||||
| Set<GrantedAuthority> auths = new LinkedHashSet<GrantedAuthority>(); | |||||
| auths.add(new SimpleGrantedAuthority("ROLE_USER")); | |||||
| jdbcDao.queryForList(USER_AUTH_SQL + UNION_SQL + GROUP_AUTH_SQL, Map.of("userId", user.getId())) | |||||
| .forEach(item -> auths.add(new SimpleGrantedAuthority((String) item.get("authority")))); | |||||
| user.setAuthorities(auths); | |||||
| return user; | |||||
| } | |||||
| public Optional<User> findByUsername(String username) { | |||||
| return userRepository.findByUsernameAndDeletedFalse(username); | |||||
| } | |||||
| // @Transactional(rollbackFor = Exception.class) | |||||
| public List<UserRecord> search(SearchUserReq req) { | |||||
| StringBuilder sql = new StringBuilder("SELECT" | |||||
| + " u.id," | |||||
| + " u.created," | |||||
| + " u.createdBy," | |||||
| + " u.version," | |||||
| + " u.modified," | |||||
| + " u.modifiedBy," | |||||
| + " u.username," | |||||
| + " u.locked," | |||||
| + " u.name," | |||||
| + " u.locale," | |||||
| + " u.firstname," | |||||
| + " u.lastname," | |||||
| + " u.title," | |||||
| + " u.department," | |||||
| + " u.email," | |||||
| + " u.phone1," | |||||
| + " u.phone2," | |||||
| + " u.remarks," | |||||
| + " u.staffNo" | + " u.staffNo" | ||||
| + " FROM `user` u" | |||||
| + " left join user_group ug on u.id = ug.userId" | |||||
| + " where u.deleted = false"); | |||||
| if (req != null) { | |||||
| if (req.getId() != null) | |||||
| sql.append(" AND u.id = :id"); | |||||
| if (req.getGroupId() != null) | |||||
| sql.append(" AND ug.groupId = :groupId"); | |||||
| if (StringUtils.isNotBlank(req.getUsername())) { | |||||
| req.setUsername("%" + req.getUsername() + "%"); | |||||
| sql.append(" AND u.username LIKE :username"); | |||||
| } | |||||
| if (StringUtils.isNotBlank(req.getName())) { | |||||
| req.setName("%" + req.getName() + "%"); | |||||
| sql.append(" AND u.name LIKE :name"); | |||||
| } | |||||
| if (req.getLocked() != null) { | |||||
| sql.append(" AND u.locked = :locked"); | |||||
| } | |||||
| } | |||||
| sql.append(" ORDER BY u.name"); | |||||
| if (req != null) { | |||||
| if (req.getStart() != null && req.getLimit() != null) | |||||
| sql.append(" LIMIT :start, :limit"); | |||||
| } | |||||
| return jdbcDao.queryForList(sql.toString(), req, UserRecord.class); | |||||
| } | |||||
| public List<Integer> listUserAuthId(long id) { | |||||
| return jdbcDao.queryForInts( | |||||
| "SELECT" | |||||
| + " ua.authId" | |||||
| + " FROM user_authority ua" | |||||
| + " WHERE ua.userId = :id", | |||||
| Map.of(Params.ID, id)); | |||||
| } | |||||
| public List<Integer> listUserGroupId(long id) { | |||||
| return jdbcDao.queryForInts( | |||||
| "SELECT" | |||||
| + " gu.groupId" | |||||
| + " FROM user_group gu" | |||||
| + " INNER JOIN `group` g ON g.deleted = FALSE AND g.id = gu.groupId" | |||||
| + " WHERE gu.userId = :id", | |||||
| Map.of(Params.ID, id)); | |||||
| } | |||||
| private User saveOrUpdate(User instance, UpdateUserReq req) { | |||||
| if (instance.getId() == null){ | |||||
| req.setLocked(false); | |||||
| } | |||||
| req.setName(instance.getName()); | |||||
| BeanUtils.copyProperties(req,instance); | |||||
| instance = save(instance); | |||||
| long id = instance.getId(); | |||||
| List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| if (!authBatchDeleteValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "DELETE FROM user_authority" | |||||
| + " WHERE userId = :userId ", | |||||
| + " FROM `user` u" | |||||
| + " left join user_group ug on u.id = ug.userId" | |||||
| + " where u.deleted = false"); | |||||
| if (req != null) { | |||||
| if (req.getId() != null) | |||||
| sql.append(" AND u.id = :id"); | |||||
| if (req.getGroupId() != null) | |||||
| sql.append(" AND ug.groupId = :groupId"); | |||||
| if (StringUtils.isNotBlank(req.getUsername())) { | |||||
| req.setUsername("%" + req.getUsername() + "%"); | |||||
| sql.append(" AND u.username LIKE :username"); | |||||
| } | |||||
| if (StringUtils.isNotBlank(req.getName())) { | |||||
| req.setName("%" + req.getName() + "%"); | |||||
| sql.append(" AND u.name LIKE :name"); | |||||
| } | |||||
| if (req.getLocked() != null) { | |||||
| sql.append(" AND u.locked = :locked"); | |||||
| } | |||||
| } | |||||
| sql.append(" ORDER BY u.name"); | |||||
| if (req != null) { | |||||
| if (req.getStart() != null && req.getLimit() != null) | |||||
| sql.append(" LIMIT :start, :limit"); | |||||
| } | |||||
| return jdbcDao.queryForList(sql.toString(), req, UserRecord.class); | |||||
| } | |||||
| public List<Integer> listUserAuthId(long id) { | |||||
| return jdbcDao.queryForInts( | |||||
| "SELECT" | |||||
| + " ua.authId" | |||||
| + " FROM user_authority ua" | |||||
| + " WHERE ua.userId = :id", | |||||
| Map.of(Params.ID, id)); | |||||
| } | |||||
| public List<Integer> listUserGroupId(long id) { | |||||
| return jdbcDao.queryForInts( | |||||
| "SELECT" | |||||
| + " gu.groupId" | |||||
| + " FROM user_group gu" | |||||
| + " INNER JOIN `group` g ON g.deleted = FALSE AND g.id = gu.groupId" | |||||
| + " WHERE gu.userId = :id", | |||||
| Map.of(Params.ID, id)); | |||||
| } | |||||
| private User saveOrUpdate(User instance, UpdateUserReq req) { | |||||
| if (instance.getId() == null){ | |||||
| req.setLocked(false); | |||||
| } | |||||
| // Removed: req.setName(instance.getName()); - This was overwriting the new name with the old one | |||||
| BeanUtils.copyProperties(req,instance); | |||||
| instance = save(instance); | |||||
| long id = instance.getId(); | |||||
| List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| if (!authBatchDeleteValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "DELETE FROM user_authority" | |||||
| + " WHERE userId = :userId ", | |||||
| // + "AND authId = :authId", | // + "AND authId = :authId", | ||||
| authBatchDeleteValues); | |||||
| } | |||||
| if (!authBatchInsertValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "INSERT IGNORE INTO user_authority (userId, authId)" | |||||
| + " VALUES (:userId, :authId)", | |||||
| authBatchInsertValues); | |||||
| } | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public User newRecord(NewUserReq req) throws UnsupportedEncodingException { | |||||
| if (findByUsername(req.getUsername()).isPresent()) { | |||||
| throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | |||||
| } | |||||
| System.out.println("Start Save"); | |||||
| String password = req.getPassword(); | |||||
| String pwdHash = passwordEncoder.encode(password); | |||||
| User instance = new User(); | |||||
| instance.setPassword(pwdHash); | |||||
| instance.setUsername(req.getUsername()); | |||||
| instance.setName(req.getUsername()); | |||||
| instance = save(instance); | |||||
| long id = instance.getId(); | |||||
| List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| if (!authBatchDeleteValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "DELETE FROM user_authority" | |||||
| + " WHERE userId = :userId ", | |||||
| authBatchDeleteValues); | |||||
| } | |||||
| if (!authBatchInsertValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "INSERT IGNORE INTO user_authority (userId, authId)" | |||||
| + " VALUES (:userId, :authId)", | |||||
| authBatchInsertValues); | |||||
| } | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public User newRecord(NewUserReq req) throws UnsupportedEncodingException { | |||||
| if (findByUsername(req.getUsername()).isPresent()) { | |||||
| throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | |||||
| } | |||||
| System.out.println("Start Save"); | |||||
| String password = req.getPassword(); | |||||
| String pwdHash = passwordEncoder.encode(password); | |||||
| User instance = new User(); | |||||
| instance.setPassword(pwdHash); | |||||
| instance.setUsername(req.getUsername()); | |||||
| instance.setName(req.getUsername()); | |||||
| instance = save(instance); | |||||
| long id = instance.getId(); | |||||
| List<Map<String, Integer>> authBatchInsertValues = req.getAddAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| List<Map<String, Integer>> authBatchDeleteValues = req.getRemoveAuthIds().stream() | |||||
| .map(authId -> Map.of("userId", (int)id, "authId", authId)) | |||||
| .collect(Collectors.toList()); | |||||
| if (!authBatchDeleteValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "DELETE FROM user_authority" | |||||
| + " WHERE userId = :userId ", | |||||
| // + "AND authId = :authId", | // + "AND authId = :authId", | ||||
| authBatchDeleteValues); | |||||
| } | |||||
| if (!authBatchInsertValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "INSERT IGNORE INTO user_authority (userId, authId)" | |||||
| + " VALUES (:userId, :authId)", | |||||
| authBatchInsertValues); | |||||
| } | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public User newPublicUserRecord(NewPublicUserReq req) throws UnsupportedEncodingException { | |||||
| if (findByUsername(req.getUsername()).isPresent()) { | |||||
| throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | |||||
| } | |||||
| String submitedPassword = req.getPassword(); | |||||
| String pwdHash = passwordEncoder.encode(submitedPassword); | |||||
| req.setPassword(pwdHash); | |||||
| User instance = new User(); | |||||
| instance = saveOrUpdate(instance, req); | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public void updateRecord(long id, UpdateUserReq req) { | |||||
| saveOrUpdate( | |||||
| find(id).orElseThrow(NotFoundException::new), | |||||
| req); | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public String resetPassword(long id) throws UnsupportedEncodingException { | |||||
| User instance = find(id).orElseThrow(NotFoundException::new); | |||||
| String randomPassword = PasswordUtils.genPwd(new PasswordRule(settingsService)); | |||||
| instance.setPassword(passwordEncoder.encode(randomPassword)); | |||||
| instance = save(instance); | |||||
| return randomPassword; | |||||
| } | |||||
| public List<UserCombo> getEscalationCombo() { | |||||
| return userRepository.findUserComboByTitleNotNullAndDepartmentNotNullAndNameNotNullAndDeletedFalse(); | |||||
| } | |||||
| } | |||||
| authBatchDeleteValues); | |||||
| } | |||||
| if (!authBatchInsertValues.isEmpty()) { | |||||
| jdbcDao.batchUpdate( | |||||
| "INSERT IGNORE INTO user_authority (userId, authId)" | |||||
| + " VALUES (:userId, :authId)", | |||||
| authBatchInsertValues); | |||||
| } | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public User newPublicUserRecord(NewPublicUserReq req) throws UnsupportedEncodingException { | |||||
| if (findByUsername(req.getUsername()).isPresent()) { | |||||
| throw new UnprocessableEntityException(ErrorCodes.USERNAME_NOT_AVAILABLE); | |||||
| } | |||||
| String submitedPassword = req.getPassword(); | |||||
| String pwdHash = passwordEncoder.encode(submitedPassword); | |||||
| req.setPassword(pwdHash); | |||||
| User instance = new User(); | |||||
| instance = saveOrUpdate(instance, req); | |||||
| return instance; | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public void updateRecord(long id, UpdateUserReq req) { | |||||
| saveOrUpdate( | |||||
| find(id).orElseThrow(NotFoundException::new), | |||||
| req); | |||||
| } | |||||
| @Transactional(rollbackFor = Exception.class) | |||||
| public String resetPassword(long id) throws UnsupportedEncodingException { | |||||
| User instance = find(id).orElseThrow(NotFoundException::new); | |||||
| String randomPassword = PasswordUtils.genPwd(new PasswordRule(settingsService)); | |||||
| instance.setPassword(passwordEncoder.encode(randomPassword)); | |||||
| instance = save(instance); | |||||
| return randomPassword; | |||||
| } | |||||
| public List<UserCombo> getEscalationCombo() { | |||||
| return userRepository.findUserComboByTitleNotNullAndDepartmentNotNullAndNameNotNullAndDeletedFalse(); | |||||
| } | |||||
| } | |||||