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-02-04 11:47:43 +07:00
|
|
|
import ru.soune.nocopy.dto.tarriff.TariffInfoDTO;
|
2026-01-20 03:47:51 +07:00
|
|
|
import ru.soune.nocopy.dto.user.UserDTO;
|
|
|
|
|
import ru.soune.nocopy.dto.user.UserRequest;
|
2026-02-04 11:47:43 +07:00
|
|
|
import ru.soune.nocopy.entity.tarif.Tariff;
|
2026-02-03 15:05:03 +07:00
|
|
|
import ru.soune.nocopy.entity.tarif.TariffInfo;
|
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-02-04 11:47:43 +07:00
|
|
|
import ru.soune.nocopy.service.file.FileStatsService;
|
2026-01-27 08:09:54 +07:00
|
|
|
import ru.soune.nocopy.service.register.AuthService;
|
2026-02-03 15:05:03 +07:00
|
|
|
import ru.soune.nocopy.service.tariff.TariffService;
|
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;
|
|
|
|
|
|
2026-02-03 15:05:03 +07:00
|
|
|
private final TariffService tariffService;
|
|
|
|
|
|
2026-02-04 11:47:43 +07:00
|
|
|
private final FileStatsService fileStatsService;
|
|
|
|
|
|
2025-11-26 11:33:33 +07:00
|
|
|
@GetMapping("/all")
|
|
|
|
|
public ResponseEntity<List<UserDTO>> getAllUsers() {
|
|
|
|
|
List<UserDTO> allUsers = userRepository.findAll().stream()
|
2026-01-29 21:46:37 +07:00
|
|
|
.map(u -> new UserDTO(u.getFullName(), u.getCompanyName(), u.getEmail(), u.isActive(),
|
2025-11-27 03:05:07 +07:00
|
|
|
u.getPhone(), u.getGenderType(),
|
2026-02-04 11:47:43 +07:00
|
|
|
u.getBirthday(), u.getCreatedAt(), u.getSubscriptionType(), tariffService.getAllTariffs(),
|
2026-02-04 13:41:09 +07:00
|
|
|
null, null))
|
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);
|
|
|
|
|
|
2026-02-03 15:05:03 +07:00
|
|
|
if (tokenOptional.isPresent()) {
|
2026-01-20 15:12:24 +07:00
|
|
|
User user = userRepository.findByEmail(email);
|
2026-02-03 15:05:03 +07:00
|
|
|
|
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());
|
2026-01-29 21:31:28 +07:00
|
|
|
|
|
|
|
|
if (user.getCompany() != null) {
|
|
|
|
|
userDTO.setCompany(user.getCompany().getCompanyName());
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-03 15:05:03 +07:00
|
|
|
if (user.canManageCompanySettings() || user.canLogin() && user.getCompany() == null) {
|
|
|
|
|
userDTO.setTariffs(tariffService.getAllTariffs());
|
|
|
|
|
|
2026-02-04 11:47:43 +07:00
|
|
|
Long fileOnDisk = user.canManageCompanySettings() ?
|
|
|
|
|
fileStatsService.calculateCompanyFileSize(user.getId()):
|
|
|
|
|
fileStatsService.calculateUserFileSize(user.getId());
|
|
|
|
|
|
|
|
|
|
Integer filesCount = user.canManageCompanySettings() ?
|
|
|
|
|
fileStatsService.filesCompanyCount(user.getId()):
|
|
|
|
|
fileStatsService.filesUserCount(user.getId());
|
|
|
|
|
|
2026-02-05 12:44:27 +07:00
|
|
|
TariffInfo personalTariffInfo;
|
|
|
|
|
|
|
|
|
|
if (user.getCompany() == null) {
|
|
|
|
|
personalTariffInfo = user.getPersonalTariffInfo();
|
|
|
|
|
} else {
|
|
|
|
|
personalTariffInfo = user.getCompany().getTariffInfo();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-04 11:47:43 +07:00
|
|
|
Tariff tariff = personalTariffInfo.getTariff();
|
|
|
|
|
|
|
|
|
|
TariffInfoDTO infoDTO = TariffInfoDTO.builder().tokens(personalTariffInfo.getTokens())
|
|
|
|
|
.id(personalTariffInfo.getId())
|
|
|
|
|
.tariffName(tariff.getName())
|
|
|
|
|
.status(personalTariffInfo.getStatus().name())
|
|
|
|
|
.tariffId(tariff.getId())
|
|
|
|
|
.currentFileCounts(filesCount)
|
|
|
|
|
.maxFileCounts(tariff.getMaxFilesCount())
|
|
|
|
|
.currentFileOnDisk(fileOnDisk)
|
|
|
|
|
.maxFileOnDisk(tariff.getDiskSize())
|
|
|
|
|
.startTariff(personalTariffInfo.getStartTariff())
|
|
|
|
|
.endTariff(personalTariffInfo.getEndTariff())
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
userDTO.setTariffInfo(infoDTO);
|
2026-02-03 15:05:03 +07:00
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-20 15:12:24 +07:00
|
|
|
userDTO.setPhone(user.getPhone());
|
|
|
|
|
userDTO.setGenderType(user.getGenderType());
|
|
|
|
|
userDTO.setBirthday(user.getBirthday());
|
|
|
|
|
userDTO.setCreatedAt(user.getCreatedAt());
|
|
|
|
|
userDTO.setSubscriptionType(user.getSubscriptionType());
|
|
|
|
|
userDTO.setActive(user.isActive());
|
2026-02-04 13:41:09 +07:00
|
|
|
userDTO.setPermission(user.getUserPermissions());
|
2025-12-02 13:57:07 +07:00
|
|
|
|
|
|
|
|
return ResponseEntity.ok(userDTO);
|
|
|
|
|
}
|
2026-02-03 15:05:03 +07:00
|
|
|
} else {
|
|
|
|
|
return ResponseEntity.notFound().build();
|
2025-12-02 13:57:07 +07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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.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
|
|
|
}
|