diff --git a/src/Nullinside.Api/Controllers/UserController.cs b/src/Nullinside.Api/Controllers/UserController.cs index e6cf1c7..c7fd591 100644 --- a/src/Nullinside.Api/Controllers/UserController.cs +++ b/src/Nullinside.Api/Controllers/UserController.cs @@ -93,6 +93,29 @@ public UserController(IConfiguration configuration, INullinsideContext dbContext return Redirect($"{siteUrl}/user/login?error=1"); } } + + /// + /// Called to generate a new oauth token using the refresh token we previously provided. + /// + /// The refresh token we provided. + /// The cancellation token. + /// A redirect to the nullinside website. + [AllowAnonymous] + [HttpPost] + [Route("token/refresh")] + public async Task Refresh(AuthToken token, CancellationToken cancellationToken = new()) { + var user = await _dbContext.Users.FirstOrDefaultAsync(u => u.RefreshToken == token.Token, cancellationToken).ConfigureAwait(false); + if (null == user?.Email) { + return Unauthorized(); + } + + var bearerToken = await UserHelpers.GenerateTokenAndSaveToDatabase(_dbContext, user.Email, Constants.OAUTH_TOKEN_TIME_LIMIT, cancellationToken: cancellationToken).ConfigureAwait(false); + if (null == bearerToken) { + return StatusCode(500); + } + + return Ok(bearerToken); + } /// /// Converts the credential string we get from google to a representation we read information from.