/** GET /account -> get the current user. */
  @RequestMapping(
      value = "/account",
      method = RequestMethod.GET,
      produces = MediaType.APPLICATION_JSON_VALUE)
  @Timed
  public ResponseEntity<UserDTO> getAccount() {
    User user = userService.getUserWithAuthorities();
    if (user == null) {
      return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
    }
    List<String> roles = new ArrayList<>();
    for (Authority authority : user.getAuthorities()) {
      roles.add(authority.getName());
    }

    Set<ExternalAccount> externalAccounts = new HashSet<>();

    for (ExternalAccount eAccount : user.getExternalAccounts()) {
      externalAccounts.add(eAccount);
    }

    return new ResponseEntity<>(
        new UserDTO(
            user.getLogin(),
            null,
            user.getFirstName(),
            user.getLastName(),
            user.getEmail(),
            user.getLangKey(),
            roles,
            externalAccounts),
        HttpStatus.OK);
  }
 /** 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) {
   User user = userService.activateRegistration(key);
   if (user == null) {
     return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
   }
   return new ResponseEntity<String>(HttpStatus.OK);
 }
 /** 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 (StringUtils.isEmpty(password)) {
     return new ResponseEntity<>(HttpStatus.FORBIDDEN);
   }
   userService.changePassword(password);
   return new ResponseEntity<>(HttpStatus.OK);
 }
 /** 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) {
   User userHavingThisLogin = userRepository.findOneByLogin(userDTO.getLogin());
   if (userHavingThisLogin != null
       && !userHavingThisLogin.getLogin().equals(SecurityUtils.getCurrentLogin())) {
     return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
   }
   // Do not update Information of external accounts, because that information is stored there
   if (userHavingThisLogin.getExternalAccounts().size() > 0) {
     return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
   }
   userService.updateUserInformation(
       userDTO.getFirstName(), userDTO.getLastName(), userDTO.getEmail());
   return new ResponseEntity<>(HttpStatus.OK);
 }
  /** 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) {
    User user = userRepository.findOneByLogin(userDTO.getLogin());
    if (user != null) {
      return ResponseEntity.badRequest()
          .contentType(MediaType.TEXT_PLAIN)
          .body("login already in use");
    } else {
      if (userRepository.findOneByEmail(userDTO.getEmail()) != null) {
        return ResponseEntity.badRequest()
            .contentType(MediaType.TEXT_PLAIN)
            .body("e-mail address already in use");
      }
      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"

      mailService.sendActivationEmail(user, baseUrl);
      return new ResponseEntity<>(HttpStatus.CREATED);
    }
  }