310. Basic User Sign up - dkkahm/study-springfamework5 GitHub Wiki

Request Model

@Data
public class UserDetailsRequest {
    private String firstName;
    private String lastName;
    private String email;
    private String password;
}

Response Model

@Data
public class UserResponse {
    private String userId;
    private String firstName;
    private String lastName;
    private String email;
}

DTO

@Data
public class UserDto {
    private String userId;
    private String firstName;
    private String lastName;
    private String email;
    private String password;
    private String encryptedPassword;
    private String emailVerificationToken;
    private Boolean emailVerificationStatus = false;
    private List<AddressDto> addresses = new ArrayList<AddressDto>();
}

Entity

@Data
@Entity(name="users")
public class UserEntity implements Serializable {
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;

    @Column(nullable = false, unique = true)
    private String userId;

    @Column(nullable = false, length = 50)
    private String firstName;

    @Column(nullable = false, length = 50)
    private String lastName;

    @Column(nullable = false, length = 120, unique = true)
    private String email;

    @Column(nullable = false)
    private String encryptedPassword;

    private String emailVerificationToken;

    @Column(nullable = false)
    private Boolean emailVerificationStatus = false;
}

Controller

@RestController
@RequestMapping("/users")
public class UserController {
    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public String getUsers() {
        return "get users called";
    }

    @PostMapping
    public UserResponse createUser(@RequestBody UserDetailsRequest userDetailsRequest) {
        UserResponse returnValue = new UserResponse();

        UserDto userModel = new UserDto();
        BeanUtils.copyProperties(userDetailsRequest, userModel);

        UserDto createdUser = userService.createUser(userModel);
        BeanUtils.copyProperties(createdUser, returnValue);

        return returnValue;
    }
}

Service

public interface UserService {
    UserDto createUser(UserDto userDto);
}

@Service
public class UserServiceImpl implements UserService {
    private final UserRepository userRepository;
    private final Utils utils;

    public UserServiceImpl(UserRepository userRepository, Utils utils) {
        this.userRepository = userRepository;
        this.utils = utils;
    }

    @Override
    public UserDto createUser(UserDto user) {
        if(userRepository.findByEmail(user.getEmail()) != null) throw new RuntimeException("Record already exists");

        UserEntity userEntity = new UserEntity();
        BeanUtils.copyProperties(user, userEntity);

        String publicUserId = utils.generateUserId(30);
        userEntity.setEncryptedPassword("test");
        userEntity.setUserId(publicUserId);

        UserEntity savedUserEntity = userRepository.save(userEntity);

        UserDto returnValue = new UserDto();
        BeanUtils.copyProperties(savedUserEntity, returnValue);

        return returnValue;
    }
}

Repository

@Repository
public interface UserRepository extends CrudRepository<UserEntity, Long> {
    UserEntity findByEmail(String email);
}
⚠️ **GitHub.com Fallback** ⚠️