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.