Skip to content

Commit

Permalink
Merge pull request #166 from Kentico/feature/KCL-1219_Support_for_ite…
Browse files Browse the repository at this point in the history
…ms_feed

Support new items feed endpoint
  • Loading branch information
Enngage authored Oct 3, 2019
2 parents b8ae694 + ba7d014 commit 32b8270
Show file tree
Hide file tree
Showing 30 changed files with 1,911 additions and 183 deletions.
46 changes: 46 additions & 0 deletions Kentico.Kontent.Delivery.Rx.Tests/DeliveryObservableProxyTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,17 @@ public void ContentItemsRetrieved()
Assert.All(items, item => AssertItemPropertiesNotNull(item));
}

[Fact]
public void ContentItemsFeedRetrieved()
{
var observable = new DeliveryObservableProxy(GetDeliveryClient(MockFeedItems)).GetItemsFeedObservable();
var items = observable.ToEnumerable().ToList();

Assert.NotEmpty(items);
Assert.Equal(2, items.Count);
Assert.All(items, item => AssertItemPropertiesNotNull(item));
}

[Fact]
public void TypedItemsRetrieved()
{
Expand All @@ -102,6 +113,17 @@ public void TypedItemsRetrieved()
Assert.All(items, article => AssertArticlePropertiesNotNull(article));
}

[Fact]
public void TypedItemsFeedRetrieved()
{
var observable = new DeliveryObservableProxy(GetDeliveryClient(MockFeedArticles)).GetItemsFeedObservable<Article>(new ContainsFilter("elements.personas", "barista"));
var items = observable.ToEnumerable().ToList();

Assert.NotEmpty(items);
Assert.Equal(6, items.Count);
Assert.All(items, article => AssertArticlePropertiesNotNull(article));
}

[Fact]
public void RuntimeTypedItemsRetrieved()
{
Expand All @@ -113,6 +135,17 @@ public void RuntimeTypedItemsRetrieved()
Assert.All(articles, article => AssertArticlePropertiesNotNull(article));
}

[Fact]
public void RuntimeTypedItemsFeedRetrieved()
{
var observable = new DeliveryObservableProxy(GetDeliveryClient(MockFeedArticles)).GetItemsFeedObservable<Article>(new ContainsFilter("elements.personas", "barista"));
var articles = observable.ToEnumerable().ToList();

Assert.NotEmpty(articles);
Assert.All(articles, article => Assert.IsType<Article>(article));
Assert.All(articles, article => AssertArticlePropertiesNotNull(article));
}

[Fact]
public async void TypeJsonRetrieved()
{
Expand Down Expand Up @@ -252,13 +285,26 @@ private void MockItems()
.Respond("application/json", File.ReadAllText(Path.Combine(Environment.CurrentDirectory, $"Fixtures{Path.DirectorySeparatorChar}items.json")));
}

private void MockFeedItems()
{
mockHttp.When($"{baseUrl}/items-feed")
.Respond("application/json", File.ReadAllText(Path.Combine(Environment.CurrentDirectory, $"Fixtures{Path.DirectorySeparatorChar}items.json")));
}

private void MockArticles()
{
mockHttp.When($"{baseUrl}/items")
.WithQueryString(new[] { new KeyValuePair<string, string>("system.type", Article.Codename), new KeyValuePair<string, string>("elements.personas[contains]", "barista") })
.Respond("application/json", File.ReadAllText(Path.Combine(Environment.CurrentDirectory, $"Fixtures{Path.DirectorySeparatorChar}articles.json")));
}

private void MockFeedArticles()
{
mockHttp.When($"{baseUrl}/items-feed")
.WithQueryString(new[] { new KeyValuePair<string, string>("system.type", Article.Codename), new KeyValuePair<string, string>("elements.personas[contains]", "barista") })
.Respond("application/json", File.ReadAllText(Path.Combine(Environment.CurrentDirectory, $"Fixtures{Path.DirectorySeparatorChar}articles.json")));
}

