public async Task <ActionResult <Users> > RegisterUser(LoginInput input) { try { if (!_context.Users.Any(x => x.Username == input.username)) { DataSyncManager dataSyncManager = new DataSyncManager(_syncDbConnectionString); byte[] salt = new byte[128 / 8]; using (var rng = RandomNumberGenerator.Create()) { rng.GetBytes(salt); } Users newUser = new Users() { Username = input.username, Password = PasswordHashHelper.GetHash(input.password, salt), Salt = salt, EnvironmentId = RDSEnums.EnvironmentId.ProductionPrimary }; _context.Users.Add(newUser); await _context.SaveChangesAsync(); Users createdUser = await _context.Users.FirstOrDefaultAsync(x => x.Username == input.username); Tokens newToken = new Tokens() { UserID = createdUser.Id, Token = TokenHelper.GenerateToken(input.username, TokenHelper.TokenType.Standard), EnvironmentId = RDSEnums.EnvironmentId.ProductionPrimary }; Accounts newAccount = new Accounts() { UserID = createdUser.Id, Balance = 1000000.99, EnvironmentId = RDSEnums.EnvironmentId.ProductionPrimary }; _context.Tokens.Add(newToken); _context.Accounts.Add(newAccount); await _context.SaveChangesAsync(); if (_dataSyncEnabled) { Users replicatedUser = new Users() { Username = newUser.Username, Password = newUser.Password, Salt = newUser.Salt, EnvironmentId = RDSEnums.EnvironmentId.ProductionSecondary }; await dataSyncManager.SyncNewUser(replicatedUser, newToken.Token); } StatusOutput output = new StatusOutput() { message = StatusMessages.UserCreatedMessage }; return(Ok(output)); } else { StatusOutput output = new StatusOutput() { message = StatusMessages.UserExistsMessage }; return(Ok(output)); } } catch (Exception e) { Log.Fatal(e, $"{nameof(RegisterUser)}"); return(StatusCode(500)); } }