예제 #1
0
        private async Task LoadData(bool isRefresh)
        {
            if (!NavigationService.IsNetworkAvailable ||
                SelectedChannel == null ||
                (_channelItemsLoaded && !isRefresh))
            {
                return;
            }

            try
            {
                SetProgressBar(AppResources.SysTrayGettingDetails);

                var query = new ChannelItemQuery
                {
                    ChannelId = SelectedChannel.Type.ToLower() == "channel" ? SelectedChannel.Id : SelectedChannel.ChannelId,
                    FolderId  = SelectedChannel.Type.ToLower() == "channel" ? "" : SelectedChannel.Id,
                    UserId    = AuthenticationService.Current.LoggedInUserId,
                    Fields    = new[] { ItemFields.SyncInfo }
                };
                var items = await ApiClient.GetChannelItems(query);

                ChannelItems = new ObservableCollection <BaseItemDto>(items.Items);

                _channelItemsLoaded = true;
            }
            catch (HttpException ex)
            {
                Utils.HandleHttpException(ex, "LoadData(" + isRefresh + ")", NavigationService, Log);
            }

            SetProgressBar();
        }
예제 #2
0
        private async Task <ItemsResult> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
        {
            var startIndex  = 0;
            var callLimit   = 3;
            var currentCall = 1;

            var result = await GetChannelItems(query, startIndex, null, CancellationToken.None);

            var queryLimit = result.Items.Length;

            while (result.Items.Length < result.TotalRecordCount && currentCall <= callLimit)
            {
                startIndex += queryLimit;

                var innerResult = await GetChannelItems(query, startIndex, queryLimit, CancellationToken.None);

                var list = result.Items.ToList();
                list.AddRange(innerResult.Items);
                result.Items = list.ToArray();

                currentCall++;
            }

            return(new ItemsResult
            {
                TotalRecordCount = result.TotalRecordCount,
                Items = result.Items
            });
        }
예제 #3
0
        private async Task <ItemsResult> GetChannelItems(ChannelItemQuery query, int start, int?limit, CancellationToken cancellationToken)
        {
            query.StartIndex = start;
            query.Limit      = limit;

            var result = await _apiClient.GetChannelItems(query, CancellationToken.None);

            return(new ItemsResult
            {
                TotalRecordCount = result.TotalRecordCount,
                Items = result.Items
            });
        }
예제 #4
0
        public async Task <QueryResult <BaseItemDto> > GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
        {
            var user = string.IsNullOrWhiteSpace(query.UserId)
                ? null
                : _userManager.GetUserById(new Guid(query.UserId));

            var id              = new Guid(query.ChannelId);
            var channel         = _channelEntities.First(i => i.Id == id);
            var channelProvider = GetChannelProvider(channel);

            var items = await GetChannelItems(channelProvider, user, query.CategoryId, cancellationToken)
                        .ConfigureAwait(false);


            return(await GetReturnItems(items, user, query.StartIndex, query.Limit, cancellationToken).ConfigureAwait(false));
        }
예제 #5
0
        public async Task <QueryResult <BaseItemDto> > GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken)
        {
            var user = string.IsNullOrWhiteSpace(query.UserId)
                ? null
                : _userManager.GetUserById(new Guid(query.UserId));

            var internalResult = await GetChannelItemsInternal(query, cancellationToken).ConfigureAwait(false);

            // Get everything
            var fields = Enum.GetNames(typeof(ItemFields))
                         .Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true))
                         .ToList();

            var returnItems = internalResult.Items.Select(i => _dtoService.GetBaseItemDto(i, fields, user))
                              .ToArray();

            var result = new QueryResult <BaseItemDto>
            {
                Items            = returnItems,
                TotalRecordCount = internalResult.TotalRecordCount
            };

            return(result);
        }
예제 #6
0
        public async Task <QueryResult <BaseItem> > GetChannelItemsInternal(ChannelItemQuery query, CancellationToken cancellationToken)
        {
            // Get the internal channel entity
            var channel = GetChannel(query.ChannelId);

            // Find the corresponding channel provider plugin
            var channelProvider = GetChannelProvider(channel);

            var channelInfo = channelProvider.GetChannelFeatures();

            int?providerStartIndex = null;
            int?providerLimit      = null;

            if (channelInfo.MaxPageSize.HasValue)
            {
                providerStartIndex = query.StartIndex;

                if (query.Limit.HasValue && query.Limit.Value > channelInfo.MaxPageSize.Value)
                {
                    throw new ArgumentException(string.Format("{0} channel only supports a maximum of {1} records at a time.", channel.Name, channelInfo.MaxPageSize.Value));
                }
                providerLimit = query.Limit;

                // This will cause some providers to fail
                if (providerLimit == 0)
                {
                    providerLimit = 1;
                }
            }

            var user = string.IsNullOrWhiteSpace(query.UserId)
                ? null
                : _userManager.GetUserById(new Guid(query.UserId));

            ChannelItemSortField?sortField = null;
            ChannelItemSortField parsedField;

            if (query.SortBy.Length == 1 &&
                Enum.TryParse(query.SortBy[0], true, out parsedField))
            {
                sortField = parsedField;
            }

            var sortDescending = query.SortOrder.HasValue && query.SortOrder.Value == SortOrder.Descending;

            var itemsResult = await GetChannelItems(channelProvider,
                                                    user,
                                                    query.FolderId,
                                                    providerStartIndex,
                                                    providerLimit,
                                                    sortField,
                                                    sortDescending,
                                                    cancellationToken)
                              .ConfigureAwait(false);

            var providerTotalRecordCount = providerLimit.HasValue ? itemsResult.TotalRecordCount : null;

            var tasks = itemsResult.Items.Select(i => GetChannelItemEntity(i, channelProvider, channel.Id, cancellationToken));

            var internalItems = await Task.WhenAll(tasks).ConfigureAwait(false);

            if (user != null)
            {
                internalItems = internalItems.Where(i => i.IsVisible(user)).ToArray();

                if (providerTotalRecordCount.HasValue)
                {
                    providerTotalRecordCount = providerTotalRecordCount.Value;
                }
            }

            return(await GetReturnItems(internalItems, providerTotalRecordCount, user, query, cancellationToken).ConfigureAwait(false));
        }
예제 #7
0
        private async Task <QueryResult <BaseItem> > GetReturnItems(IEnumerable <BaseItem> items, int?totalCountFromProvider, User user, ChannelItemQuery query, CancellationToken cancellationToken)
        {
            items = ApplyFilters(items, query.Filters, user);

            var sortBy = query.SortBy.Length == 0 ? new[] { ItemSortBy.SortName } : query.SortBy;

            items = _libraryManager.Sort(items, user, sortBy, query.SortOrder ?? SortOrder.Ascending);

            var all        = items.ToList();
            var totalCount = totalCountFromProvider ?? all.Count;

            if (!totalCountFromProvider.HasValue)
            {
                if (query.StartIndex.HasValue)
                {
                    all = all.Skip(query.StartIndex.Value).ToList();
                }
                if (query.Limit.HasValue)
                {
                    all = all.Take(query.Limit.Value).ToList();
                }
            }

            await RefreshIfNeeded(all, cancellationToken).ConfigureAwait(false);

            var returnItemArray = all.ToArray();

            return(new QueryResult <BaseItem>
            {
                Items = returnItemArray,
                TotalRecordCount = totalCount
            });
        }