diff --git a/Expedience.Api/Controllers/ExpedienceController.cs b/Expedience.Api/Controllers/ExpedienceController.cs index 228ee86..2806d78 100644 --- a/Expedience.Api/Controllers/ExpedienceController.cs +++ b/Expedience.Api/Controllers/ExpedienceController.cs @@ -58,64 +58,55 @@ namespace Expedience.Api.Controllers [HttpGet("UserName/{worldId}/{userHash}")] public async Task GetUserName(int worldId, string userHash, CancellationToken cancellationToken) { - try - { - using var scope = _serviceScopeFactory.CreateScope(); - using var dbContext = scope.ServiceProvider.GetRequiredService(); + using var scope = _serviceScopeFactory.CreateScope(); + using var dbContext = scope.ServiceProvider.GetRequiredService(); - var lockKey = $"{worldId}-{userHash}"; - if (_distributedLock.AcquireLock(lockKey, TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(4))) + var lockKey = $"{worldId}-{userHash}"; + if (_distributedLock.AcquireLock(lockKey, TimeSpan.FromSeconds(10), TimeSpan.FromMinutes(4))) + { + try { - try + var user = dbContext.Users.FirstOrDefault(x => x.UserHash == userHash && x.WorldId == worldId); + if (user == null) { - var user = dbContext.Users.FirstOrDefault(x => x.UserHash == userHash && x.WorldId == worldId); - if (user == null) + string userName; + var isDuplicate = false; + do { - string userName; - var isDuplicate = false; - do - { - userName = UserNameGenerator.Generate(); - isDuplicate = dbContext.Users.Any(x => x.WorldId == worldId && x.UserName == userName); - await Task.Delay(20, cancellationToken); // Don't hog the CPU - } - while (isDuplicate == false); - - user = new User - { - UserHash = userHash, - WorldId = worldId, - UserName = userName, - CreatedAt = DateTime.UtcNow, - }; - - dbContext.Users.Add(user); - await dbContext.SaveChangesAsync(cancellationToken); + userName = UserNameGenerator.Generate(); + isDuplicate = dbContext.Users.Any(x => x.WorldId == worldId && x.UserName == userName); + await Task.Delay(20, cancellationToken); // Don't hog the CPU } + while (isDuplicate == true); - return Ok(user.UserName); + user = new User + { + UserHash = userHash, + WorldId = worldId, + UserName = userName, + CreatedAt = DateTime.UtcNow, + }; + dbContext.Users.Add(user); + await dbContext.SaveChangesAsync(cancellationToken); } - catch (Exception ex) - { - _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", ex.Message); - } - finally - { - _distributedLock.ReleaseLock(lockKey); - } + + return Ok(user.UserName); + } - else + catch (Exception ex) { - _logger.LogError("Could not acquire lock for {lockKey}", lockKey); + _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", ex.Message); + } + finally + { + _distributedLock.ReleaseLock(lockKey); } } - catch (Exception ex) + else { - _logger.LogError(ex, "Error in GetUserName: {errorMessage}", ex.Message); + _logger.LogError("Could not acquire lock for {lockKey}", lockKey); } - - return StatusCode(500); } } }