using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using System; using System.Threading.Tasks; using Timeline.Models.Http; using Timeline.Services; using Timeline.Services.Mapper; using Timeline.Services.Token; using Timeline.Services.User; namespace Timeline.Controllers { /// /// Operation about tokens. /// [Route("token")] [ApiController] [ProducesErrorResponseType(typeof(CommonResponse))] public class TokenController : Controller { private readonly IUserTokenManager _userTokenManager; private readonly IGenericMapper _mapper; private readonly IClock _clock; public TokenController(IUserTokenManager userTokenManager, IGenericMapper mapper, IClock clock) { _userTokenManager = userTokenManager; _mapper = mapper; _clock = clock; } /// /// Create a new token for a user. /// /// Result of token creation. [HttpPost("create")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> Create([FromBody] HttpCreateTokenRequest request) { try { DateTime? expireTime = null; if (request.Expire is not null) expireTime = _clock.GetCurrentTime().AddDays(request.Expire.Value); var result = await _userTokenManager.CreateTokenAsync(request.Username, request.Password, expireTime); return new HttpCreateTokenResponse { Token = result.Token, User = await _mapper.MapAsync(result.User, Url, User) }; } catch (EntityNotExistException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.CreateBadCredential, Resource.MessageTokenCreateBadCredential); } catch (BadPasswordException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.CreateBadCredential, Resource.MessageTokenCreateBadCredential); } } /// /// Verify a token. /// /// Result of token verification. [HttpPost("verify")] [AllowAnonymous] [ProducesResponseType(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status400BadRequest)] public async Task> Verify([FromBody] HttpVerifyTokenRequest request) { try { var result = await _userTokenManager.VerifyTokenAsync(request.Token); return new HttpVerifyTokenResponse { User = await _mapper.MapAsync(result, Url, User) }; } catch (UserTokenTimeExpiredException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.VerifyTimeExpired, Resource.MessageTokenVerifyTimeExpired); } catch (UserTokenVersionExpiredException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.VerifyOldVersion, Resource.MessageTokenVerifyOldVersion); } catch (UserTokenBadFormatException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.VerifyBadFormat, Resource.MessageTokenVerifyBadFormat); } catch (UserTokenUserNotExistException) { return this.BadRequestWithCommonResponse(ErrorCodes.TokenController.VerifyUserNotExist, Resource.MessageTokenVerifyUserNotExist); } } } }