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 @@
</parent>
<groupId>com.devteria</groupId>
<artifactId>identity-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>identity-service</name>
<version>0.0.1-SNAPSHOT</version>
<description>Identity service</description>
<properties>
<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>
<dependencies>
<dependency>
......@@ -34,6 +37,17 @@
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
......@@ -46,6 +60,45 @@
<plugin>
<groupId>org.springframework.boot</groupId>
<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>
</plugins>
</build>
......
......@@ -3,23 +3,26 @@ package com.devteria.identityservice.controller;
import com.devteria.identityservice.dto.request.ApiResponse;
import com.devteria.identityservice.dto.request.UserCreationRequest;
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 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 java.util.List;
@RestController
@RequestMapping("/users")
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class UserController {
@Autowired
private UserService userService;
UserService userService;
@PostMapping
ApiResponse<User> createUser(@RequestBody @Valid UserCreationRequest request){
ApiResponse<User> apiResponse = new ApiResponse<>();
ApiResponse<UserResponse> createUser(@RequestBody @Valid UserCreationRequest request){
ApiResponse<UserResponse> apiResponse = new ApiResponse<>();
apiResponse.setResult(userService.createUser(request));
......@@ -27,17 +30,17 @@ public class UserController {
}
@GetMapping
List<User> getUsers(){
List<UserResponse> getUsers(){
return userService.getUsers();
}
@GetMapping("/{userId}")
User getUser(@PathVariable("userId") String userId){
UserResponse getUser(@PathVariable("userId") String userId){
return userService.getUser(userId);
}
@PutMapping("/{userId}")
User updateUser(@PathVariable String userId, @RequestBody UserUpdateRequest request){
UserResponse updateUser(@PathVariable String userId, @RequestBody UserUpdateRequest request){
return userService.updateUser(userId, request);
}
......
package com.devteria.identityservice.dto.request;
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)
public class ApiResponse <T> {
private int code = 1000;
private String message;
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;
import jakarta.validation.constraints.Size;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.time.LocalDate;
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserCreationRequest {
@Size(min = 3,message = "USERNAME_INVALID")
private String username;
String username;
@Size(min = 8, message = "INVALID_PASSWORD")
private String password;
private String firstName;
private String lastName;
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;
}
String password;
String firstName;
String lastName;
LocalDate dob;
}
package com.devteria.identityservice.dto.request;
import lombok.*;
import lombok.experimental.FieldDefaults;
import java.time.LocalDate;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE)
public class UserUpdateRequest {
private String password;
private String firstName;
private String lastName;
private 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;
}
String password;
String firstName;
String lastName;
LocalDate 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;
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 com.devteria.identityservice.exception.AppException;
import com.devteria.identityservice.exception.ErrorCode;
import com.devteria.identityservice.mapper.UserMapper;
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 java.util.List;
@Service
@RequiredArgsConstructor
@FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true)
public class UserService {
@Autowired
private UserRepository userRepository;
public User createUser(UserCreationRequest request){
User user = new User();
UserRepository userRepository;
UserMapper userMapper;
public UserResponse createUser(UserCreationRequest request){
if (userRepository.existsByUsername(request.getUsername()))
throw new AppException(ErrorCode.USER_EXISTED);
user.setUsername(request.getUsername());
user.setPassword(request.getPassword());
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setDob(request.getDob());
User user = userMapper.toUser(request);
return userRepository.save(user);
return userMapper.toUserResponse(userRepository.save(user));
}
public User updateUser(String userId, UserUpdateRequest request) {
User user = getUser(userId);
public UserResponse updateUser(String userId, UserUpdateRequest request) {
User user = userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("User not found"));
user.setPassword(request.getPassword());
user.setFirstName(request.getFirstName());
user.setLastName(request.getLastName());
user.setDob(request.getDob());
userMapper.updateUser(user, request);
return userRepository.save(user);
return userMapper.toUserResponse(userRepository.save(user));
}
public void deleteUser(String userId){
userRepository.deleteById(userId);
}
public List<User> getUsers(){
return userRepository.findAll();
public List<UserResponse> getUsers(){
return userRepository.findAll().stream()
.map(userMapper::toUserResponse).toList();
}
public User getUser(String id){
return userRepository.findById(id)
.orElseThrow(() -> new RuntimeException("User not found"));
public UserResponse getUser(String id){
return userMapper.toUserResponse(userRepository.findById(id)
.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