Пример #1
0
    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);
    }