@Data
public class UserDetailsRequest {
private String firstName;
private String lastName;
private String email;
private String password;
}
@Data
public class UserResponse {
private String userId;
private String firstName;
private String lastName;
private String email;
}
@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>();
}
@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;
}
@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;
}
}
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
public interface UserRepository extends CrudRepository<UserEntity, Long> {
UserEntity findByEmail(String email);
}