public async Task <FullGameStateOutVM> CreateGame(string[] playerList, int cardLimit) { if (cardLimit < 1) { throw new BadRequestException("Cannot create game without in-hand cards"); } using var transaction = await _transactionManager.BeginTransactionAsync(); var randomInstance = _randomGenerator.CreateRandom(); await _gameManagementService.CloseExistingGames(playerList); var cards = _deckService.CreateCards(); var cardQueue = new Queue <Card>(cards); var empty = _cardSerializer.SerializeCards(new Card[0]); var game = new Game { GameStartedAt = DateTimeOffset.UtcNow, CardLimit = cardLimit, Discarded = empty, }; var players = (await _context .Players .Where(p => playerList.Contains(p.Username)) .ToListAsync()) .Select(player => new { Player = player, Cards = cardQueue.Dequeue(cardLimit) }) .ToList(); if (players.Count != playerList.Length) { throw new ArgumentOutOfRangeException("Not all players exist"); } var state = players.Select(e => new GamePlayerState { Game = game, Player = e.Player, Hand = _cardSerializer.SerializeCards(e.Cards), Table = _mapper.SerializeQueues(new List <List <Card> > { new List <Card>(), new List <Card>() }), }).ToList(); var remaining = cardQueue.ToList(); game.State = state; game.Deck = _cardSerializer.SerializeCards(remaining); game.NextPlayer = players[randomInstance.Next(players.Count)].Player; await _context.AddAsync(game); await _context.SaveChangesAsync(); var output = _mapper.MapFullGameState(game); await transaction.CommitAsync(); return(output); }