package com.huixinpn.dionysus.service.impl;
import com.huixinpn.dionysus.domain.user.Consultant;
import com.huixinpn.dionysus.domain.user.Profile;
import com.huixinpn.dionysus.domain.user.Role;
import com.huixinpn.dionysus.domain.user.User;
import com.huixinpn.dionysus.exception.InvalidUserException;
import com.huixinpn.dionysus.repository.user.ConsultantRepository;
import com.huixinpn.dionysus.repository.user.UserRepository;
import com.huixinpn.dionysus.service.ConsultantService;
import com.huixinpn.dionysus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.HashMap;
import java.util.HashSet;
@Service
public class UserServiceImpl implements UserService, ConsultantService {
@Autowired
@Qualifier("userRepository")
private UserRepository userrepository;
@Autowired
@Qualifier("consultantRepository")
private ConsultantRepository consultantRepository;
@Autowired
private PasswordEncoder encoder;
@PersistenceContext
private EntityManager manager;
@Override
public User register(User user) {
User _user = userrepository.findByUsername(user.getUsername());
if (_user != null) {
throw new InvalidUserException("user " + user.getUsername() + " exists!");
}
HashSet<Role> roles = new HashSet<Role>();
roles.add(new Role("ROLE_USER"));
user.setRoles(roles);
//user.setInbox(null);
user.setProfile(new Profile());
user.setAbout("普通用户");
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(new UsernamePasswordAuthenticationToken(user.getUsername(),
user.getPassword(), user.getAuthorities()));
userrepository.save(user);
manager.detach(user);
user.setPassword("");
user.setEncryptedPassword("");
user.setCourses(null);
return user;
}
@Override
public User updateprofile(User user) {
User _user = userrepository.findByUsername(user.getUsername());
if (_user == null) {
throw new InvalidUserException("user " + user.getUsername() + " doesn't exists!");
}
_user.setEmail(user.getEmail());
_user.setAddress(user.getAddress());
_user.setGender(user.getGender());
_user.setMobile(user.getMobile());
_user.setLandline(user.getLandline());
_user.setAge(user.getAge());
_user.setQq(user.getQq());
_user.setQqAddress(user.getQqAddress());
_user.setRealName(user.getRealName());
_user.setAbout(user.getAbout());
userrepository.saveAndFlush(_user);
manager.detach(_user);
_user.setPassword("");
_user.setEncryptedPassword("");
_user.setCourses(null);
_user.setProfile(null);
if (_user instanceof Consultant) {
((Consultant) _user).setTeachings(null);
((Consultant) _user).setAppointments(null);
}
return _user;
}
@Override
public User sign(String username, String password) {
User user = userrepository.findByUsername(username);
if (user == null) {
throw new InvalidUserException("用户不存在:" + username);
}
if (!encoder.matches(password, user.getEncryptedPassword())) {
throw new InvalidUserException("密码错误: " + username);
}
if (!(user.isAccountNonExpired() && user.isAccountNonLocked() && user.isCredentialsNonExpired() && user.isEnabled())) {
throw new InvalidUserException("用户未生效: " + username);
}
manager.detach(user);
user.setPassword("");
user.setEncryptedPassword("");
user.setCourses(null);
user.setProfile(null);
if (user instanceof Consultant) {
((Consultant) user).setTeachings(null);
((Consultant) user).setAppointments(null);
((Consultant) user).setExpertises(null);
}
return user;
}
@Override
public UserDetails loadUserByUsername(String username) {
User user = userrepository.findByUsername(username);
if (user == null) {
throw new UsernameNotFoundException("user not found: " + username);
}
manager.detach(user);
user.setPassword("");
user.setEncryptedPassword("");
return user;
}
@Override
public User registerconsultant(User consultant) {
Consultant _consultant = new Consultant(consultant.getUsername(), consultant.getPassword());
HashSet<Role> roles = new HashSet<Role>();
roles.add(new Role("ROLE_CONSULTANT"));
_consultant.setRoles(roles);
_consultant.setEmail(consultant.getEmail());
_consultant.setEnabled(false);
_consultant.setAbout("心理咨询师");
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(new UsernamePasswordAuthenticationToken(_consultant.getUsername(),
_consultant.getPassword(), _consultant.getAuthorities()));
consultantRepository.save(_consultant);
manager.detach(_consultant);
_consultant.setPassword("");
_consultant.setEncryptedPassword("");
_consultant.setCourses(null);
return _consultant;
}
@Override
public boolean sendemailtouser(User user) {
return true;
}
@Override
public void changePassword(String oldPass, String newPass, HashMap revalue) {
Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
if(principal instanceof User){
User user = (User) principal;
User user_data = userrepository.findOne(user.getId());
if(!encoder.matches(oldPass, user_data.getEncryptedPassword())){
revalue.put("status", "fail_pass");
}
else{
user_data.setEncryptedPassword(encoder.encode(newPass));
user_data.setPassword(newPass);
userrepository.saveAndFlush(user_data);
revalue.put("status","success");
}
}
}
}