diff --git a/src/stream-net-tests/IntegrationTests.cs b/src/stream-net-tests/IntegrationTests.cs index d9d5a06..94eaa47 100644 --- a/src/stream-net-tests/IntegrationTests.cs +++ b/src/stream-net-tests/IntegrationTests.cs @@ -2061,6 +2061,11 @@ public async Task TestReactionPagination() reactionsByActivity = await this._client.Reactions.Filter(filter.WithLimit(1), pagination); Assert.AreEqual(1, reactionsByActivity.Count()); + //with data + var reactionsByActivityWithData = await this._client.Reactions.FilterWithActivityData(filter.WithLimit(1), pagination); + Assert.AreEqual(1, reactionsByActivity.Count()); + Assert.AreEqual(data, reactionsByActivity.FirstOrDefault().Data); + // user id filter = ReactionFiltering.Default; pagination = ReactionPagination.By.UserID(userId); diff --git a/src/stream-net/FeedFilter.cs b/src/stream-net/FeedFilter.cs index 89dd047..26c6dfb 100644 --- a/src/stream-net/FeedFilter.cs +++ b/src/stream-net/FeedFilter.cs @@ -1,5 +1,6 @@ using Stream.Rest; using System.Collections.Generic; +using System.Linq; namespace Stream { @@ -10,7 +11,8 @@ internal enum OpType id_gte, id_gt, id_lte, - id_lt + id_lt, + with_activity_data } internal class OpEntry @@ -32,6 +34,12 @@ private FeedFilter() { } + public FeedFilter WithActivityData() + { + _ops.Add(new OpEntry(OpType.with_activity_data, "true")); + return this; + } + public FeedFilter IdGreaterThan(string id) { _ops.Add(new OpEntry(OpType.id_gt, id)); @@ -64,6 +72,14 @@ internal void Apply(RestRequest request) }); } + internal bool IncludesActivityData + { + get + { + return _ops.Any(x => x.Type == OpType.with_activity_data); + } + } + #region starts public static FeedFilter Where() diff --git a/src/stream-net/Reactions.cs b/src/stream-net/Reactions.cs index 5838557..5a48675 100644 --- a/src/stream-net/Reactions.cs +++ b/src/stream-net/Reactions.cs @@ -3,13 +3,20 @@ using Stream.Rest; using System; using System.Collections.Generic; -using System.Linq; using System.Threading.Tasks; namespace Stream { using ReactionFilter = FeedFilter; + public class ReactionsWithActivity + { + [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "results")] + public IEnumerable Reactions { get; internal set; } + + public EnrichedActivity Activity { get; internal set; } + } + public class Reaction { [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "id")] @@ -65,6 +72,13 @@ public ReactionFiltering WithFilter(ReactionFilter filter) return this; } + internal ReactionFiltering WithActivityData() + { + _filter = (_filter == null) ? ReactionFilter.Where().WithActivityData() : _filter.WithActivityData(); + + return this; + } + internal void Apply(RestRequest request) { request.AddQueryParameter("limit", _limit.ToString()); @@ -74,6 +88,14 @@ internal void Apply(RestRequest request) _filter.Apply(request); } + internal bool IncludesActivityData + { + get + { + return _filter.IncludesActivityData; + } + } + public static ReactionFiltering Default { get @@ -142,7 +164,21 @@ private class ReactionsFilterResponse { [JsonProperty(NullValueHandling = NullValueHandling.Ignore, PropertyName = "results")] public IEnumerable Reactions { get; internal set; } - } + + internal static EnrichedActivity GetActivity(string json) + { + JObject obj = JObject.Parse(json); + foreach (var prop in obj.Properties()) + { + if (prop.Name == "activity") + { + return EnrichedActivity.FromJson((JObject)prop.Value); + } + } + + return null; + } + } internal Reactions(StreamClient client) { @@ -192,21 +228,47 @@ public async Task Get(string reactionID) } public async Task> Filter(ReactionFiltering filtering, ReactionPagination pagination) - { - var urlPath = pagination.GetPath(); - var request = this._client.BuildJWTAppRequest($"reaction/{urlPath}", HttpMethod.GET); - filtering.Apply(request); + { + var response = await FilterHelper(filtering, pagination); - var response = await this._client.MakeRequest(request); + if (response.StatusCode == System.Net.HttpStatusCode.OK) + { + return JsonConvert.DeserializeObject(response.Content).Reactions; + } + + throw StreamException.FromResponse(response); + } + + public async Task FilterWithActivityData(ReactionFiltering filtering, ReactionPagination pagination) + { + var response = await FilterHelper(filtering.WithActivityData(), pagination); if (response.StatusCode == System.Net.HttpStatusCode.OK) { - return JsonConvert.DeserializeObject(response.Content).Reactions; + var reactions = JsonConvert.DeserializeObject(response.Content).Reactions; + var activity = ReactionsFilterResponse.GetActivity(response.Content); + + return new ReactionsWithActivity + { + Reactions = reactions, + Activity = activity + }; } throw StreamException.FromResponse(response); } + private async Task FilterHelper(ReactionFiltering filtering, ReactionPagination pagination) + { + var urlPath = pagination.GetPath(); + var request = this._client.BuildJWTAppRequest($"reaction/{urlPath}", HttpMethod.GET); + filtering.Apply(request); + + var response = await this._client.MakeRequest(request); + + return response; + } + public async Task Update(string reactionID, IDictionary data = null, IEnumerable targetFeeds = null) { var r = new Reaction()