UserServiceImpl.java
package user.service.impl;
import edu.fudan.common.util.Response;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import user.dto.AuthDto;
import user.dto.UserDto;
import user.entity.User;
import user.repository.UserRepository;
import user.service.UserService;
import java.util.List;
import java.util.UUID;
/**
* @author fdse
*/
@Service
public class UserServiceImpl implements UserService {
private static final Logger LOGGER = LoggerFactory.getLogger(UserServiceImpl.class);
@Autowired
private UserRepository userRepository;
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
private String getServiceUrl(String serviceName) {
return "http://" + serviceName;
}
@Override
public Response saveUser(UserDto userDto, HttpHeaders headers) {
LOGGER.info("[saveUser][Save User Name][user name: {}]", userDto.getUserName());
String userId = userDto.getUserId();
if (userDto.getUserId() == null) {
userId = UUID.randomUUID().toString();
}
User user = User.builder()
.userId(userId)
.userName(userDto.getUserName())
.password(userDto.getPassword())
.gender(userDto.getGender())
.documentType(userDto.getDocumentType())
.documentNum(userDto.getDocumentNum())
.email(userDto.getEmail()).build();
// avoid same user name
User user1 = userRepository.findByUserName(userDto.getUserName());
if (user1 == null) {
createDefaultAuthUser(AuthDto.builder().userId(userId + "")
.userName(user.getUserName())
.password(user.getPassword()).build());
User userSaveResult = userRepository.save(user);
LOGGER.info("[saveUser][Send authorization message to ts-auth-service....]");
return new Response<>(1, "REGISTER USER SUCCESS", userSaveResult);
} else {
UserServiceImpl.LOGGER.error("[saveUser][Save user error][User already exists][UserId: {}]",userDto.getUserId());
return new Response<>(0, "USER HAS ALREADY EXISTS", null);
}
}
private Response createDefaultAuthUser(AuthDto dto) {
LOGGER.info("[createDefaultAuthUser][CALL TO AUTH][AuthDto: {}]", dto.toString());
HttpHeaders headers = new HttpHeaders();
HttpEntity<AuthDto> entity = new HttpEntity<>(dto, null);
String auth_service_url = getServiceUrl("ts-auth-service");
List<ServiceInstance> auth_svcs = discoveryClient.getInstances("ts-auth-service");
if(auth_svcs.size() >0 ){
ServiceInstance auth_svc = auth_svcs.get(0);
LOGGER.info("[createDefaultAuthUser][CALL TO AUTH][auth_svc host: {}][auth_svc port: {}]", auth_svc.getHost(), auth_svc.getPort());
}else{
LOGGER.info("[createDefaultAuthUser][CALL TO AUTH][can not get auth url]");
}
ResponseEntity<Response<AuthDto>> res = restTemplate.exchange(auth_service_url + "/api/v1/auth",
HttpMethod.POST,
entity,
new ParameterizedTypeReference<Response<AuthDto>>() {
});
return res.getBody();
}
@Override
public Response getAllUsers(HttpHeaders headers) {
List<User> users = userRepository.findAll();
if (users != null && !users.isEmpty()) {
return new Response<>(1, "Success", users);
}
UserServiceImpl.LOGGER.warn("[getAllUsers][Get all users warn: {}]","No Content");
return new Response<>(0, "NO User", null);
}
@Override
public Response findByUserName(String userName, HttpHeaders headers) {
User user = userRepository.findByUserName(userName);
if (user != null) {
return new Response<>(1, "Find User Success", user);
}
UserServiceImpl.LOGGER.warn("[findByUserName][Get user by name warn,user is null][UserName: {}]",userName);
return new Response<>(0, "No User", null);
}
@Override
public Response findByUserId(String userId, HttpHeaders headers) {
User user = userRepository.findByUserId(userId);
if (user != null) {
return new Response<>(1, "Find User Success", user);
}
UserServiceImpl.LOGGER.error("[findByUserId][Get user by id error,user is null][UserId: {}]",userId);
return new Response<>(0, "No User", null);
}
@Override
@Transactional
public Response deleteUser(String userId, HttpHeaders headers) {
LOGGER.info("[deleteUser][DELETE USER BY ID][userId: {}]", userId);
User user = userRepository.findByUserId(userId);
if (user != null) {
// first only admin token can delete success
deleteUserAuth(userId, headers);
// second
userRepository.deleteByUserId(userId);
LOGGER.info("[deleteUser][DELETE SUCCESS][userId: {}]", userId);
return new Response<>(1, "DELETE SUCCESS", null);
} else {
UserServiceImpl.LOGGER.error("[deleteUser][Delete user error][User not found][UserId: {}]",userId);
return new Response<>(0, "USER NOT EXISTS", null);
}
}
@Override
@Transactional
public Response updateUser(UserDto userDto, HttpHeaders headers) {
LOGGER.info("[updateUser][UPDATE USER: {}]", userDto.toString());
User oldUser = userRepository.findByUserId(userDto.getUserId());
if (oldUser != null) {
User newUser = User.builder().email(userDto.getEmail())
.password(userDto.getPassword())
.userId(oldUser.getUserId())
.userName(userDto.getUserName())
.gender(userDto.getGender())
.documentNum(userDto.getDocumentNum())
.documentType(userDto.getDocumentType()).build();
userRepository.deleteByUserId(oldUser.getUserId());
userRepository.save(newUser);
return new Response<>(1, "SAVE USER SUCCESS", newUser);
} else {
UserServiceImpl.LOGGER.error("[updateUser][Update user error][User not found][UserId: {}]",userDto.getUserId());
return new Response(0, "USER NOT EXISTS", null);
}
}
public void deleteUserAuth(String userId, HttpHeaders headers) {
LOGGER.info("[deleteUserAuth][DELETE USER BY ID][userId: {}]", userId);
HttpHeaders newHeaders = new HttpHeaders();
String token = headers.getFirst(HttpHeaders.AUTHORIZATION);
newHeaders.set(HttpHeaders.AUTHORIZATION, token);
HttpEntity<Response> httpEntity = new HttpEntity<>(newHeaders);
String auth_service_url = getServiceUrl("ts-auth-service");
String AUTH_SERVICE_URI = auth_service_url + "/api/v1";
restTemplate.exchange(AUTH_SERVICE_URI + "/users/" + userId,
HttpMethod.DELETE,
httpEntity,
Response.class);
LOGGER.info("[deleteUserAuth][DELETE USER AUTH SUCCESS][userId: {}]", userId);
}
}