using System.Text; namespace IOL.BookmarkThing.Server.Api.Internal.Account; public class CreateTokenRoute : RouteBaseInternalSync.WithRequest.WithActionResult { private readonly AppDbContext _context; private readonly IConfiguration _configuration; private readonly ILogger _logger; public CreateTokenRoute(AppDbContext context, IConfiguration configuration, ILogger logger) { _context = context; _configuration = configuration; _logger = logger; } [ApiVersionNeutral] [ApiExplorerSettings(IgnoreApi = true)] [HttpPost("~/v{version:apiVersion}/account/create-token")] public override ActionResult Handle(CreateTokenRequest request) { var user = _context.Users.SingleOrDefault(c => c.Id == LoggedInUser.Id); if (user == default) { return NotFound(new ErrorResult("User does not exist")); } var token_entropy = _configuration.GetValue("TOKEN_ENTROPY"); if (token_entropy.IsNullOrWhiteSpace()) { _logger.LogWarning("No token entropy is available in env:TOKEN_ENTROPY, Basic auth is disabled"); return NotFound(); } var access_token = new AccessToken { Id = Guid.NewGuid(), User = user, ExpiryDate = request.ExpiryDate.ToUniversalTime(), AllowCreate = request.AllowCreate, AllowRead = request.AllowRead, AllowDelete = request.AllowDelete, AllowUpdate = request.AllowUpdate }; _context.AccessTokens.Add(access_token); _context.SaveChanges(); return Ok(Convert.ToBase64String(Encoding.UTF8.GetBytes(access_token.Id.ToString().EncryptWithAes(token_entropy)))); } }