# Coverage Summary for Class: UserServiceImpl (cn.edu.ecnu.stu.bookstore.service.impl)

Class | Class, % | Method, % | Line, %
--- | --- | --- | ---
UserServiceImpl | 100% (1/1) | 100% (7/7) | 87.5% (28/32)

     package cn.edu.ecnu.stu.bookstore.service.impl;

     import cn.edu.ecnu.stu.bookstore.component.AppException;
     import cn.edu.ecnu.stu.bookstore.component.Constants;
     import cn.edu.ecnu.stu.bookstore.mapper.UserMapper;
     import cn.edu.ecnu.stu.bookstore.pojo.LoginUser;
     import cn.edu.ecnu.stu.bookstore.pojo.User;
     import cn.edu.ecnu.stu.bookstore.service.UserService;
     import cn.edu.ecnu.stu.bookstore.utils.JwtUtil;
     import org.springframework.beans.factory.annotation.Autowired;
     import org.springframework.data.redis.core.RedisTemplate;
     import org.springframework.security.authentication.AuthenticationManager;
     import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
     import org.springframework.security.core.Authentication;
     import org.springframework.security.core.context.SecurityContextHolder;
     import org.springframework.security.crypto.password.PasswordEncoder;
     import org.springframework.stereotype.Service;
     import org.springframework.util.StringUtils;

     import java.util.HashMap;
     import java.util.Map;
     import java.util.concurrent.TimeUnit;

     @Service
     public class UserServiceImpl implements UserService {

         @Autowired
         private UserMapper userMapper;

         @Autowired
         private AuthenticationManager authenticationManager;

         @Autowired
         private PasswordEncoder passwordEncoder;

         @Autowired
         private RedisTemplate redisTemplate;

         public void register(User user) {
             if(!StringUtils.hasLength(user.getUsername()))
                 throw new AppException(Constants.CLIENT_ERROR, Constants.PARAMETER_ERROR_MESSAGE);
             if(userMapper.checkUserByUsername(user.getUsername()) != 0)
                 throw new AppException(Constants.CLIENT_ERROR, Constants.REGISTER_ERROR_MESSAGE);
             String encoded = passwordEncoder.encode(user.getPassword());
             user.setPassword(encoded);
             userMapper.insert(user);
         }

         public void unregister(User user) {
             User user1 = userMapper.selectOneByName(user.getUsername());
             if(user1 == null || !passwordEncoder.matches(user.getPassword(), user1.getPassword())) {
                 throw new AppException(Constants.CLIENT_ERROR, Constants.PASSWORD_ERROR);
             }
             userMapper.deleteByName(user.getUsername());
         }

         public User selectUserByName(String username) {
             return userMapper.selectOneByName(username);
         }

         public Map<String, Object> login(User user) {
             UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(user.getUsername(), user.getPassword());
             Authentication authenticate = authenticationManager.authenticate(token);
             LoginUser loginUser = (LoginUser)authenticate.getPrincipal();
             User user1 = loginUser.getUser();
             redisTemplate.opsForValue().set("userId:" + user1.getId(), "1", 1, TimeUnit.DAYS);
             Map<String, Object> map = new HashMap<>();
             map.put("token", JwtUtil.getToken(user1));
             map.put("user", user1);
             return map;
         }

         public void logout(String username) {
             User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
             if(!user.getUsername().equals(username)) {
                 throw new AppException(Constants.CLIENT_ERROR, Constants.PARAMETER_ERROR_MESSAGE);
             }
             redisTemplate.delete("userId:" + user.getId());
         }

         public void changePassword(String username, String oldPassword, String newPassword) {
             User user = userMapper.selectOneByName(username);
             if(user == null || !passwordEncoder.matches(oldPassword, user.getPassword())){
                 throw new AppException(Constants.CLIENT_ERROR, Constants.PASSWORD_ERROR);
             }
             newPassword = passwordEncoder.encode(newPassword);
             userMapper.updatePassword(username, newPassword);
             redisTemplate.delete("userId:" + user.getId());
         }
     }