|
|
@@ -1,232 +1,155 @@
|
|
|
-//package seecoder.devcloud.web.service.impl.user;
|
|
|
-//
|
|
|
-//
|
|
|
-//import org.apache.commons.codec.digest.DigestUtils;
|
|
|
-//import org.gitlab4j.api.GitLabApiException;
|
|
|
-//import org.springframework.beans.BeanUtils;
|
|
|
-//import org.springframework.beans.factory.annotation.Autowired;
|
|
|
-//import org.springframework.data.domain.Page;
|
|
|
-//import org.springframework.data.domain.PageRequest;
|
|
|
-//import org.springframework.data.domain.Pageable;
|
|
|
-//import org.springframework.data.domain.Sort;
|
|
|
-//import org.springframework.stereotype.Service;
|
|
|
-//import org.springframework.transaction.annotation.Transactional;
|
|
|
-//import org.springframework.util.Assert;
|
|
|
-//import seecoder.devcloud.api.gitlab.GitlabApi;
|
|
|
-//import seecoder.devcloud.api.gitlab.model.GitlabUser;
|
|
|
-//import seecoder.devcloud.api.jenkins.JenkinsApi;
|
|
|
-//import seecoder.devcloud.common.exceptions.Asserts;
|
|
|
-//import seecoder.devcloud.common.exceptions.ServiceException;
|
|
|
-//import seecoder.devcloud.common.util.ToolKit;
|
|
|
-//import seecoder.devcloud.web.service.user.MailService;
|
|
|
-//
|
|
|
-//@Service
|
|
|
-//public class UserServiceImpl implements UserService {
|
|
|
-// private static final Sort PAGE_SORT = Sort.by(Sort.Direction.ASC, "id");
|
|
|
-//
|
|
|
-// private final UserDAO userDAO;
|
|
|
-// private final MailService mailService;
|
|
|
-// private final GitlabApi gitlabApi;
|
|
|
-// private final JenkinsApi jenkinsApi;
|
|
|
-//
|
|
|
-// @Autowired
|
|
|
-// public UserServiceImpl(UserDAO userDAO, MailService mailService, GitlabApi gitlabApi, JenkinsApi jenkinsApi) {
|
|
|
-// this.userDAO = userDAO;
|
|
|
-// this.mailService = mailService;
|
|
|
-// this.gitlabApi = gitlabApi;
|
|
|
-// this.jenkinsApi = jenkinsApi;
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// @Transactional
|
|
|
-// public UserVO create(UserDTO userDTO) throws ServiceException {
|
|
|
-// return register(userDTO.getUsername(), userDTO.getEmail(), null,userDTO.getNickname(), userDTO.getRole());
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// @Transactional
|
|
|
-// public User register(String username, String name, String email, String password, String phone, UserIdentity role, Integer pid) throws ServiceException {
|
|
|
-// User user = userDAO.findByUsername(username);
|
|
|
-// Asserts.isNull(user, "用户名已被使用!");
|
|
|
-// user = userDAO.findByEmail(email);
|
|
|
-// Asserts.isNull(user, "邮箱已被使用!");
|
|
|
-// String realPassword = password == null ? ToolKit.randomPassword() : password;
|
|
|
-// GitlabUser gitlabUser;
|
|
|
-// try {
|
|
|
-// gitlabUser = gitlabApi.createUser(username, email, realPassword);
|
|
|
-// } catch (GitLabApiException e) {
|
|
|
-// throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// user = new User();
|
|
|
-// BeanUtils.copyProperties(gitlabUser, user);
|
|
|
-// if(name!=null){
|
|
|
-// user.setNickname(name);
|
|
|
-// }
|
|
|
-//
|
|
|
-// user.setUsername(username);
|
|
|
-// user.setEmail(email);
|
|
|
-// user.setPassword(DigestUtils.sha256Hex(realPassword));
|
|
|
-// user.setPid(pid);
|
|
|
-// user.setPhone(phone);
|
|
|
-// user.setRole(role);
|
|
|
-// user = userDAO.save(user);
|
|
|
-// if (password == null) {
|
|
|
-// mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
|
|
|
-// }
|
|
|
-// return user;
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public Page<UserVO> retrievePage(int page, int limit, String search) {
|
|
|
-// Pageable pageable = PageRequest.of(page, limit, PAGE_SORT);
|
|
|
-// Page<User> pageResult;
|
|
|
-// if (search == null || search.isEmpty()) {
|
|
|
-// pageResult = userDAO.findAll(pageable);
|
|
|
-// } else {
|
|
|
-// pageResult = userDAO.findAllByUsernameLike("%" + search + "%", pageable);
|
|
|
-// }
|
|
|
-// return pageResult.map(UserVO::new);
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public UserVO retrieve(int userId) throws ServiceException {
|
|
|
-// User user = userDAO.findById(userId);
|
|
|
-// Asserts.notNull(user, "所选用户不存在");
|
|
|
-// return new UserVO(user);
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// @Transactional
|
|
|
-// public void delete(int userId) throws ServiceException {
|
|
|
-// User user = userDAO.findById(userId);
|
|
|
-// Assert.notNull(user, "找不到要删除的用户");
|
|
|
-// Assert.isTrue(user.getRole() == UserIdentity.STUDENT, "目标用户只能是学生");
|
|
|
-// try {
|
|
|
-// gitlabApi.deleteUser(userId);
|
|
|
-// } catch (Exception e) {
|
|
|
-// throw new ServiceException("删除GitLab用户时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// for (Result result : user.getResultSet()) {
|
|
|
-// if (!result.isDeleted()) {
|
|
|
-// try {
|
|
|
-// jenkinsApi.deleteJob(result.getId());
|
|
|
-// } catch (Exception e) {
|
|
|
-// throw new ServiceException("删除Jenkins项目时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// }
|
|
|
-// }
|
|
|
-// userDAO.delete(user);
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// @Transactional
|
|
|
-// public UserSerializer register(RegisterForm form) throws ServiceException {
|
|
|
-// return new UserSerializer(register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.STUDENT));
|
|
|
-// }
|
|
|
-// @Override
|
|
|
-// @Transactional
|
|
|
-// public UserSerializer registerTeacher(RegisterForm form) throws ServiceException {
|
|
|
-// return new UserSerializer(register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.TEACHER));
|
|
|
-// }
|
|
|
-// private UserVO register(String username, String email, String password, String nickname,UserIdentity role) throws ServiceException {
|
|
|
-// User user = userDAO.findByUsername(username);
|
|
|
-// Asserts.isNull(user, "用户名已被使用!");
|
|
|
-// user = userDAO.findByEmail(email);
|
|
|
-// Asserts.isNull(user, "邮箱已被使用!");
|
|
|
-// String realPassword = password == null ? ToolKit.randomPassword() : password;
|
|
|
-// GitlabUser gitlabUser;
|
|
|
-// try {
|
|
|
-// gitlabUser = gitlabApi.createUser(username, email, realPassword);
|
|
|
-// } catch (GitLabApiException e) {
|
|
|
-// throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// user = new User();
|
|
|
-// BeanUtils.copyProperties(gitlabUser, user);
|
|
|
-// if(nickname!=null){
|
|
|
-// user.setNickname(nickname);
|
|
|
-// }
|
|
|
-//
|
|
|
-// user.setUsername(username);
|
|
|
-// user.setEmail(email);
|
|
|
-// user.setPassword(DigestUtils.sha256Hex(realPassword));
|
|
|
-// user.setRole(role);
|
|
|
-// final UserVO userVO = new UserVO(userDAO.save(user));
|
|
|
-// if (password == null) {
|
|
|
-// mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
|
|
|
-// }
|
|
|
-// return userVO;
|
|
|
-// }
|
|
|
-//
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public UserSerializer getUserById(Integer userid) {
|
|
|
-// return new UserSerializer(userDAO.getOne(userid));
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public UserSerializer changeUserInfo(Integer userid,String nickName, String bio) throws ServiceException {
|
|
|
-// User one = userDAO.findById(userid).orElse(null);
|
|
|
-// if (one == null) {
|
|
|
-// throw new ServiceException("用户不存在");
|
|
|
-// }
|
|
|
-// if(nickName!=null){
|
|
|
-// one.setNickname(nickName);
|
|
|
-// }
|
|
|
-// if(bio!=null){
|
|
|
-// one.setBio(bio);
|
|
|
-// }
|
|
|
-// return new UserSerializer(userDAO.save(one));
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public UserSerializer changeUserPassword(Integer userid,String oldPassword, String newPassword) throws ServiceException {
|
|
|
-// User one = userDAO.findById(userid).orElse(null);
|
|
|
-// if (one == null) {
|
|
|
-// throw new ServiceException("用户不存在");
|
|
|
-// }
|
|
|
-// if(!one.getPassword().equals(DigestUtils.sha256Hex(oldPassword))){
|
|
|
-// throw new ServiceException("原密码错误");
|
|
|
-// }else{
|
|
|
-// one.setPassword(DigestUtils.sha256Hex(newPassword));
|
|
|
-// }
|
|
|
-// try {
|
|
|
-// gitlabApi.changePassword(userid, newPassword);
|
|
|
-// } catch (GitLabApiException e) {
|
|
|
-// throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// mailService.send( "您的新密码为"+newPassword,"密码变更提醒 | SEECODER",one.getEmail());
|
|
|
-// return new UserSerializer(userDAO.save(one));
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public void changePassword(int userId, ChangePasswordForm form) throws ServiceException {
|
|
|
-// User user = userDAO.findById(userId);
|
|
|
-// if (!user.getPassword().equals(DigestUtils.sha256Hex(form.getOrigin()))) {
|
|
|
-// throw new InvalidRequestException("原密码验证失败,如忘记密码请联系管理员重置");
|
|
|
-// }
|
|
|
-// changePassword(user, form.getPassword(), false);
|
|
|
-// }
|
|
|
-//
|
|
|
-// @Override
|
|
|
-// public void resetPassword(int userId) throws ServiceException {
|
|
|
-// User user = userDAO.findById(userId);
|
|
|
-// Asserts.notNull(user, "所选用户不存在");
|
|
|
-// String password = ToolKit.randomPassword();
|
|
|
-// changePassword(user, password, true);
|
|
|
-// }
|
|
|
-//
|
|
|
-//
|
|
|
-//
|
|
|
-// private void changePassword(User user, String password, boolean reset) throws ServiceException {
|
|
|
-// try {
|
|
|
-// gitlabApi.changePassword(user.getId(), password);
|
|
|
-// } catch (GitLabApiException e) {
|
|
|
-// throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
|
|
|
-// }
|
|
|
-// user.setPassword(DigestUtils.sha256Hex(password));
|
|
|
-// user = userDAO.save(user);
|
|
|
-// if (reset) {
|
|
|
-// mailService.send( "您的新密码为"+password,"密码变更提醒 | SEECODER",user.getEmail());
|
|
|
-// }
|
|
|
-// }
|
|
|
-//}
|
|
|
+package seecoder.devcloud.web.service.impl.user;
|
|
|
+
|
|
|
+
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.codec.digest.DigestUtils;
|
|
|
+import org.gitlab4j.api.GitLabApiException;
|
|
|
+import org.springframework.beans.BeanUtils;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.util.Assert;
|
|
|
+import seecoder.devcloud.api.gitlab.GitlabApi;
|
|
|
+import seecoder.devcloud.api.gitlab.model.GitlabUser;
|
|
|
+import seecoder.devcloud.api.jenkins.JenkinsApi;
|
|
|
+import seecoder.devcloud.common.exceptions.Asserts;
|
|
|
+import seecoder.devcloud.common.exceptions.InvalidRequestException;
|
|
|
+import seecoder.devcloud.common.exceptions.ServiceException;
|
|
|
+import seecoder.devcloud.common.util.ToolKit;
|
|
|
+import seecoder.devcloud.web.dao.user.UserMapper;
|
|
|
+import seecoder.devcloud.web.vo.user.ChangePasswordVO;
|
|
|
+import seecoder.devcloud.web.vo.user.RegisterVO;
|
|
|
+
|
|
|
+import seecoder.devcloud.web.enums.UserIdentity;
|
|
|
+import seecoder.devcloud.web.po.user.User;
|
|
|
+import seecoder.devcloud.web.vo.user.UserVO;
|
|
|
+import seecoder.devcloud.web.service.user.MailService;
|
|
|
+import seecoder.devcloud.web.service.user.UserService;
|
|
|
+
|
|
|
+@Service
|
|
|
+@Slf4j
|
|
|
+public class UserServiceImpl implements UserService {
|
|
|
+ private static final Sort PAGE_SORT = Sort.by(Sort.Direction.ASC, "id");
|
|
|
+
|
|
|
+ private final UserMapper userMapper;
|
|
|
+ private final MailService mailService;
|
|
|
+ private final GitlabApi gitlabApi;
|
|
|
+ private final JenkinsApi jenkinsApi;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public UserServiceImpl(UserMapper userMapper, MailService mailService, GitlabApi gitlabApi, JenkinsApi jenkinsApi) {
|
|
|
+ this.userMapper = userMapper;
|
|
|
+ this.mailService = mailService;
|
|
|
+ this.gitlabApi = gitlabApi;
|
|
|
+ this.jenkinsApi = jenkinsApi;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public UserVO register(RegisterVO form) throws ServiceException {
|
|
|
+ return register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.STUDENT);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public UserVO registerTeacher(RegisterVO form) throws ServiceException {
|
|
|
+ return register(form.getUsername(), form.getEmail(), form.getPassword(),form.getNickname(), UserIdentity.TEACHER);
|
|
|
+ }
|
|
|
+
|
|
|
+ private UserVO register(String username, String email, String password, String nickname,UserIdentity role) throws ServiceException {
|
|
|
+ User user = userMapper.findByUsername(username);
|
|
|
+ Asserts.isNull(user, "用户名已被使用!");
|
|
|
+ user = userMapper.findByEmail(email);
|
|
|
+ Asserts.isNull(user, "邮箱已被使用!");
|
|
|
+ String realPassword = password == null ? ToolKit.randomPassword() : password;
|
|
|
+ GitlabUser gitlabUser;
|
|
|
+ try {
|
|
|
+ gitlabUser = gitlabApi.createUser(username, email, realPassword);
|
|
|
+ } catch (GitLabApiException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ throw new ServiceException("创建GitLab用户时发生异常[" + e.getMessage() + "]");
|
|
|
+ }
|
|
|
+ user = new User();
|
|
|
+ BeanUtils.copyProperties(gitlabUser, user);
|
|
|
+ if(nickname!=null){
|
|
|
+ user.setNickname(nickname);
|
|
|
+ }
|
|
|
+
|
|
|
+ user.setUsername(username);
|
|
|
+ user.setEmail(email);
|
|
|
+ //在gitlab注册后,直接加密
|
|
|
+ user.setPassword(DigestUtils.sha256Hex(realPassword));
|
|
|
+ user.setRole(role);
|
|
|
+ userMapper.insert(user, "created_at");
|
|
|
+ final UserVO userVO = new UserVO(user);
|
|
|
+ if (password == null) {
|
|
|
+ mailService.send("尊敬的" + username + "您好, 您的初始密码为" + realPassword + ", 请及时修改", "注册成功 | SEECODER", email);
|
|
|
+ }
|
|
|
+ return userVO;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ @Transactional
|
|
|
+ public void delete(int userId) throws ServiceException {
|
|
|
+ User user = userMapper.findById(userId);
|
|
|
+ Assert.notNull(user, "找不到要删除的用户");
|
|
|
+ Assert.isTrue(user.getRole() == UserIdentity.STUDENT, "目标用户只能是学生");
|
|
|
+ try {
|
|
|
+ gitlabApi.deleteUser(userId);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ throw new ServiceException("删除GitLab用户时发生异常[" + e.getMessage() + "]");
|
|
|
+ }
|
|
|
+ //todo 删除用户需要连带删除什么
|
|
|
+ userMapper.delete(user);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public UserVO getUserById(Integer userid) {
|
|
|
+ return new UserVO(userMapper.findById(userid));
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public UserVO changeUserInfo(Integer userid, String nickName) throws ServiceException {
|
|
|
+ User one = userMapper.findById(userid);
|
|
|
+ if (one == null) {
|
|
|
+ throw new ServiceException("用户不存在");
|
|
|
+ }
|
|
|
+ one.setNickname(nickName);
|
|
|
+ userMapper.updateById(one);
|
|
|
+ return new UserVO(one);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void changePassword(ChangePasswordVO form) throws ServiceException {
|
|
|
+ User user = userMapper.findById(form.getUserId());
|
|
|
+
|
|
|
+ if (!user.getPassword().equals(DigestUtils.sha256Hex(form.getOrigin()))) {
|
|
|
+ throw new InvalidRequestException("原密码验证失败,如忘记密码请联系管理员重置");
|
|
|
+ }
|
|
|
+ changePassword(user, form.getPassword(), false);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void changePassword(User user, String password, boolean reset) throws ServiceException {
|
|
|
+ try {
|
|
|
+ /**
|
|
|
+ * todo 修改密码容易导致gitlab与devcloud不一致
|
|
|
+ * 管理员每次修改密码,会导致下次普通用户登陆gitlab的时候强制重新改密码
|
|
|
+ * 如果这时候学生在gitlab那边改的密码与这里改的不一样,就产生了密码不一致的结果
|
|
|
+ * 而且目前官方gitlab client api不支持普通用户通过api改密码
|
|
|
+ * 见 https://docs.gitlab.com/ce/api/users.html
|
|
|
+ * 所以这个bug暂时无解,最好是让学生建立用户完毕之后不要乱改密码
|
|
|
+ */
|
|
|
+ gitlabApi.changePassword(user.getId(), password);
|
|
|
+ } catch (GitLabApiException e) {
|
|
|
+ log.error(e.getMessage(), e);
|
|
|
+ throw new ServiceException("修改GitLab用户密码时发生异常[" + e.getMessage() + "]");
|
|
|
+ }
|
|
|
+ user.setPassword(DigestUtils.sha256Hex(password));
|
|
|
+ userMapper.updateById(user);
|
|
|
+ if (reset) {
|
|
|
+ mailService.send( "您的新密码为"+password,"密码变更提醒 | SEECODER",user.getEmail());
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|