public async Task <IActionResult> GetAvailableGames([FromQuery] int page = 1, [FromQuery] int pageSize = 10, CancellationToken cancellationToken = default) { var request = new GetAvailableGamesRequest { Page = page, PageSize = pageSize, UserId = User.GetUserId() }; var serviceResult = await getAvailableGamesRequestHandler.HandleAsync(request, cancellationToken).ConfigureAwait(false); var apiResponse = GetAvailableGamesMapper.ToApiResponse(serviceResult); return(Ok(apiResponse)); }
public async Task <GetAvailableGamesResult> HandleAsync(GetAvailableGamesRequest request, CancellationToken cancellationToken) { // TODO: Create a validator for the parameters using (var session = _documentStore.OpenAsyncSession()) { var results = await session .Query <GameModel.Game>() .Statistics(out var statistics) .Where(g => g.InvitedPlayerId == null && g.Status == GameStatus.NotStarted && g.Player2.PlayerId == null && g.Player1.PlayerId != request.UserId) .Paginate(request.Page, request.PageSize) .Select(g => new { g.Id, Player1Id = g.Player1.PlayerId, Player1DisplayName = g.Player1.DisplayName, g.Rows, g.Columns, g.Mines }) .ToListAsync(cancellationToken) .ConfigureAwait(false); var transformedResults = results .Select(r => new AvailableGame { GameId = _documentStore.TrimCollectionPrefixFromDocumentId <GameModel.Game>(r.Id), HostPlayerId = r.Player1Id, HostPlayerDisplayName = r.Player1DisplayName, Rows = r.Rows, Columns = r.Columns, Mines = r.Mines }) .ToList(); return(new GetAvailableGamesResult { AvailableGames = transformedResults, Total = statistics.TotalResults }); } }