/** GET /account -> get the current user. */
 @RequestMapping(
     value = "/account",
     method = RequestMethod.GET,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<UserDTO> getAccount() {
   return Optional.ofNullable(userService.getUserWithAuthorities())
       .map(
           user -> {
             return new ResponseEntity<>(
                 new UserDTO(
                     user.getLogin(),
                     null,
                     user.getFirstName(),
                     user.getLastName(),
                     user.getEmail(),
                     user.getLangKey(),
                     user.getAuthorities()
                         .stream()
                         .map(Authority::getName)
                         .collect(Collectors.toList())),
                 HttpStatus.OK);
           })
       .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 }
  @Test
  public void testGetExistingAccount() throws Exception {
    Set<Authority> authorities = new HashSet<>();
    Authority authority = new Authority();
    authority.setName(AuthoritiesConstants.ADMIN);
    authorities.add(authority);

    User user = new User();
    user.setLogin("test");
    user.setFirstName("john");
    user.setLastName("doe");
    user.setEmail("*****@*****.**");
    user.setAuthorities(authorities);
    when(mockUserService.getUserWithAuthorities()).thenReturn(user);

    restUserMockMvc
        .perform(get("/api/account").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isOk())
        .andExpect(content().contentType(MediaType.APPLICATION_JSON))
        .andExpect(jsonPath("$.login").value("test"))
        .andExpect(jsonPath("$.firstName").value("john"))
        .andExpect(jsonPath("$.lastName").value("doe"))
        .andExpect(jsonPath("$.email").value("*****@*****.**"))
        .andExpect(jsonPath("$.authorities").value(AuthoritiesConstants.ADMIN));
  }
 /** POST /account -> update the current user information. */
 @RequestMapping(
     value = "/account",
     method = RequestMethod.POST,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<String> saveAccount(@RequestBody UserDTO userDTO) {
   Optional<User> existingUser = userRepository.findOneByEmail(userDTO.getEmail());
   if (existingUser.isPresent()
       && (!existingUser.get().getLogin().equalsIgnoreCase(userDTO.getLogin()))) {
     return ResponseEntity.badRequest()
         .headers(
             HeaderUtil.createFailureAlert(
                 "user-management", "emailexists", "Email already in use"))
         .body(null);
   }
   return userRepository
       .findOneByLogin(SecurityUtils.getCurrentUser().getUsername())
       .map(
           u -> {
             userService.updateUserInformation(
                 userDTO.getFirstName(),
                 userDTO.getLastName(),
                 userDTO.getEmail(),
                 userDTO.getLangKey());
             return new ResponseEntity<String>(HttpStatus.OK);
           })
       .orElseGet(() -> new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 }
  @Test
  public void testGetUnknownAccount() throws Exception {
    when(mockUserService.getUserWithAuthorities()).thenReturn(null);

    restUserMockMvc
        .perform(get("/api/account").accept(MediaType.APPLICATION_JSON))
        .andExpect(status().isInternalServerError());
  }
 /** GET /activate -> activate the registered user. */
 @RequestMapping(
     value = "/activate",
     method = RequestMethod.GET,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<String> activateAccount(@RequestParam(value = "key") String key) {
   return Optional.ofNullable(userService.activateRegistration(key))
       .map(user -> new ResponseEntity<String>(HttpStatus.OK))
       .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 }
 /** POST /change_password -> changes the current user's password */
 @RequestMapping(
     value = "/account/change_password",
     method = RequestMethod.POST,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<?> changePassword(@RequestBody String password) {
   if (!checkPasswordLength(password)) {
     return new ResponseEntity<>("Incorrect password", HttpStatus.BAD_REQUEST);
   }
   userService.changePassword(password);
   return new ResponseEntity<>(HttpStatus.OK);
 }
 @RequestMapping(
     value = "/account/reset_password/finish",
     method = RequestMethod.POST,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<String> finishPasswordReset(@RequestBody KeyAndPasswordDTO keyAndPassword) {
   if (!checkPasswordLength(keyAndPassword.getNewPassword())) {
     return new ResponseEntity<>("Incorrect password", HttpStatus.BAD_REQUEST);
   }
   return userService
       .completePasswordReset(keyAndPassword.getNewPassword(), keyAndPassword.getKey())
       .map(user -> new ResponseEntity<String>(HttpStatus.OK))
       .orElse(new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 }
  /** POST /register -> register the user. */
  @RequestMapping(
      value = "/register",
      method = RequestMethod.POST,
      produces = MediaType.TEXT_PLAIN_VALUE)
  @Timed
  public ResponseEntity<?> registerAccount(
      @Valid @RequestBody UserDTO userDTO, HttpServletRequest request) {
    return userRepository
        .findOneByLogin(userDTO.getLogin())
        .map(user -> new ResponseEntity<>("login already in use", HttpStatus.BAD_REQUEST))
        .orElseGet(
            () ->
                userRepository
                    .findOneByEmail(userDTO.getEmail())
                    .map(
                        user ->
                            new ResponseEntity<>(
                                "e-mail address already in use", HttpStatus.BAD_REQUEST))
                    .orElseGet(
                        () -> {
                          User user =
                              userService.createUserInformation(
                                  userDTO.getLogin(),
                                  userDTO.getPassword(),
                                  userDTO.getFirstName(),
                                  userDTO.getLastName(),
                                  userDTO.getEmail().toLowerCase(),
                                  userDTO.getLangKey());
                          String baseUrl =
                              request.getScheme()
                                  + // "http"
                                  "://"
                                  + // "://"
                                  request.getServerName()
                                  + // "myhost"
                                  ":"
                                  + // ":"
                                  request.getServerPort()
                                  + // "80"
                                  request
                                      .getContextPath(); // "/myContextPath" or "" if deployed in
                                                         // root context

                          mailService.sendActivationEmail(user, baseUrl);
                          return new ResponseEntity<>(HttpStatus.CREATED);
                        }));
  }
 /** POST /account -> update the current user information. */
 @RequestMapping(
     value = "/account",
     method = RequestMethod.POST,
     produces = MediaType.APPLICATION_JSON_VALUE)
 @Timed
 public ResponseEntity<String> saveAccount(@RequestBody UserDTO userDTO) {
   return userRepository
       .findOneByLogin(userDTO.getLogin())
       .filter(u -> u.getLogin().equals(SecurityUtils.getCurrentLogin()))
       .map(
           u -> {
             userService.updateUserInformation(
                 userDTO.getFirstName(),
                 userDTO.getLastName(),
                 userDTO.getEmail(),
                 userDTO.getLangKey());
             return new ResponseEntity<String>(HttpStatus.OK);
           })
       .orElseGet(() -> new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR));
 }
  @RequestMapping(
      value = "/account/reset_password/init",
      method = RequestMethod.POST,
      produces = MediaType.TEXT_PLAIN_VALUE)
  @Timed
  public ResponseEntity<?> requestPasswordReset(
      @RequestBody String mail, HttpServletRequest request) {

    return userService
        .requestPasswordReset(mail)
        .map(
            user -> {
              String baseUrl =
                  request.getScheme()
                      + "://"
                      + request.getServerName()
                      + ":"
                      + request.getServerPort();
              mailService.sendPasswordResetMail(user, baseUrl);
              return new ResponseEntity<>("e-mail was sent", HttpStatus.OK);
            })
        .orElse(new ResponseEntity<>("e-mail address not registered", HttpStatus.BAD_REQUEST));
  }