2025-12-10 19:12:54 +07:00
|
|
|
package ru.soune.nocopy.controller;
|
2025-11-26 11:33:33 +07:00
|
|
|
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.springframework.http.ResponseEntity;
|
2026-01-27 08:09:54 +07:00
|
|
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
2025-11-27 03:05:07 +07:00
|
|
|
import org.springframework.web.bind.annotation.*;
|
2026-01-27 08:09:54 +07:00
|
|
|
import ru.soune.nocopy.dto.BaseResponse;
|
|
|
|
|
import ru.soune.nocopy.dto.MessageCode;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.dto.register.ChangePasswordRequest;
|
2026-01-27 08:09:54 +07:00
|
|
|
import ru.soune.nocopy.dto.register.RegAnswer;
|
|
|
|
|
import ru.soune.nocopy.dto.register.RegRequest;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.dto.user.UserDTO;
|
|
|
|
|
import ru.soune.nocopy.dto.user.UserRequest;
|
2026-01-16 20:20:14 +07:00
|
|
|
import ru.soune.nocopy.entity.user.AuthToken;
|
|
|
|
|
import ru.soune.nocopy.entity.user.User;
|
2025-12-10 19:12:54 +07:00
|
|
|
import ru.soune.nocopy.exception.InvalidUserEmail;
|
|
|
|
|
import ru.soune.nocopy.exception.NotFoundAuthToken;
|
2026-01-27 08:09:54 +07:00
|
|
|
import ru.soune.nocopy.exception.NotValidFieldException;
|
2025-12-10 19:12:54 +07:00
|
|
|
import ru.soune.nocopy.mapper.UserMapper;
|
|
|
|
|
import ru.soune.nocopy.repository.AuthTokenRepository;
|
|
|
|
|
import ru.soune.nocopy.repository.UserRepository;
|
2026-01-27 08:09:54 +07:00
|
|
|
import ru.soune.nocopy.service.register.AuthService;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.service.user.UserService;
|
2025-11-26 11:33:33 +07:00
|
|
|
|
2026-01-27 08:09:54 +07:00
|
|
|
import java.util.Arrays;
|
2025-11-26 11:33:33 +07:00
|
|
|
import java.util.List;
|
2026-01-27 08:09:54 +07:00
|
|
|
import java.util.Map;
|
2025-11-27 03:05:07 +07:00
|
|
|
import java.util.Optional;
|
2025-11-26 11:33:33 +07:00
|
|
|
|
|
|
|
|
@RestController
|
2025-12-05 11:45:51 +07:00
|
|
|
@RequestMapping("v1/api/user")
|
2025-11-26 11:33:33 +07:00
|
|
|
@RequiredArgsConstructor
|
|
|
|
|
public class UserController {
|
|
|
|
|
|
|
|
|
|
private final UserRepository userRepository;
|
|
|
|
|
|
2025-11-27 03:05:07 +07:00
|
|
|
private final UserService userService;
|
|
|
|
|
|
|
|
|
|
private final AuthTokenRepository authTokenRepository;
|
|
|
|
|
|
|
|
|
|
private final UserMapper userMapper;
|
|
|
|
|
|
2026-01-27 08:09:54 +07:00
|
|
|
private final PasswordEncoder passwordEncoder;
|
|
|
|
|
|
|
|
|
|
private final AuthService authService;
|
|
|
|
|
|
2025-11-26 11:33:33 +07:00
|
|
|
@GetMapping("/all")
|
|
|
|
|
public ResponseEntity<List<UserDTO>> getAllUsers() {
|
|
|
|
|
List<UserDTO> allUsers = userRepository.findAll().stream()
|
2026-01-20 15:12:24 +07:00
|
|
|
.map(u -> new UserDTO(u.getFullName(), u.getCompany(), u.getEmail(), u.isActive(),
|
2025-11-27 03:05:07 +07:00
|
|
|
u.getPhone(), u.getGenderType(),
|
2025-11-27 12:48:08 +07:00
|
|
|
u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType()))
|
2025-11-26 11:33:33 +07:00
|
|
|
.toList();
|
|
|
|
|
|
|
|
|
|
return ResponseEntity.ok(allUsers);
|
|
|
|
|
}
|
2025-11-27 03:05:07 +07:00
|
|
|
|
2025-12-02 13:57:07 +07:00
|
|
|
@GetMapping
|
|
|
|
|
public ResponseEntity<UserDTO> getUser(@RequestParam("email") String email,
|
|
|
|
|
@RequestHeader("Authorization") String tokenHeader) {
|
|
|
|
|
String token = tokenHeader.replace("Bearer ", "");
|
|
|
|
|
|
|
|
|
|
Optional<AuthToken> tokenOptional = authTokenRepository.findByToken(token);
|
|
|
|
|
|
|
|
|
|
AuthToken authToken = tokenOptional.orElseThrow(() -> new NotFoundAuthToken("Token: " + token + "not found"));
|
|
|
|
|
|
|
|
|
|
if (authToken != null) {
|
2026-01-20 15:12:24 +07:00
|
|
|
User user = userRepository.findByEmail(email);
|
2025-12-02 13:57:07 +07:00
|
|
|
//TODO add mapper
|
2026-01-20 15:12:24 +07:00
|
|
|
if (user != null) {
|
|
|
|
|
UserDTO userDTO = userMapper.toDTO(user);
|
2025-12-02 13:57:07 +07:00
|
|
|
userDTO.setEmail(email);
|
2026-01-20 15:12:24 +07:00
|
|
|
userDTO.setFullName(user.getFullName());
|
|
|
|
|
userDTO.setCompany(user.getCompany());
|
|
|
|
|
userDTO.setPhone(user.getPhone());
|
|
|
|
|
userDTO.setGenderType(user.getGenderType());
|
|
|
|
|
userDTO.setBirthday(user.getBirthday());
|
|
|
|
|
userDTO.setCreatedAt(user.getCreatedAt());
|
|
|
|
|
userDTO.setSubscriptionType(user.getSubscriptionType());
|
|
|
|
|
userDTO.setActive(user.isActive());
|
2025-12-02 13:57:07 +07:00
|
|
|
|
|
|
|
|
return ResponseEntity.ok(userDTO);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return ResponseEntity.notFound().build();
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-27 03:05:07 +07:00
|
|
|
//TODO fix mapper,doesnot exist all fields
|
|
|
|
|
@PostMapping("/change-password")
|
|
|
|
|
public ResponseEntity<UserDTO> updateUser(@RequestBody ChangePasswordRequest changePasswordRequest,
|
|
|
|
|
@RequestHeader("Authorization") String tokenHeader) {
|
|
|
|
|
String token = tokenHeader.replace("Bearer ", "");
|
|
|
|
|
|
|
|
|
|
Optional<AuthToken> 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));
|
|
|
|
|
}
|
2025-11-27 12:48:08 +07:00
|
|
|
|
|
|
|
|
@PatchMapping("/user-update")
|
|
|
|
|
public ResponseEntity<UserDTO> updateUser(@RequestBody UserRequest userRequest,
|
|
|
|
|
@RequestHeader("Authorization") String tokenHeader) {
|
|
|
|
|
String token = tokenHeader.replace("Bearer ", "");
|
|
|
|
|
|
|
|
|
|
Optional<AuthToken> 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));
|
|
|
|
|
}
|
2026-01-27 08:09:54 +07:00
|
|
|
|
|
|
|
|
@PostMapping("/create-user")
|
|
|
|
|
public ResponseEntity<User> addUser(@RequestBody RegRequest registerRequest) {
|
|
|
|
|
|
|
|
|
|
if (userRepository.existsByEmail(registerRequest.getEmail()) ||
|
|
|
|
|
userRepository.existsByPhone(registerRequest.getPhone())) {
|
|
|
|
|
RegAnswer regAnswer = new RegAnswer();
|
|
|
|
|
regAnswer.setFieldErrors(Arrays.asList(Map.of("email", registerRequest.getEmail())));
|
|
|
|
|
regAnswer.setFieldErrors(Arrays.asList(Map.of("phone", registerRequest.getPhone())));
|
|
|
|
|
|
|
|
|
|
throw new NotValidFieldException("User already exists with email:" + registerRequest.getEmail() + " or phone: " +
|
|
|
|
|
registerRequest.getPhone(), new BaseResponse(2,
|
|
|
|
|
MessageCode.REG_EMAIL_OR_PHONE_EXISTS.getCode(),
|
|
|
|
|
MessageCode.REG_EMAIL_OR_PHONE_EXISTS.getDescription(), regAnswer));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
User user = new User();
|
|
|
|
|
user.setFullName(registerRequest.getFullName());
|
|
|
|
|
user.setEmail(registerRequest.getEmail());
|
|
|
|
|
user.setPassword(passwordEncoder.encode(registerRequest.getPassword()));
|
|
|
|
|
user.setActive(true);
|
|
|
|
|
user.setEmailVerified(true);
|
|
|
|
|
|
|
|
|
|
if (registerRequest.getCompanyName() != null) {
|
|
|
|
|
user.setCompany(registerRequest.getCompanyName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (registerRequest.getPhone() != null) {
|
|
|
|
|
user.setPhone(registerRequest.getPhone());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
User savedUser = userRepository.save(user);
|
|
|
|
|
|
|
|
|
|
AuthToken authToken = authService.generateAuthToken(savedUser);
|
|
|
|
|
|
|
|
|
|
authTokenRepository.save(authToken);
|
|
|
|
|
|
|
|
|
|
return ResponseEntity.ok().body(savedUser);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@DeleteMapping("/delete-user/{userId}")
|
|
|
|
|
public ResponseEntity<?> addUser(@PathVariable Long userId) {
|
|
|
|
|
userRepository.deleteById(userId);
|
|
|
|
|
return ResponseEntity.ok().body(Map.of("userId", userId, "deleted", "true"));
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-26 11:33:33 +07:00
|
|
|
}
|