package org.xmx0632.deliciousfruit.api.v1;
import javax.validation.Valid;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.xmx0632.deliciousfruit.api.v1.bo.ForgetPwdRequest;
import org.xmx0632.deliciousfruit.api.v1.bo.ForgetPwdResponse;
import org.xmx0632.deliciousfruit.api.v1.bo.Result;
import org.xmx0632.deliciousfruit.entity.UserAccount;
import org.xmx0632.deliciousfruit.service.ResetPasswordService;
import org.xmx0632.deliciousfruit.service.ResetPasswordTask;
import org.xmx0632.deliciousfruit.service.UserAccountService;
import org.xmx0632.deliciousfruit.utilities.common.CommonUtil;
/**
* UserAccount的API的Controller.
*
* @author xmx0632
*/
@Controller
@RequestMapping(value = "/api/v1")
public class UserAccountForgetPwdApiController {
private static Logger log = LoggerFactory
.getLogger(UserAccountForgetPwdApiController.class);
@Autowired
private UserAccountService userAccountService;
@Autowired
private ResetPasswordService resetPasswordService;
@RequestMapping(value = "/forgetPwd", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<ForgetPwdResponse> forgetPwd(
@Valid @RequestBody ForgetPwdRequest request) {
// 优先使用手机短信,其次使用发送email重置链接
log.debug("request:{}", request);
String loginName = request.getLoginName();
UserAccount userAccount = userAccountService.findByUsername(loginName);
log.debug("userAccount:{}", userAccount);
ForgetPwdResponse response = new ForgetPwdResponse();
if (userAccount == null) {
log.info("reset password request failed with [username:{} ]",
loginName);
Result result = new Result(Result.FAIL, "unknown username");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response,
HttpStatus.OK);
}
if (CommonUtil.isMobileNO(loginName)) {
// 记录密码重置请求到队列中
log.debug("send reset password message to mobile:{}", loginName);
resetPasswordService.addMobileTask(new ResetPasswordTask(loginName,
""));
log.info("reset password request success with [username:{}]",
loginName);
Result result = new Result(Result.RESET_PASSWORD_BY_MOBILE_SUCCESS,
"check your mobile,reset password please.");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response,
HttpStatus.OK);
}
// 发送email重置密码链接
String email = getEmail(loginName, userAccount);
log.debug("send reset password email for [{}] to [{}]", loginName,
email);
resetPasswordService.addEmailTask(new ResetPasswordTask(loginName,
email));
log.info("reset password request success with [username:{} email:{}]",
loginName, email);
Result result = new Result(Result.RESET_PASSWORD_BY_EMAIL_SUCCESS,
"check your email,reset link will be send as soon as possible");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response, HttpStatus.OK);
}
private String getEmail(String loginName, UserAccount userAccount) {
if (CommonUtil.isEmail(loginName)) {
return loginName;
}
return userAccount.getEmail();
}
/**
* 即将下岗,由{@link #forgetPwd(ForgetPwdRequest)}替代
*
* @param request
* @return
*/
@Deprecated
@RequestMapping(value = "/emailForgetPwd", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<ForgetPwdResponse> forgetPwdByEmail(
@Valid @RequestBody ForgetPwdRequest request) {
log.debug("request:{}", request);
String loginName = request.getLoginName();
UserAccount userAccount = userAccountService.findByUsername(loginName);
log.debug("userAccount:{}", userAccount);
ForgetPwdResponse response = new ForgetPwdResponse();
String email = request.getEmail();
if (userAccount == null || StringUtils.isBlank(email)
|| !email.equalsIgnoreCase(userAccount.getEmail())) {
log.info(
"reset password request failed with [username:{} email:{}]",
loginName, email);
Result result = new Result(Result.FAIL,
"username or email not match");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response,
HttpStatus.OK);
}
// 记录密码重置请求到队列中
resetPasswordService.addEmailTask(new ResetPasswordTask(loginName,
email));
log.info("reset password request success with [username:{} email:{}]",
loginName, email);
Result result = new Result(Result.SUCCESS,
"check your email,reset link will be send as soon as possible");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response, HttpStatus.OK);
}
/**
* 即将下岗,由{@link #forgetPwd(ForgetPwdRequest)}替代
*
* @param request
* @return
*/
@Deprecated
@RequestMapping(value = "/phoneForgetPwd", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseEntity<ForgetPwdResponse> forgetPwdByMobile(
@Valid @RequestBody ForgetPwdRequest request) {
log.debug("request:{}", request);
String loginName = request.getLoginName();
UserAccount userAccount = userAccountService.findByUsername(loginName);
log.debug("userAccount:{}", userAccount);
ForgetPwdResponse response = new ForgetPwdResponse();
if (userAccount == null) {
log.info("reset password request failed with [username:{} ]",
loginName);
Result result = new Result(Result.FAIL, "unknown username");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response,
HttpStatus.OK);
}
// 记录密码重置请求到队列中
resetPasswordService
.addMobileTask(new ResetPasswordTask(loginName, ""));
log.info("reset password request success with [username:{}]", loginName);
Result result = new Result(Result.SUCCESS,
"check your mobile,reset password please.");
response.setResult(result);
log.debug("response:{}", response);
return new ResponseEntity<ForgetPwdResponse>(response, HttpStatus.OK);
}
}