Unverified Commit b6050b18 authored by devteria.com's avatar devteria.com Committed by GitHub

Merge pull request #3 from devteria/course/lombok-and-maptruct

add lombok and mapstruct
parents 64452901 e8b97f37
...@@ -10,11 +10,14 @@ ...@@ -10,11 +10,14 @@
</parent> </parent>
<groupId>com.devteria</groupId> <groupId>com.devteria</groupId>
<artifactId>identity-service</artifactId> <artifactId>identity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>identity-service</name> <name>identity-service</name>
<version>0.0.1-SNAPSHOT</version>
<description>Identity service</description> <description>Identity service</description>
<properties> <properties>
<java.version>21</java.version> <java.version>21</java.version>
<projectlombok-lombok.version>1.18.30</projectlombok-lombok.version>
<mapstruct.version>1.5.5.Final</mapstruct.version>
<lombok-mapstruct-binding.version>0.2.0</lombok-mapstruct-binding.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
...@@ -34,6 +37,17 @@ ...@@ -34,6 +37,17 @@
<artifactId>mysql-connector-j</artifactId> <artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${projectlombok-lombok.version}</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>
...@@ -46,6 +60,45 @@ ...@@ -46,6 +60,45 @@
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId> <artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>${maven-compiler-plugin.version}</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${projectlombok-lombok.version}</version>
</path>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok-mapstruct-binding</artifactId>
<version>${lombok-mapstruct-binding.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
<arg>-Amapstruct.verbose=true</arg>
</compilerArgs>
</configuration>
</plugin> </plugin>
</plugins> </plugins>
</build> </build>
......
...@@ -3,23 +3,26 @@ package com.devteria.identityservice.controller; ...@@ -3,23 +3,26 @@ package com.devteria.identityservice.controller;
import com.devteria.identityservice.dto.request.ApiResponse; import com.devteria.identityservice.dto.request.ApiResponse;
import com.devteria.identityservice.dto.request.UserCreationRequest; import com.devteria.identityservice.dto.request.UserCreationRequest;
import com.devteria.identityservice.dto.request.UserUpdateRequest; import com.devteria.identityservice.dto.request.UserUpdateRequest;
import com.devteria.identityservice.entity.User; import com.devteria.identityservice.dto.response.UserResponse;
import com.devteria.identityservice.service.UserService; import com.devteria.identityservice.service.UserService;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import java.util.List; import java.util.List;
@RestController @RestController
@RequestMapping("/users") @RequestMapping("/users")
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class UserController { public class UserController {
@Autowired UserService userService;
private UserService userService;
@PostMapping @PostMapping
ApiResponse<User> createUser(@RequestBody @Valid UserCreationRequest request){ ApiResponse<UserResponse> createUser(@RequestBody @Valid UserCreationRequest request){
ApiResponse<User> apiResponse = new ApiResponse<>(); ApiResponse<UserResponse> apiResponse = new ApiResponse<>();
apiResponse.setResult(userService.createUser(request)); apiResponse.setResult(userService.createUser(request));
...@@ -27,17 +30,17 @@ public class UserController { ...@@ -27,17 +30,17 @@ public class UserController {
} }
@GetMapping @GetMapping
List<User> getUsers(){ List<UserResponse> getUsers(){
return userService.getUsers(); return userService.getUsers();
} }
@GetMapping("/{userId}") @GetMapping("/{userId}")
User getUser(@PathVariable("userId") String userId){ UserResponse getUser(@PathVariable("userId") String userId){
return userService.getUser(userId); return userService.getUser(userId);
} }
@PutMapping("/{userId}") @PutMapping("/{userId}")
User updateUser(@PathVariable String userId, @RequestBody UserUpdateRequest request){ UserResponse updateUser(@PathVariable String userId, @RequestBody UserUpdateRequest request){
return userService.updateUser(userId, request); return userService.updateUser(userId, request);
} }
......
package com.devteria.identityservice.dto.request; package com.devteria.identityservice.dto.request;
import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.*;
import lombok.experimental.FieldDefaults;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
@JsonInclude(JsonInclude.Include.NON_NULL) @JsonInclude(JsonInclude.Include.NON_NULL)
public class ApiResponse <T> { public class ApiResponse <T> {
private int code = 1000; private int code = 1000;
private String message; private String message;
private T result; private T result;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public T getResult() {
return result;
}
public void setResult(T result) {
this.result = result;
}
} }
package com.devteria.identityservice.dto.request; package com.devteria.identityservice.dto.request;
import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.time.LocalDate; import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserCreationRequest { public class UserCreationRequest {
@Size(min = 3,message = "USERNAME_INVALID") @Size(min = 3,message = "USERNAME_INVALID")
private String username; String username;
@Size(min = 8, message = "INVALID_PASSWORD") @Size(min = 8, message = "INVALID_PASSWORD")
private String password; String password;
private String firstName; String firstName;
private String lastName; String lastName;
LocalDate dob;
private LocalDate dob;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getDob() {
return dob;
}
public void setDob(LocalDate dob) {
this.dob = dob;
}
} }
package com.devteria.identityservice.dto.request; package com.devteria.identityservice.dto.request;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.time.LocalDate; import java.time.LocalDate;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserUpdateRequest { public class UserUpdateRequest {
private String password; String password;
private String firstName; String firstName;
private String lastName; String lastName;
private LocalDate dob; LocalDate dob;
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public LocalDate getDob() {
return dob;
}
public void setDob(LocalDate dob) {
this.dob = dob;
}
} }
package com.devteria.identityservice.dto.response;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserResponse {
String id;
String username;
String password;
String firstName;
String lastName;
LocalDate dob;
}
package com.devteria.identityservice.mapper;
import com.devteria.identityservice.dto.request.UserCreationRequest;
import com.devteria.identityservice.dto.request.UserUpdateRequest;
import com.devteria.identityservice.dto.response.UserResponse;
import com.devteria.identityservice.entity.User;
import org.mapstruct.Mapper;
import org.mapstruct.MappingTarget;
@Mapper(componentModel = "spring")
public interface UserMapper {
User toUser(UserCreationRequest request);
UserResponse toUserResponse(User user);
void updateUser(@MappingTarget User user, UserUpdateRequest request);
}
...@@ -2,56 +2,55 @@ package com.devteria.identityservice.service; ...@@ -2,56 +2,55 @@ package com.devteria.identityservice.service;
import com.devteria.identityservice.dto.request.UserCreationRequest; import com.devteria.identityservice.dto.request.UserCreationRequest;
import com.devteria.identityservice.dto.request.UserUpdateRequest; import com.devteria.identityservice.dto.request.UserUpdateRequest;
import com.devteria.identityservice.dto.response.UserResponse;
import com.devteria.identityservice.entity.User; import com.devteria.identityservice.entity.User;
import com.devteria.identityservice.exception.AppException; import com.devteria.identityservice.exception.AppException;
import com.devteria.identityservice.exception.ErrorCode; import com.devteria.identityservice.exception.ErrorCode;
import com.devteria.identityservice.mapper.UserMapper;
import com.devteria.identityservice.repository.UserRepository; import com.devteria.identityservice.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired; import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
@Service @Service
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class UserService { public class UserService {
@Autowired UserRepository userRepository;
private UserRepository userRepository; UserMapper userMapper;
public User createUser(UserCreationRequest request){
User user = new User();
public UserResponse createUser(UserCreationRequest request){
if (userRepository.existsByUsername(request.getUsername())) if (userRepository.existsByUsername(request.getUsername()))
throw new AppException(ErrorCode.USER_EXISTED); throw new AppException(ErrorCode.USER_EXISTED);
user.setUsername(request.getUsername()); User user = userMapper.toUser(request);
user.setPassword(request.getPassword());
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setDob(request.getDob());
return userRepository.save(user); return userMapper.toUserResponse(userRepository.save(user));
} }
public User updateUser(String userId, UserUpdateRequest request) { public UserResponse updateUser(String userId, UserUpdateRequest request) {
User user = getUser(userId); User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("User not found"));
user.setPassword(request.getPassword()); userMapper.updateUser(user, request);
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setDob(request.getDob());
return userRepository.save(user); return userMapper.toUserResponse(userRepository.save(user));
} }
public void deleteUser(String userId){ public void deleteUser(String userId){
userRepository.deleteById(userId); userRepository.deleteById(userId);
} }
public List<User> getUsers(){ public List<UserResponse> getUsers(){
return userRepository.findAll(); return userRepository.findAll().stream()
.map(userMapper::toUserResponse).toList();
} }
public User getUser(String id){ public UserResponse getUser(String id){
return userRepository.findById(id) return userMapper.toUserResponse(userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found")); .orElseThrow(() -> new RuntimeException("User not found")));
} }
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment