async Task IGamePlayService.MakeMoveAsync(MoveModel move, CancellationToken cancellationToken) { var game = await ValidateMoveInternalAsync(move, cancellationToken : cancellationToken); var turns = await _turnRepository.GetTurnsByGameIdAsync(game.Id, cancellationToken : cancellationToken); var currentTurn = turns .Where(x => !x.EndTime.HasValue) .OrderByDescending(x => x.StartTime) .FirstOrDefault(); var turnUpdate = new TurnUpdateData { EndTime = DateTime.UtcNow, }; await _turnRepository.UpdateTurnAsync(currentTurn.Id, turnUpdate, cancellationToken : cancellationToken); var currentMove = new MoveData { GameDeckCardCollectionId = move.GameDeckCardCollectionId, Column = move.Column, Row = move.Row, TurnId = currentTurn.Id, }; await _moveRepository.AddMoveAsync(currentMove, cancellationToken : cancellationToken); var nextUserId = game.UserIds .SkipWhile(x => x != move.UserId) .Skip(1) .FirstOrDefault(); if (nextUserId == default) { nextUserId = game.UserIds.First(); } var newTurn = new TurnData { CurrentUserId = nextUserId, GameId = game.Id, StartTime = DateTime.UtcNow, }; await _turnRepository.AddTurnAsync(newTurn, cancellationToken : cancellationToken); var gameUpdate = new GameUpdateData { CurrentUserId = nextUserId, }; await _gameRepository.UpdateGameAsync(game.Id, gameUpdate, cancellationToken : cancellationToken); }