public async Task <IActionResult> ExecuteAsync(PageOptionsCursor pageOptions, CancellationToken cancellationToken) { DateTimeOffset?createdAfter = Cursor.FromCursor <DateTimeOffset?>(pageOptions.Before); DateTimeOffset?createdBefore = Cursor.FromCursor <DateTimeOffset?>(pageOptions.After); ICommandResult <PaginatedResult <Car> > result = await _mediator .Send(new GetCarPageCommand(pageOptions.First, pageOptions.Last, createdAfter, createdBefore), cancellationToken); switch (result.Status) { case CommandStatus.Unknown: default: throw new ArgumentOutOfRangeException(nameof(result.Status), result.Status, null); case CommandStatus.NotFound: return(new NotFoundResult()); case CommandStatus.Ok: PaginatedResult <Car> paginatedResult = result.Data; List <CarVm> carViewModels = _carMapper.MapList(paginatedResult.Items); (string startCursor, string endCursor) = Cursor.GetFirstAndLastCursor(paginatedResult.Items, x => x.Created); PaginatedResultVm <CarVm> paginatedResultVm = _paginatedResultFactory .GetCursorPaginatedResult(pageOptions, paginatedResult.HasNextPage, paginatedResult.HasPreviousPage, paginatedResult.TotalCount, startCursor, endCursor, RouteNames.GetCarPage, carViewModels); _actionCtx.ActionContext.HttpContext .Response.Headers.Add(CustomHeaderNames.Link, paginatedResultVm.PageInfo.ToLinkHttpHeaderValue()); return(new OkObjectResult(paginatedResultVm)); } }
public PaginatedResultVm <T> GetCursorPaginatedResult <T>(PageOptionsCursor pageOptions, bool hasNextPage, bool hasPreviousPage, int totalCount, string startCursor, string endCursor, string routeName, ICollection <T> items) where T : class { ArgumentNullException.ThrowIfNull(pageOptions); if (string.IsNullOrEmpty(routeName)) { throw new ArgumentNullException(nameof(routeName)); } ICollection <T> resultItems = items ?? new List <T>(); Tuple <ExpandoObject, ExpandoObject> baseQueryParams = GetCursorUniqueQueryParams(pageOptions); PageInfoVm pageInfo = new PageInfoVm() { Count = items.Count, HasNextPage = hasNextPage, HasPreviousPage = hasPreviousPage, NextPageUrl = hasNextPage ? GetCursorNextPageUri(routeName, baseQueryParams, pageOptions, endCursor) : null, PreviousPageUrl = hasPreviousPage ? GetCursorPreviousPageUri(routeName, baseQueryParams, pageOptions, startCursor) : null, FirstPageUrl = GetCursorFirstPageUri(routeName, baseQueryParams, pageOptions), LastPageUrl = GetCursorLastPageUri(routeName, baseQueryParams, pageOptions), }; PaginatedResultVm <T> result = new PaginatedResultVm <T>(totalCount, pageInfo, resultItems); return(result); }