Files
no-copy/src/main/java/ru/soune/nocopy/controller/UserController.java
T

171 lines
6.6 KiB
Java
Raw Normal View History

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;
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;
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;
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;
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(),
u.getPhone(), u.getGenderType(),
u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType()))
2025-11-26 11:33:33 +07:00
.toList();
return ResponseEntity.ok(allUsers);
}
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();
}
//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));
}
@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
}