private void MockType()
{
mockHttp.When($"{baseUrl}/types/{Article.Codename}")
Expand Down
72 changes: 69 additions & 3 deletions Kentico.Kontent.Delivery.Rx/DeliveryObservableProxy.cs
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,72 @@ public IObservable<T> GetItemsObservable<T>(IEnumerable<IQueryParameter> paramet
return (DeliveryClient?.GetItemsAsync<T>(parameters))?.Result?.Items?.ToObservable();
}

/// <summary>
/// Returns an observable of content items that match the optional filtering parameters. Items are enumerated in batches.
/// </summary>
/// <param name="parameters">A collection of query parameters, for example, for filtering or ordering.</param>
/// <returns>The <see cref="IObservable{ContentItem}"/> that represents the content items. If no query parameters are specified, all content items are returned.</returns>
public IObservable<ContentItem> GetItemsFeedObservable(params IQueryParameter[] parameters)
{
return GetItemsFeedObservable((IEnumerable<IQueryParameter>)parameters);
}

/// <summary>
/// Returns an observable of content items that match the optional filtering parameters. Items are enumerated in batches.
/// </summary>
/// <param name="parameters">An array of query parameters, for example, for filtering or ordering.</param>
/// <returns>The <see cref="IObservable{ContentItem}"/> that represents the content items. If no query parameters are specified, all content items are returned.</returns>
public IObservable<ContentItem> GetItemsFeedObservable(IEnumerable<IQueryParameter> parameters)
{
var feed = DeliveryClient?.GetItemsFeed(parameters);
return feed == null ? null : EnumerateFeed()?.ToObservable();

IEnumerable<ContentItem> EnumerateFeed()
{
while (feed.HasMoreResults)
{
foreach (var contentItem in feed.FetchNextBatchAsync().Result)
{
yield return contentItem;
}
}
}
}

/// <summary>
/// Returns an observable of strongly typed content items that match the optional filtering parameters. Items are enumerated in batches.
/// </summary>
/// /// <typeparam name="T">Type of the model. (Or <see cref="object"/> if the return type is not yet known.)</typeparam>
/// <param name="parameters">A collection of query parameters, for example, for filtering or ordering.</param>
/// <returns>The <see cref="IObservable{T}"/> that represents the content items. If no query parameters are specified, all content items are returned.</returns>
public IObservable<T> GetItemsFeedObservable<T>(params IQueryParameter[] parameters) where T : class
{
return GetItemsFeedObservable<T>((IEnumerable<IQueryParameter>)parameters);
}

/// <summary>
/// Returns an observable of strongly typed content items that match the optional filtering parameters. Items are enumerated in batches.
/// </summary>
/// /// <typeparam name="T">Type of the model. (Or <see cref="object"/> if the return type is not yet known.)</typeparam>
/// <param name="parameters">A collection of query parameters, for example, for filtering or ordering.</param>
/// <returns>The <see cref="IObservable{T}"/> that represents the content items. If no query parameters are specified, all content items are returned.</returns>
public IObservable<T> GetItemsFeedObservable<T>(IEnumerable<IQueryParameter> parameters) where T : class
{
var feed = DeliveryClient?.GetItemsFeed<T>(parameters);
return feed == null ? null : EnumerateFeed()?.ToObservable();

IEnumerable<T> EnumerateFeed()
{
while (feed.HasMoreResults)
{
foreach (var contentItem in feed.FetchNextBatchAsync().Result)
{
yield return contentItem;
}
}
}
}

/// <summary>
/// Returns an observable of a single content type as JSON data.
/// </summary>
Expand Down Expand Up @@ -176,7 +242,7 @@ public IObservable<JObject> GetTypesJsonObservable(params string[] parameters)
/// <returns>The <see cref="IObservable{ContentType}"/> that represents the content type with the specified codename.</returns>
public IObservable<ContentType> GetTypeObservable(string codename)
{
return GetObservableOfOne(() => DeliveryClient?.GetTypeAsync(codename)?.Result);
return GetObservableOfOne(() => DeliveryClient?.GetTypeAsync(codename)?.Result.Type);
}

/// <summary>
Expand Down Expand Up @@ -206,7 +272,7 @@ public IObservable<ContentType> GetTypesObservable(IEnumerable<IQueryParameter>
/// <returns>An <see cref="IObservable{ContentElement}"/> that represents the content element with the specified codename, that is a part of a content type with the specified codename.</returns>
public IObservable<ContentElement> GetElementObservable(string contentTypeCodename, string contentElementCodename)
{
return GetObservableOfOne(() => DeliveryClient?.GetContentElementAsync(contentTypeCodename, contentElementCodename)?.Result);
return GetObservableOfOne(() => DeliveryClient?.GetContentElementAsync(contentTypeCodename, contentElementCodename)?.Result.Element);
}

/// <summary>
Expand Down Expand Up @@ -236,7 +302,7 @@ public IObservable<JObject> GetTaxonomiesJsonObservable(params string[] paramete
/// <returns>The <see cref="IObservable{TaxonomyGroup}"/> that represents the taxonomy group with the specified codename.</returns>
public IObservable<TaxonomyGroup> GetTaxonomyObservable(string codename)
{
return GetObservableOfOne(() => DeliveryClient?.GetTaxonomyAsync(codename)?.Result);
return GetObservableOfOne(() => DeliveryClient?.GetTaxonomyAsync(codename)?.Result.Taxonomy);
}

/// <summary>
Expand Down
Loading

0 comments on commit 32b8270

Please sign in to comment.