public HttpResponseMessage GetQuery(
            [System.Web.Http.ModelBinding.ModelBinder(typeof(PagedQueryModelBinder))]
            PagedQuery query,
            int id = 0)
        {
            var rootQuery = "";

            if (id > 0)
            {
                rootQuery = $"//*[@id='{id}']";
            }

            var skip = (query.Page - 1) * query.PageSize;
            var take = query.PageSize;

            var result = new IPublishedContent[0];

            try
            {
                result = Umbraco.TypedContentAtXPath(rootQuery + query.Query).ToArray();
            }
            catch (Exception)
            {
                //in case the xpath query fails - do nothing as we will return a empty array instead
            }

            var paged          = result.Skip((int)skip).Take(take);
            var items          = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(paged).ToList();
            var representation = new PublishedContentPagedListRepresentation(items, result.Length, 1, query.Page - 1, query.PageSize, LinkTemplates.PublishedContent.Query, new { query = query.Query, pageSize = query.PageSize });

            return(Request.CreateResponse(HttpStatusCode.OK, representation));
        }
        public HttpResponseMessage Search(
            [System.Web.Http.ModelBinding.ModelBinder(typeof(PagedQueryModelBinder))]
            PagedQuery query)
        {
            if (query.Query.IsNullOrWhiteSpace())
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }

            //TODO: This would be more efficient if we went straight to the ExamineManager and used it's built in Skip method
            // but then we have to write our own model mappers and don't have time for that right now.

            var result = Umbraco.ContentQuery.TypedSearch(SearchProvider.CreateSearchCriteria().RawQuery(query.Query), _searchProvider).ToArray();
            var paged  = result.Skip(ContentControllerHelper.GetSkipSize(query.Page - 1, query.PageSize)).Take(query.PageSize);

            var items          = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(paged).ToList();
            var representation = new PublishedContentPagedListRepresentation(items, result.Length, 1, query.Page - 1, query.PageSize, LinkTemplates.PublishedContent.Search, new { query = query.Query, pageSize = query.PageSize });

            return(Request.CreateResponse(HttpStatusCode.OK, representation));
        }
        public HttpResponseMessage GetChildren(int id,
                                               [System.Web.Http.ModelBinding.ModelBinder(typeof(PagedQueryModelBinder))]
                                               PagedQuery query)
        {
            var content = Umbraco.TypedContent(id);

            if (content == null)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            PcrFactory.Create(content, Request.RequestUri);

            var resolved = (string.IsNullOrEmpty(query.Query)) ? content.Children().ToArray() : content.Children(query.Query.Split(',')).ToArray();
            var total    = resolved.Length;
            var pages    = (total + query.PageSize - 1) / query.PageSize;

            var items  = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(resolved.Skip(ContentControllerHelper.GetSkipSize(query.Page - 1, query.PageSize)).Take(query.PageSize)).ToList();
            var result = new PublishedContentPagedListRepresentation(items, total, pages, query.Page - 1, query.PageSize, LinkTemplates.PublishedContent.PagedChildren, new { id = id });

            return(Request.CreateResponse(HttpStatusCode.OK, result));
        }
        private HttpResponseMessage GetDescendantsInternal(Func <IPublishedContent> getContent, PagedQuery query, int depth)
        {
            var content = getContent();

            if (content == null)
            {
                return(Request.CreateResponse(HttpStatusCode.NotFound));
            }

            PcrFactory.Create(content, Request.RequestUri);

            var resolved = (string.IsNullOrEmpty(query.Query)) ? content.Descendants().ToArray() : content.Descendants(query.Query).ToArray();

            var total = resolved.Length;
            var pages = (total + query.PageSize - 1) / query.PageSize;
            var items = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(resolved
                                                                                              .Skip(ContentControllerHelper.GetSkipSize(query.Page - 1, query.PageSize))
                                                                                              .Take(query.PageSize),
                                                                                              options => options.Items["prop::depth"] = depth).ToList();
            var result = new PublishedContentPagedListRepresentation(items, total, pages, query.Page, query.PageSize, LinkTemplates.PublishedContent.PagedDescendants, new { id = content.GetKey() });

            return(Request.CreateResponse(HttpStatusCode.OK, result));
        }
        public HttpResponseMessage GetQuery(
            [System.Web.Http.ModelBinding.ModelBinder(typeof(PagedQueryModelBinder))]
            PagedQuery query,
            int id,
            int depth = PublishedContentMapper.DefaultDepth)
        {
            var rootQuery = "";

            if (id > 0)
            {
                //TODO: Change to xpath id() query, see https://github.com/umbraco/Umbraco-CMS/pull/1831
                rootQuery = $"//*[@id='{id}']";
            }

            var skip = (query.Page - 1) * query.PageSize;
            var take = query.PageSize;

            var result = new IPublishedContent[0];

            try
            {
                result = Umbraco.TypedContentAtXPath(rootQuery + query.Query).ToArray();
            }
            catch (Exception)
            {
                //in case the xpath query fails - do nothing as we will return a empty array instead
            }

            var key = Umbraco.TypedContent(id)?.GetKey();

            var paged          = result.Skip((int)skip).Take(take);
            var pages          = (result.Length + query.PageSize - 1) / query.PageSize;
            var items          = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(paged, options => options.Items["prop::depth"] = depth).ToList();
            var representation = new PublishedContentPagedListRepresentation(items, result.Length, pages, query.Page, query.PageSize, LinkTemplates.PublishedContent.Query, new { id = key, query = query.Query, pageSize = query.PageSize });

            return(Request.CreateResponse(HttpStatusCode.OK, representation));
        }
        public HttpResponseMessage GetByTag(string tag, string group = null, int page = 0, int size = 100, int depth = PublishedContentMapper.DefaultDepth)
        {
            var content = Umbraco.TagQuery.GetContentByTag(tag, group).ToArray();

            if (content.Length > 0)
            {
                PcrFactory.Create(content[0], Request.RequestUri);
            }

            var skip  = (page * size);
            var total = content.Length;
            var pages = (total + size - 1) / size;

            var items          = AutoMapper.Mapper.Map <IEnumerable <PublishedContentRepresentation> >(content.Skip(skip).Take(size), options => options.Items["prop::depth"] = depth).ToList();
            var representation = new PublishedContentPagedListRepresentation(items, total, pages, page, size, LinkTemplates.PublishedContent.Search, new
            {
                tag   = tag,
                group = group,
                page  = page,
                size  = size
            });

            return(Request.CreateResponse(HttpStatusCode.OK, representation));
        }