diff --git a/build.gradle.kts b/build.gradle.kts index 133f628..39bf11b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,7 +41,6 @@ dependencies { implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-security") implementation("org.springframework.boot:spring-boot-starter-web") - implementation("org.springframework.boot:spring-boot-starter-validation") implementation("org.flywaydb:flyway-core") implementation("org.flywaydb:flyway-database-postgresql:11.10.0") implementation("org.postgresql:postgresql") diff --git a/src/main/java/ru/team58/profileservice/controller/UserController.java b/src/main/java/ru/team58/profileservice/controller/UserController.java index 446b742..2c18b1b 100644 --- a/src/main/java/ru/team58/profileservice/controller/UserController.java +++ b/src/main/java/ru/team58/profileservice/controller/UserController.java @@ -1,8 +1,6 @@ package ru.team58.profileservice.controller; -import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import ru.team58.profileservice.controller.exceptions.BadRequestException; import ru.team58.profileservice.controller.exceptions.UnauthorizedException; @@ -11,7 +9,7 @@ import ru.team58.profileservice.controller.schemes.CreateUserRequest; import ru.team58.profileservice.controller.schemes.GetUserResponse; import ru.team58.profileservice.controller.schemes.UpdateUserRequest; import ru.team58.profileservice.controller.schemes.UserResponse; -import ru.team58.profileservice.mapper.*; +import ru.team58.profileservice.mapper.UserMapper; import ru.team58.profileservice.service.UserDTO; import ru.team58.profileservice.service.UserService; import ru.team58.profileservice.service.exceptions.UserAlreadyExistsException; @@ -24,18 +22,6 @@ public class UserController { @Autowired UserService userService; - @Autowired - UserResponseMapper userResponseMapper; - - @Autowired - GetUserMapper getUserMapper; - - @Autowired - UpdateUserMapper updateUserMapper; - - @Autowired - CreateUserMapper createUserMapper; - @GetMapping("/") public UserResponse getMe(Principal principal) { if (principal == null) { @@ -48,11 +34,11 @@ public class UserController { throw new UserNotFoundException(); } - return userResponseMapper.toUserResponse(userService.getByUsername(principal.getName())); + return UserMapper.INSTANCE.toUserResponse(userService.getByUsername(principal.getName())); } - @PutMapping(value = "/", consumes = {MediaType.APPLICATION_JSON_VALUE}) - public void updateMe(Principal principal, @Valid @RequestBody UpdateUserRequest request) { + @PutMapping("/") + public void updateMe(Principal principal, @RequestBody UpdateUserRequest request) { if (principal == null) { throw new UnauthorizedException(); } @@ -63,7 +49,7 @@ public class UserController { throw new UserNotFoundException(); } - userService.updateUser(updateUserMapper.toUserDTO(request)); + userService.updateUser(UserMapper.INSTANCE.toUserDTO(request)); } @DeleteMapping("/") @@ -83,9 +69,9 @@ public class UserController { userService.deleteUser(user.getId()); } - @PostMapping(value = "/", consumes = MediaType.APPLICATION_JSON_VALUE) - public void createMe(@Valid @RequestBody CreateUserRequest request) { - UserDTO user = createUserMapper.toUserDTO(request); + @PostMapping("/") + public void createMe(@RequestBody CreateUserRequest request) { + UserDTO user = UserMapper.INSTANCE.toUserDTO(request); try { userService.createUser(user); @@ -106,7 +92,7 @@ public class UserController { throw new UserNotFoundException(); } - return getUserMapper.toGetUserResponse(user); + return UserMapper.INSTANCE.toGetUserResponse(user); } @DeleteMapping("/{id}") diff --git a/src/main/java/ru/team58/profileservice/controller/advice/ErrorDTO.java b/src/main/java/ru/team58/profileservice/controller/advice/ErrorDTO.java deleted file mode 100644 index a22df5a..0000000 --- a/src/main/java/ru/team58/profileservice/controller/advice/ErrorDTO.java +++ /dev/null @@ -1,16 +0,0 @@ -package ru.team58.profileservice.controller.advice; - -import lombok.*; -import org.springframework.http.HttpStatus; - -import java.util.List; - -@NoArgsConstructor -@AllArgsConstructor -@Getter -@Setter -@Builder -public class ErrorDTO { - HttpStatus status; - List errors; -} diff --git a/src/main/java/ru/team58/profileservice/controller/advice/UserControllerExceptionHandler.java b/src/main/java/ru/team58/profileservice/controller/advice/UserControllerExceptionHandler.java index b9f7546..bd0d990 100644 --- a/src/main/java/ru/team58/profileservice/controller/advice/UserControllerExceptionHandler.java +++ b/src/main/java/ru/team58/profileservice/controller/advice/UserControllerExceptionHandler.java @@ -2,63 +2,39 @@ package ru.team58.profileservice.controller.advice; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.validation.FieldError; -import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.bind.annotation.ResponseStatus; import ru.team58.profileservice.controller.exceptions.*; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - @ControllerAdvice public class UserControllerExceptionHandler { @ExceptionHandler(UserNotFoundException.class) - public ResponseEntity handleUserNotFoundException(UserNotFoundException ex) { - var error = new ErrorDTO(HttpStatus.FORBIDDEN, List.of("User not found")); - return ResponseEntity.status(error.status).body(error); + public ResponseEntity handleUserNotFoundException(UserNotFoundException ex) { + ErrorDetails errorDetails = new ErrorDetails("User not found", HttpStatus.FORBIDDEN.value()); + return new ResponseEntity<>(errorDetails, HttpStatus.FORBIDDEN); } @ExceptionHandler(UserAlreadyExistsException.class) - public ResponseEntity handleUserAlreadyExistsException(UserAlreadyExistsException ex) { - var errorDetails = new ErrorDetails("User already exists", HttpStatus.BAD_REQUEST.value()); - var error = new ErrorDTO(HttpStatus.BAD_REQUEST, List.of("User already exists")); - return ResponseEntity.status(error.status).body(error); + public ResponseEntity handleUserAlreadyExistsException(UserAlreadyExistsException ex) { + ErrorDetails errorDetails = new ErrorDetails("User already exists", HttpStatus.BAD_REQUEST.value()); + return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST); } @ExceptionHandler(BadRequestException.class) - public ResponseEntity handleBadRequestException(BadRequestException ex) { - var error = new ErrorDTO(HttpStatus.BAD_REQUEST, List.of("Bad request")); - return ResponseEntity.status(error.status).body(error); + public ResponseEntity handleBadRequestException(BadRequestException ex) { + ErrorDetails errorDetails = new ErrorDetails("Bad Request", HttpStatus.BAD_REQUEST.value()); + return new ResponseEntity<>(errorDetails, HttpStatus.BAD_REQUEST); } @ExceptionHandler(ForbiddenException.class) - public ResponseEntity handleForbiddenException(ForbiddenException ex) { - var error = new ErrorDTO(HttpStatus.FORBIDDEN, List.of("Forbidden")); - return ResponseEntity.status(error.status).body(error); + public ResponseEntity handleForbiddenException(ForbiddenException ex) { + ErrorDetails errorDetails = new ErrorDetails("Forbidden", HttpStatus.FORBIDDEN.value()); + return new ResponseEntity<>(errorDetails, HttpStatus.FORBIDDEN); } @ExceptionHandler(UnauthorizedException.class) - public ResponseEntity handleUnauthorizedException(UnauthorizedException ex) { - var error = new ErrorDTO(HttpStatus.UNAUTHORIZED, List.of("Unauthorized")); - return ResponseEntity.status(error.status).body(error); - } - - @ExceptionHandler(MethodArgumentNotValidException.class) - public ResponseEntity handleValidationExceptions( - MethodArgumentNotValidException ex) { - var errors = new ArrayList(); - ex.getBindingResult().getAllErrors().forEach((error) -> { - var fieldName = ((FieldError) error).getField(); - var errorMessage = error.getDefaultMessage(); - errors.add(String.format("%s: %s", fieldName, errorMessage)); - }); - - var error = new ErrorDTO(HttpStatus.BAD_REQUEST, errors); - return ResponseEntity.status(error.status).body(error); + public ResponseEntity handleUnauthorizedException(UnauthorizedException ex) { + ErrorDetails errorDetails = new ErrorDetails("Unauthorized", HttpStatus.UNAUTHORIZED.value()); + return new ResponseEntity<>(errorDetails, HttpStatus.UNAUTHORIZED); } } diff --git a/src/main/java/ru/team58/profileservice/controller/exceptions/IncorrectEmailException.java b/src/main/java/ru/team58/profileservice/controller/exceptions/IncorrectEmailException.java deleted file mode 100644 index 7e35e40..0000000 --- a/src/main/java/ru/team58/profileservice/controller/exceptions/IncorrectEmailException.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.team58.profileservice.controller.exceptions; - -public class IncorrectEmailException extends BadRequestException { -} diff --git a/src/main/java/ru/team58/profileservice/controller/schemes/CreateUserRequest.java b/src/main/java/ru/team58/profileservice/controller/schemes/CreateUserRequest.java index 428ab9a..6344ece 100644 --- a/src/main/java/ru/team58/profileservice/controller/schemes/CreateUserRequest.java +++ b/src/main/java/ru/team58/profileservice/controller/schemes/CreateUserRequest.java @@ -1,10 +1,15 @@ package ru.team58.profileservice.controller.schemes; -import lombok.*; -import lombok.experimental.SuperBuilder; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; @Getter @Setter -@SuperBuilder -@NoArgsConstructor -public class CreateUserRequest extends UserScheme {} +@Builder +public class CreateUserRequest { + String username; + String firstName; + String lastName; + String email; +} diff --git a/src/main/java/ru/team58/profileservice/controller/schemes/UpdateUserRequest.java b/src/main/java/ru/team58/profileservice/controller/schemes/UpdateUserRequest.java index 51cadcb..6548494 100644 --- a/src/main/java/ru/team58/profileservice/controller/schemes/UpdateUserRequest.java +++ b/src/main/java/ru/team58/profileservice/controller/schemes/UpdateUserRequest.java @@ -1,13 +1,18 @@ package ru.team58.profileservice.controller.schemes; -import lombok.*; -import lombok.experimental.SuperBuilder; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; import java.util.UUID; @Getter @Setter -@SuperBuilder -@NoArgsConstructor -public class UpdateUserRequest extends UserScheme { +@Builder +public class UpdateUserRequest { + UUID id; + String username; + String firstName; + String lastName; + String email; } diff --git a/src/main/java/ru/team58/profileservice/controller/schemes/UserScheme.java b/src/main/java/ru/team58/profileservice/controller/schemes/UserScheme.java deleted file mode 100644 index 49246ba..0000000 --- a/src/main/java/ru/team58/profileservice/controller/schemes/UserScheme.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.team58.profileservice.controller.schemes; - -import jakarta.validation.constraints.*; -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; -import lombok.experimental.SuperBuilder; - -import java.util.UUID; - -@SuperBuilder -@Getter -@Setter -@NoArgsConstructor -@AllArgsConstructor -public class UserScheme { - private UUID id; - - @NotBlank(message = "Username cannot be empty") - @Pattern(regexp = "^[a-z0-9.]+$", message = "Username can have only characters: a-z and 0-9") - @Size(min = 3, max = 14, message = "Username must be bigger than 3 and less than 14") - private String username; - - @NotBlank(message = "First name cannot be empty") - @Pattern(regexp = "^[a-zA-Zа-яА-Я]*$", message = "First name can contain only letters") - @Size(min = 3, max = 255, message = "First name must be bigger than 3 and less than 255") - private String firstName; - - @NotBlank(message = "Last name cannot be empty") - @Pattern(regexp = "^[a-zA-Zа-яА-Я]*$", message = "Last name can contain only letters") - @Size(min = 3, max = 255, message = "Last name must be bigger than 3 and less than 255") - private String lastName; - - @NotBlank - @Email(regexp = "[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,3}", message = """ - Email can contain: a-z, 0-9, '.', '_', '%', '+', '-'. - And have format like: "example@domain.com".""") - @Size(min = 5, max = 255, message = "Email must be bigger than 5 and less than 255") - private String email; -} diff --git a/src/main/java/ru/team58/profileservice/mapper/CreateUserMapper.java b/src/main/java/ru/team58/profileservice/mapper/CreateUserMapper.java deleted file mode 100644 index b1a6df8..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/CreateUserMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import ru.team58.profileservice.controller.schemes.CreateUserRequest; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface CreateUserMapper { - @Mapping(target = "id", ignore = true) - UserDTO toUserDTO(CreateUserRequest request); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/GetUserMapper.java b/src/main/java/ru/team58/profileservice/mapper/GetUserMapper.java deleted file mode 100644 index 7750f75..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/GetUserMapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import org.mapstruct.factory.Mappers; -import ru.team58.profileservice.controller.schemes.GetUserResponse; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface GetUserMapper { - GetUserResponse toGetUserResponse(UserDTO dto); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/UpdateUserMapper.java b/src/main/java/ru/team58/profileservice/mapper/UpdateUserMapper.java deleted file mode 100644 index f8e67ca..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/UpdateUserMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import ru.team58.profileservice.controller.schemes.UpdateUserRequest; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface UpdateUserMapper { - UserDTO toUserDTO(UpdateUserRequest request); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/UserDTOMapper.java b/src/main/java/ru/team58/profileservice/mapper/UserDTOMapper.java deleted file mode 100644 index 9d39f48..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/UserDTOMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import ru.team58.profileservice.persistence.entity.UserEntity; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface UserDTOMapper { - UserDTO toUserDTO(UserEntity entity); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/UserEntityMapper.java b/src/main/java/ru/team58/profileservice/mapper/UserEntityMapper.java deleted file mode 100644 index 6840427..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/UserEntityMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import ru.team58.profileservice.persistence.entity.UserEntity; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface UserEntityMapper { - UserEntity toUserEntity(UserDTO dto); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/UserMapper.java b/src/main/java/ru/team58/profileservice/mapper/UserMapper.java new file mode 100644 index 0000000..857bcae --- /dev/null +++ b/src/main/java/ru/team58/profileservice/mapper/UserMapper.java @@ -0,0 +1,27 @@ +package ru.team58.profileservice.mapper; + +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; +import ru.team58.profileservice.controller.schemes.CreateUserRequest; +import ru.team58.profileservice.controller.schemes.GetUserResponse; +import ru.team58.profileservice.controller.schemes.UpdateUserRequest; +import ru.team58.profileservice.controller.schemes.UserResponse; +import ru.team58.profileservice.persistence.entity.UserEntity; +import ru.team58.profileservice.service.UserDTO; + +@Mapper(componentModel = "spring") +public interface UserMapper { + UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); + + UserDTO toUserDTO(UserEntity entity); + UserDTO toUserDTO(UpdateUserRequest request); + @Mapping(target = "id", ignore = true) + UserDTO toUserDTO(CreateUserRequest request); + + UserEntity toUserEntity(UserDTO dto); + + UserResponse toUserResponse(UserDTO dto); + + GetUserResponse toGetUserResponse(UserDTO dto); +} diff --git a/src/main/java/ru/team58/profileservice/mapper/UserResponseMapper.java b/src/main/java/ru/team58/profileservice/mapper/UserResponseMapper.java deleted file mode 100644 index c810ba6..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/UserResponseMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import ru.team58.profileservice.controller.schemes.UserResponse; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(componentModel = "spring") -public interface UserResponseMapper { - UserResponse toUserResponse(UserDTO dto); -} diff --git a/src/main/java/ru/team58/profileservice/mapper/UserSchemeMapper.java b/src/main/java/ru/team58/profileservice/mapper/UserSchemeMapper.java deleted file mode 100644 index 34a826c..0000000 --- a/src/main/java/ru/team58/profileservice/mapper/UserSchemeMapper.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.team58.profileservice.mapper; - -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import ru.team58.profileservice.controller.schemes.UserScheme; -import ru.team58.profileservice.service.UserDTO; - -@Mapper(uses = {CreateUserMapper.class, UpdateUserMapper.class}) -public interface UserSchemeMapper { - @Mapping(target = "id", ignore = true) - UserDTO toUserDTO(UserScheme user); -} diff --git a/src/main/java/ru/team58/profileservice/persistence/entity/UserEntity.java b/src/main/java/ru/team58/profileservice/persistence/entity/UserEntity.java index 6cb0d41..b509abe 100644 --- a/src/main/java/ru/team58/profileservice/persistence/entity/UserEntity.java +++ b/src/main/java/ru/team58/profileservice/persistence/entity/UserEntity.java @@ -1,7 +1,6 @@ package ru.team58.profileservice.persistence.entity; import jakarta.persistence.*; -import jakarta.validation.constraints.*; import lombok.*; import java.util.UUID; diff --git a/src/main/java/ru/team58/profileservice/service/UserDTO.java b/src/main/java/ru/team58/profileservice/service/UserDTO.java index d23bd29..d0834f6 100644 --- a/src/main/java/ru/team58/profileservice/service/UserDTO.java +++ b/src/main/java/ru/team58/profileservice/service/UserDTO.java @@ -1,7 +1,12 @@ package ru.team58.profileservice.service; -import jakarta.validation.Valid; import lombok.*; +import ru.team58.profileservice.persistence.entity.UserEntity; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Objects; import java.util.UUID; @Getter diff --git a/src/main/java/ru/team58/profileservice/service/UserServiceImpl.java b/src/main/java/ru/team58/profileservice/service/UserServiceImpl.java index 1b2fb5e..821adcb 100644 --- a/src/main/java/ru/team58/profileservice/service/UserServiceImpl.java +++ b/src/main/java/ru/team58/profileservice/service/UserServiceImpl.java @@ -2,8 +2,7 @@ package ru.team58.profileservice.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import ru.team58.profileservice.mapper.UserDTOMapper; -import ru.team58.profileservice.mapper.UserEntityMapper; +import ru.team58.profileservice.mapper.UserMapper; import ru.team58.profileservice.persistence.entity.UserEntity; import ru.team58.profileservice.persistence.repo.UserRepository; import ru.team58.profileservice.service.exceptions.UserAlreadyExistsException; @@ -16,21 +15,16 @@ public class UserServiceImpl implements UserService { @Autowired UserRepository userRepository; - @Autowired - UserDTOMapper userDTOMapper; - @Autowired - UserEntityMapper userEntityMapper; - @Override public UserDTO getById(UUID id) { UserEntity user = userRepository.findById(id).orElseThrow(UserNotFoundException::new); - return userDTOMapper.toUserDTO(user); + return UserMapper.INSTANCE.toUserDTO(user); } @Override public UserDTO getByUsername(String username) { UserEntity user = userRepository.findByUsername(username).orElseThrow(UserNotFoundException::new); - return userDTOMapper.toUserDTO(user); + return UserMapper.INSTANCE.toUserDTO(user); } @Override @@ -38,7 +32,7 @@ public class UserServiceImpl implements UserService { userRepository.findByUsername(user.username).ifPresent(u -> { throw new UserAlreadyExistsException(); }); - return userRepository.save(userEntityMapper.toUserEntity(user)).getId(); + return userRepository.save(UserMapper.INSTANCE.toUserEntity(user)).getId(); } @Override @@ -50,6 +44,6 @@ public class UserServiceImpl implements UserService { @Override public void updateUser(UserDTO user) { userRepository.findById(user.getId()).orElseThrow(UserNotFoundException::new); - userRepository.save(userEntityMapper.toUserEntity(user)); + userRepository.save(UserMapper.INSTANCE.toUserEntity(user)); } } diff --git a/src/test/java/ru/team58/profileservice/ProfileServiceTest.java b/src/test/java/ru/team58/profileservice/ProfileServiceTest.java deleted file mode 100644 index afeecdc..0000000 --- a/src/test/java/ru/team58/profileservice/ProfileServiceTest.java +++ /dev/null @@ -1,12 +0,0 @@ -package ru.team58.profileservice; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.context.SpringBootTest; - -@SpringBootTest -public class ProfileServiceTest { - @Test - public void contextLoads() { - - } -}