package ru.soune.nocopy.controller; import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import ru.soune.nocopy.dto.ChangePasswordRequest; import ru.soune.nocopy.dto.UserDTO; import ru.soune.nocopy.dto.UserRequest; import ru.soune.nocopy.entity.AuthToken; import ru.soune.nocopy.entity.User; import ru.soune.nocopy.exception.InvalidUserEmail; import ru.soune.nocopy.exception.NotFoundAuthToken; import ru.soune.nocopy.mapper.UserMapper; import ru.soune.nocopy.repository.AuthTokenRepository; import ru.soune.nocopy.repository.UserRepository; import ru.soune.nocopy.service.UserService; import java.util.List; import java.util.Optional; @RestController @RequestMapping("v1/api/user") @RequiredArgsConstructor public class UserController { private final UserRepository userRepository; private final UserService userService; private final AuthTokenRepository authTokenRepository; private final UserMapper userMapper; @GetMapping("/all") public ResponseEntity> getAllUsers() { List allUsers = userRepository.findAll().stream() .map(u -> new UserDTO(u.getFullName(), u.getCompany(), u.getEmail(), u.getIsActive(), u.getPhone(), u.getGenderType(), u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType())) .toList(); return ResponseEntity.ok(allUsers); } @GetMapping public ResponseEntity getUser(@RequestParam("email") String email, @RequestHeader("Authorization") String tokenHeader) { String token = tokenHeader.replace("Bearer ", ""); Optional tokenOptional = authTokenRepository.findByToken(token); AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); if (authToken != null) { Optional user = userRepository.findByEmail(email); //TODO add mapper if (user.isPresent()) { UserDTO userDTO = userMapper.toDTO(user.get()); userDTO.setEmail(email); userDTO.setFullName(user.get().getFullName()); userDTO.setCompany(user.get().getCompany()); userDTO.setPhone(user.get().getPhone()); userDTO.setGenderType(user.get().getGenderType()); userDTO.setBirthday(user.get().getBirthday()); userDTO.setCreatedAt(user.get().getCreatedAt()); userDTO.setSubscriptionType(user.get().getSubscriptionType()); userDTO.setActive(user.get().getIsActive()); return ResponseEntity.ok(userDTO); } } return ResponseEntity.notFound().build(); } //TODO fix mapper,doesnot exist all fields @PostMapping("/change-password") public ResponseEntity updateUser(@RequestBody ChangePasswordRequest changePasswordRequest, @RequestHeader("Authorization") String tokenHeader) { String token = tokenHeader.replace("Bearer ", ""); Optional tokenOptional = authTokenRepository.findByToken(token); AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); User user = authToken.getUser(); if (!changePasswordRequest.getEmail().equals(user.getEmail())) { throw new InvalidUserEmail("Email is not valid: " + changePasswordRequest.getEmail() + "not found"); } User updateUser = userService.changePassword(user, changePasswordRequest); return ResponseEntity.ok(userMapper.toDTO(updateUser)); } @PatchMapping("/user-update") public ResponseEntity updateUser(@RequestBody UserRequest userRequest, @RequestHeader("Authorization") String tokenHeader) { String token = tokenHeader.replace("Bearer ", ""); Optional tokenOptional = authTokenRepository.findByToken(token); AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found")); User user = authToken.getUser(); return ResponseEntity.ok(userService.updateUser(userRequest, user)); } }