content: /**
   * Copyright (c) 2018-2028, Chill Zhuang 庄骞 (smallchill@163.com).
   * <p>
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
   * <p>
   * http://www.apache.org/licenses/LICENSE-2.0
   * <p>
   * Unless required by applicable law or agreed to in writing, software
   * distributed under the License is distributed on an "AS IS" BASIS,
   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   * See the License for the specific language governing permissions and
   * limitations under the License.
   */
  package org.springblade.modules.auth.controller;
  
  import com.wf.captcha.SpecCaptcha;
  import io.swagger.annotations.Api;
  import io.swagger.annotations.ApiOperation;
  import io.swagger.annotations.ApiParam;
  import lombok.AllArgsConstructor;
  import org.springblade.common.cache.CacheNames;
  import org.springblade.core.secure.AuthInfo;
  import org.springblade.core.tool.api.R;
  import org.springblade.core.tool.support.Kv;
  import org.springblade.core.tool.utils.Func;
  import org.springblade.core.tool.utils.RedisUtil;
  import org.springblade.core.tool.utils.WebUtil;
  import org.springblade.modules.auth.granter.TokenGranterBuilder;
  import org.springblade.modules.auth.granter.TokenParameter;
  import org.springblade.modules.auth.utils.TokenUtil;
  import org.springblade.modules.system.entity.UserInfo;
  import org.springframework.web.bind.annotation.*;
  import org.springblade.modules.auth.granter.ITokenGranter;
  import javax.servlet.http.HttpServletRequest;
  import java.util.UUID;
  import java.util.concurrent.TimeUnit;
  
  /**
   * 认证模块
   *
   * @author Chill
   */
  @RestController
  @AllArgsConstructor
  @RequestMapping("blade-auth")
  @Api(value = "用户授权认证", tags = "授权接口")
  public class AuthController {
  
  	private RedisUtil redisUtil;
  
  	@PostMapping("token")
  	@ApiOperation(value = "获取认证token", notes = "传入租户ID:tenantId,账号:account,密码:password")
  
  	public R<AuthInfo> token(@ApiParam(value = "授权类型", required = true) @RequestParam(defaultValue = "password", required = false) String grantType,
  							 @ApiParam(value = "刷新令牌") @RequestParam(required = false) String refreshToken,
  							 @ApiParam(value = "租户ID", required = true) @RequestParam(defaultValue = "000000", required = false) String tenantId,
  							 @ApiParam(value = "账号") @RequestParam(required = false) String account,
  							 @ApiParam(value = "密码") @RequestParam(required = false) String password,
  							 @ApiParam(value = "微信Code") @RequestParam(required = false) String wxCode,
  							 @ApiParam(value = "微信名") @RequestParam(required = false) String wxName,
  							 @ApiParam(value = "微信头像") @RequestParam(required = false) String wxAvatar,
  							 @ApiParam(value = "邀请码") @RequestParam(required = false) String invite_code,
  							 @ApiParam(value = "登录类型") @RequestParam(required = false) String login_type,
  							 @ApiParam(value = "手机号") @RequestParam(required = false) String phone,
  							 @ApiParam(value = "手机Code") @RequestParam(required = false) String phoneCode,
  							 @ApiParam(value = "uuid") @RequestParam(required = false) String uuid,
  							 HttpServletRequest request
  	) {
  		//wxCode wxName wxAvatar invite_code login_type phone phoneCode password,uuid
  		String userType = Func.toStr(WebUtil.getRequest().getHeader(TokenUtil.USER_TYPE_HEADER_KEY), TokenUtil.DEFAULT_USER_TYPE);
  
  		TokenParameter tokenParameter = new TokenParameter();
  		tokenParameter.getArgs().set("tenantId", tenantId)
  			.set("account", account)
  			.set("password", password)
  			.set("grantType", grantType)
  			.set("refreshToken", refreshToken)
  			.set("userType", userType)
  			.set("wxCode", wxCode)
  			.set("wxName", wxName)
  			.set("wxAvatar", wxAvatar)
  			.set("invite_code", invite_code)
  			.set("login_type", login_type)
  			.set("phone", phone)
  			.set("phoneCode", phoneCode)
  			.set("uuid", uuid);
  		ITokenGranter granter = TokenGranterBuilder.getGranter(grantType);
  
  		UserInfo userInfo = granter.grant(tokenParameter);
  		if (userInfo == null || userInfo.getUser() == null || userInfo.getUser().getId() == null) {
  			return R.fail(TokenUtil.USER_NOT_FOUND);
  		}
  		return R.data(TokenUtil.createAuthInfo(userInfo));
  	}
  
  	@GetMapping("/captcha")
  	@ApiOperation(value = "获取验证码")
  	public R<Kv> captcha() {
  		SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
  		String verCode = specCaptcha.text().toLowerCase();
  		String key = UUID.randomUUID().toString();
  		// 存入redis并设置过期时间为30分钟
  		redisUtil.set(CacheNames.CAPTCHA_KEY + key, verCode, 30L, TimeUnit.MINUTES);
  		// 将key和base64返回给前端
  		return R.data(Kv.init().set("key", key).set("image", specCaptcha.toBase64()));
  	}
  
  
  	@GetMapping("/oauth/logout")
  	@ApiOperation(value = "旧版退出接口", notes = "旧版退出接口")
  	public Kv logout() {
  
  		return Kv.create().set("success", "true").set("msg", "success");
  	}
  
  }
  