From 5139af672cfbc352382d6418dc50d0c9cf84d90d Mon Sep 17 00:00:00 2001 From: peterdeme Date: Thu, 17 Mar 2022 16:12:47 +0100 Subject: [PATCH] fix: send flattened data when upserting --- src/Collections.cs | 6 ++-- src/ICollections.cs | 2 +- src/Models/CollectionObject.cs | 30 +++++++++++++------- src/Models/CustomDataBase.cs | 5 ++++ tests/ActivityTests/EnrichedActivityTests.cs | 2 +- tests/CollectionTests.cs | 23 ++++++++++----- 6 files changed, 46 insertions(+), 22 deletions(-) diff --git a/src/Collections.cs b/src/Collections.cs index 1d985d6..d7c3a80 100644 --- a/src/Collections.cs +++ b/src/Collections.cs @@ -27,7 +27,7 @@ public async Task UpsertManyAsync(string collectionName, IEnumerab var body = new Dictionary { { - "data", new Dictionary { { collectionName, data } } + "data", new Dictionary> { { collectionName, data.Select(x => x.Flatten()) } } }, }; var request = _client.BuildAppRequest("collections/", HttpMethod.Post); @@ -41,7 +41,7 @@ public async Task UpsertManyAsync(string collectionName, IEnumerab throw StreamException.FromResponse(response); } - public async Task SelectAsync(string collectionName, string id) + public async Task SelectAsync(string collectionName, string id) { var result = await SelectManyAsync(collectionName, new[] { id }); return result.Response.Data.FirstOrDefault(); @@ -75,7 +75,7 @@ public async Task DeleteManyAsync(string collectionName, IEnumerable ids public async Task AddAsync(string collectionName, Dictionary data, string id = null, string userId = null) { var collectionObject = new CollectionObject(id) { UserId = userId }; - data.ForEach(x => collectionObject.Data.SetData(x.Key, x.Value)); + data.ForEach(x => collectionObject.SetData(x.Key, x.Value)); var request = _client.BuildAppRequest($"collections/{collectionName}/", HttpMethod.Post); request.SetJsonBody(StreamJsonConverter.SerializeObject(collectionObject)); diff --git a/src/ICollections.cs b/src/ICollections.cs index 13d6949..e86b785 100644 --- a/src/ICollections.cs +++ b/src/ICollections.cs @@ -31,7 +31,7 @@ public interface ICollections /// Returns a collection object. /// https://getstream.io/activity-feeds/docs/dotnet-csharp/collections_introduction/?language=csharp - Task SelectAsync(string collectionName, string id); + Task SelectAsync(string collectionName, string id); /// Returns multiple collection objects. /// https://getstream.io/activity-feeds/docs/dotnet-csharp/collections_introduction/?language=csharp diff --git a/src/Models/CollectionObject.cs b/src/Models/CollectionObject.cs index c2f58a9..dd9f26b 100644 --- a/src/Models/CollectionObject.cs +++ b/src/Models/CollectionObject.cs @@ -1,4 +1,5 @@ using Newtonsoft.Json; +using Newtonsoft.Json.Linq; using Stream.Utils; using System; using System.Collections.Generic; @@ -31,21 +32,30 @@ public class CollectionObject /// Gets a custom data value parsed into . /// public T GetData(string name) => Data.GetData(name); - } - public class GetCollectionResponseObject - { - public string Id { get; set; } - public string Collection { get; set; } - public string ForeignId { get; set; } - public DateTime CreatedAt { get; set; } - public DateTime UpdatedAt { get; set; } - public CollectionObject Data { get; set; } + internal JObject Flatten() + { + var flat = new JObject(); + + if (!string.IsNullOrWhiteSpace(Id)) + flat["id"] = Id; + + if (!string.IsNullOrEmpty(UserId)) + flat["user_id"] = UserId; + + if (Data?.GetAllData()?.Count > 0) + { + foreach (var kvp in Data.GetAllData()) + flat[kvp.Key] = kvp.Value; + } + + return flat; + } } public class GetCollectionResponse { - public List Data { get; set; } + public List Data { get; set; } } public class GetCollectionResponseWrap : ResponseBase diff --git a/src/Models/CustomDataBase.cs b/src/Models/CustomDataBase.cs index 1ef6ff7..1639399 100644 --- a/src/Models/CustomDataBase.cs +++ b/src/Models/CustomDataBase.cs @@ -10,6 +10,11 @@ public abstract class CustomDataBase [JsonExtensionData] protected virtual Dictionary Data { get; set; } = new Dictionary(); + /// + /// Returns all custom data + /// + public Dictionary GetAllData() => Data; + /// /// Gets a custom data value parsed into /// diff --git a/tests/ActivityTests/EnrichedActivityTests.cs b/tests/ActivityTests/EnrichedActivityTests.cs index 495445d..bdce436 100644 --- a/tests/ActivityTests/EnrichedActivityTests.cs +++ b/tests/ActivityTests/EnrichedActivityTests.cs @@ -128,7 +128,7 @@ public async Task TestEnrich_Collection() Assert.NotNull(act.Actor); Assert.AreEqual("actor-1", act.Actor.Id); Assert.AreEqual(c.Id, act.Object.Id); - var dataJobject = act.Object.GetData>("data")["data"] as JObject; + var dataJobject = act.Object.GetData>("data"); Assert.AreEqual("testing_value", dataJobject["field"].ToString()); } diff --git a/tests/CollectionTests.cs b/tests/CollectionTests.cs index 4d71249..a0b97bb 100644 --- a/tests/CollectionTests.cs +++ b/tests/CollectionTests.cs @@ -42,7 +42,7 @@ public async Task TestCollectionsCRUD() Assert.ThrowsAsync(async () => { - var o = await Client.Collections.AddAsync("col_test_crud", colData, collectionObject.Id); + await Client.Collections.AddAsync("col_test_crud", colData, collectionObject.Id); }); // GET @@ -163,11 +163,9 @@ public async Task TestCollectionsSelectMany() await Client.Collections.UpsertManyAsync("people", data); - var results = (await Client.Collections.SelectManyAsync("people", new[] { id1, id2 })).Response.Data; + var results = await Client.Collections.SelectManyAsync("people", new[] { id1, id2 }); - Assert.NotNull(results); - Assert.AreEqual(data.Count, results.CountOrFallback()); - results.ForEach(r => + results.Response.Data.ForEach(r => { var found = data.First(x => x.Id == r.Id); var key = r.Id.Equals(id1) ? "hobbies" : "vacation"; @@ -176,7 +174,7 @@ public async Task TestCollectionsSelectMany() } [Test] - public void TestCollectionsUpsert() + public async Task TestCollectionsUpsert() { var data = new CollectionObject(System.Guid.NewGuid().ToString()); data.SetData("hobbies", new List { "eating", "coding" }); @@ -185,10 +183,13 @@ public void TestCollectionsUpsert() { await Client.Collections.UpsertAsync("people", data); }); + + var result = await Client.Collections.GetAsync("people", data.Id); + Assert.AreEqual(data.GetData>("hobbies"), result.GetData>("hobbies")); } [Test] - public void TestCollectionsUpsertMany() + public async Task TestCollectionsUpsertMany() { var data1 = new CollectionObject(System.Guid.NewGuid().ToString()); data1.SetData("hobbies", new List { "eating", "coding" }); @@ -201,6 +202,14 @@ public void TestCollectionsUpsertMany() { await Client.Collections.UpsertManyAsync("people", data); }); + + var result = await Client.Collections.SelectManyAsync("people", new[] { data1.Id, data2.Id }); + result.Response.Data.ForEach(r => + { + var found = data.First(x => x.Id == r.Id); + var key = r.Id.Equals(data1.Id) ? "hobbies" : "vacation"; + Assert.AreEqual(found.GetData>(key), r.GetData>(key)); + }); } } } \ No newline at end of file