/// <inheritdoc cref="IPlayerService.LoginAsync"/> public async Task <string> LoginAsync(string username, string password) { if (username is null) { throw new ArgumentNullException(nameof(username)); } if (password is null) { throw new ArgumentNullException(nameof(password)); } if (string.IsNullOrWhiteSpace(username)) { throw new ArgumentException(nameof(username)); } if (string.IsNullOrWhiteSpace(password)) { throw new ArgumentException(nameof(password)); } Player player = await _dbContext.Players.FirstOrDefaultAsync(p => p.Username == username); if (player is null) { throw new PlayerNotFoundException(); } if (!BCrypt.Net.BCrypt.Verify(password, player.HashedPassword)) { throw new WrongPasswordException(); } var token = Guid.NewGuid().ToString(); player.SessionToken = token; _dbContext.Update(player); await _dbContext.SaveChangesAsync(); return(token); }