using AutoMapper; using IM_API.Dtos; using IM_API.Dtos.Auth; using IM_API.Dtos.User; using IM_API.Interface.Services; using IM_API.Tools; using IM_API.VOs.Auth; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http.HttpResults; using Microsoft.AspNetCore.Mvc; using System.Diagnostics; namespace IM_API.Controllers { [Route("api/[controller]/[action]")] [ApiController] public class AuthController : ControllerBase { private readonly ILogger _logger; private readonly IAuthService _authService; private readonly IUserService _userService; private readonly IJWTService _jwtService; private readonly IRefreshTokenService _refreshTokenService; private readonly IConfiguration _configuration; private IMapper _mapper; public AuthController(ILogger logger, IAuthService authService, IJWTService jwtService, IRefreshTokenService refreshTokenService, IConfiguration configuration,IUserService userService, IMapper mapper ) { _logger = logger; _authService = authService; _jwtService = jwtService; _refreshTokenService = refreshTokenService; _configuration = configuration; _userService = userService; _mapper = mapper; } [HttpPost] public async Task Login(LoginRequestDto dto) { Stopwatch sw = Stopwatch.StartNew(); var user = await _authService.LoginAsync(dto); _logger.LogInformation("服务耗时: {ms}ms", sw.ElapsedMilliseconds); var userInfo = _mapper.Map(user); _logger.LogInformation("序列化耗时: {ms}ms", sw.ElapsedMilliseconds); //生成凭证 (string token,DateTime expiresAt) = _jwtService.CreateAccessTokenForUser(user.Id,user.Username,"user"); _logger.LogInformation("Token生成耗时: {ms}ms", sw.ElapsedMilliseconds); //生成刷新凭证 string refreshToken = await _refreshTokenService.CreateRefreshTokenAsync(user.Id); _logger.LogInformation("RefreshToken生成耗时: {ms}ms", sw.ElapsedMilliseconds); var res = new BaseResponse(new LoginVo(userInfo,token,refreshToken, expiresAt)); _logger.LogInformation("总耗时: {ms}ms", sw.ElapsedMilliseconds); return Ok(res); } [HttpPost] public async Task Register(RegisterRequestDto dto) { var userInfo = await _authService.RegisterAsync(dto); var res = new BaseResponse(userInfo); return Ok(res); } [HttpPost] [ProducesResponseType(typeof(BaseResponse),StatusCodes.Status200OK)] public async Task Refresh(RefreshDto dto) { (bool ok,int userId) = await _refreshTokenService.ValidateRefreshTokenAsync(dto.refreshToken); if (!ok) { var err = new BaseResponse(CodeDefine.AUTH_FAILED); return Unauthorized(err); } var userinfo = await _userService.GetUserInfoAsync(userId); (string token,DateTime expiresAt) = _jwtService.CreateAccessTokenForUser(userinfo.Id,userinfo.Username,"user"); var res = new BaseResponse(new LoginVo(userinfo,token, dto.refreshToken, expiresAt)); return Ok(res); } } }