diff --git a/Expedience.Api/Controllers/ExpedienceController.cs b/Expedience.Api/Controllers/ExpedienceController.cs index 5dc285a..228ee86 100644 --- a/Expedience.Api/Controllers/ExpedienceController.cs +++ b/Expedience.Api/Controllers/ExpedienceController.cs @@ -58,54 +58,61 @@ namespace Expedience.Api.Controllers [HttpGet("UserName/{worldId}/{userHash}")] public async Task GetUserName(int worldId, string userHash, CancellationToken cancellationToken) { - 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))) + try { - try + 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 user = dbContext.Users.FirstOrDefault(x => x.UserHash == userHash && x.WorldId == worldId); - if (user == null) + try { - string userName; - var isDuplicate = false; - do + var user = dbContext.Users.FirstOrDefault(x => x.UserHash == userHash && x.WorldId == worldId); + if (user == null) { - 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); + 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, - }; + user = new User + { + UserHash = userHash, + WorldId = worldId, + UserName = userName, + CreatedAt = DateTime.UtcNow, + }; - dbContext.Users.Add(user); - await dbContext.SaveChangesAsync(cancellationToken); - } + dbContext.Users.Add(user); + await dbContext.SaveChangesAsync(cancellationToken); + } - return Ok(user.UserName); + return Ok(user.UserName); + } + catch (Exception ex) + { + _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", ex.Message); + } + finally + { + _distributedLock.ReleaseLock(lockKey); + } } - catch (Exception ex) - { - _logger.LogError(ex, "Error obtaining user name for World Id {worldId} and hash {userHash}: {errorMessage}", ex.Message); - } - finally + else { - _distributedLock.ReleaseLock(lockKey); + _logger.LogError("Could not acquire lock for {lockKey}", lockKey); } } - else + catch (Exception ex) { - _logger.LogError("Could not acquire lock for {lockKey}", lockKey); + _logger.LogError(ex, "Error in GetUserName: {errorMessage}", ex.Message); } return StatusCode(500);