UserService.java
package com.learning.yasminishop.user;
import com.learning.yasminishop.common.dto.PaginationResponse;
import com.learning.yasminishop.common.entity.User;
import com.learning.yasminishop.common.exception.AppException;
import com.learning.yasminishop.common.exception.ErrorCode;
import com.learning.yasminishop.role.RoleRepository;
import com.learning.yasminishop.user.dto.request.UserUpdateRequest;
import com.learning.yasminishop.user.dto.response.UserAdminResponse;
import com.learning.yasminishop.user.dto.response.UserResponse;
import com.learning.yasminishop.user.mapper.UserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.HashSet;
@Service
@RequiredArgsConstructor
@Slf4j
@Transactional(readOnly = true)
public class UserService {
private final UserRepository userRepository;
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;
private final RoleRepository roleRepository;
public UserResponse getMyInfo() {
var context = SecurityContextHolder.getContext();
String email = context.getAuthentication().getName();
User user = userRepository.findByEmail(email).orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
return userMapper.toUserResponse(user);
}
public PaginationResponse<UserAdminResponse> getAllUsers(Pageable pageable) {
Page<User> users = userRepository.findAll(pageable);
return PaginationResponse.<UserAdminResponse>builder()
.page(pageable.getPageNumber() + 1)
.total(users.getTotalElements())
.itemsPerPage(pageable.getPageSize())
.data(users.map(userMapper::toUserAdminResponse).toList())
.build();
}
@Transactional
public UserAdminResponse toggleActive(String userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
user.setIsActive(user.getIsActive() == null || !user.getIsActive());
return userMapper.toUserAdminResponse(userRepository.save(user));
}
@Transactional
public UserResponse updateUser(String userId, UserUpdateRequest userUpdateRequest) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
userMapper.updateUser(user, userUpdateRequest);
user.setPassword(passwordEncoder.encode(userUpdateRequest.getPassword()));
var roles = roleRepository.findAllById(userUpdateRequest.getRoles());
user.setRoles(new HashSet<>(roles));
return userMapper.toUserResponse(userRepository.save(user));
}
@PreAuthorize("hasRole('ADMIN')")
public void deleteUser(String userId) {
if (!userRepository.existsById(userId)) {
throw new AppException(ErrorCode.USER_NOT_FOUND);
}
userRepository.deleteById(userId);
}
public UserResponse getUserById(String userId) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new AppException(ErrorCode.USER_NOT_FOUND));
return userMapper.toUserResponse(user);
}
}