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 }; 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(); }
private async Task<ItemsResult> GetChannelItems(IApiClient apiClient, 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 }; }
private async Task<ItemsResult> GetChannelItems(IApiClient apiClient, ChannelItemQuery query, CancellationToken cancellationToken) { var startIndex = 0; var callLimit = 3; var currentCall = 1; var result = await GetChannelItems(apiClient, query, startIndex, null, CancellationToken.None); var queryLimit = result.Items.Length; while (result.Items.Length < result.TotalRecordCount && currentCall <= callLimit) { startIndex += queryLimit; var innerResult = await GetChannelItems(apiClient, 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 }; }
public async Task<QueryResult<BaseItemDto>> GetChannelItems(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; } 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); }
private async Task<QueryResult<BaseItemDto>> 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.Select(i => _dtoService.GetBaseItemDto(i, query.Fields, user)) .ToArray(); return new QueryResult<BaseItemDto> { Items = returnItemArray, TotalRecordCount = totalCount }; }
public async Task<QueryResult<BaseItemDto>> GetChannelItems(ChannelItemQuery query, CancellationToken cancellationToken) { var user = string.IsNullOrWhiteSpace(query.UserId) ? null : _userManager.GetUserById(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; }
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); }