Skip to content

Commit 7b051f0

Browse files
authored
[FEEDS-29]chore: add batch update tos, add test for moderation token (#149)
* chore: revert test version to match CI * chore: lint * chore: add test for moderation token
1 parent f151e2a commit 7b051f0

File tree

5 files changed

+156
-0
lines changed

5 files changed

+156
-0
lines changed

src/IStreamFeed.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ public interface IStreamFeed
2828
/// <remarks>https://getstream.io/activity-feeds/docs/dotnet-csharp/feeds_101/?language=csharp</remarks>
2929
Task<AddActivitiesResponse> AddActivitiesAsync(IEnumerable<Activity> activities);
3030

31+
Task<UpdateToTargetsResponse> BatchUpdateActivityToTargetsAsync(List<UpdateToTargetsRequest> reqs);
32+
3133
/// <summary>Add a new activity to the feed.</summary>
3234
/// <remarks>https://getstream.io/activity-feeds/docs/dotnet-csharp/feeds_101/?language=csharp</remarks>
3335
Task<Activity> AddActivityAsync(Activity activity);

src/Models/UpdateToTargets.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Newtonsoft.Json;
4+
5+
namespace Stream.Models
6+
{
7+
public class UpdateToTargetsRequest
8+
{
9+
[JsonProperty("foreign_id")]
10+
public string ForeignID { get; set; }
11+
12+
[JsonProperty("time")]
13+
public string Time { get; set; }
14+
15+
[JsonProperty("id")]
16+
public string Id { get; set; }
17+
18+
[JsonProperty("new_targets")]
19+
public List<string> NewTargets { get; set; }
20+
21+
[JsonProperty("added_targets")]
22+
public List<string> Adds { get; set; }
23+
24+
[JsonProperty("removed_targets")]
25+
public List<string> RemovedTargets { get; set; }
26+
}
27+
}

src/StreamFeed.cs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,24 @@ public async Task<GenericGetResponse<Activity>> GetActivitiesAsync(int offset =
127127
throw StreamException.FromResponse(response);
128128
}
129129

130+
public async Task<UpdateToTargetsResponse> BatchUpdateActivityToTargetsAsync(List<UpdateToTargetsRequest> reqs)
131+
{
132+
var endpoint = $"feed_targets/{_feedSlug}/{_userId}/activity_to_targets/";
133+
134+
var request = _client.BuildAppRequest(endpoint, HttpMethod.Post);
135+
request.SetJsonBody(StreamJsonConverter.SerializeObject(reqs));
136+
var response = await _client.MakeRequestAsync(request);
137+
if (response.StatusCode != HttpStatusCode.Created)
138+
{
139+
throw new HttpRequestException($"Request failed with status code {response.StatusCode}");
140+
}
141+
142+
if (response.StatusCode == HttpStatusCode.Created)
143+
return StreamJsonConverter.DeserializeObject<UpdateToTargetsResponse>(response.Content);
144+
145+
throw StreamException.FromResponse(response);
146+
}
147+
130148
public async Task<UpdateToTargetsResponse> UpdateActivityToTargetsAsync(string id,
131149
IEnumerable<string> adds = null,
132150
IEnumerable<string> newTargets = null,
@@ -136,6 +154,8 @@ public async Task<UpdateToTargetsResponse> UpdateActivityToTargetsAsync(string i
136154
newTargets?.ForEach(FeedIdValidator.ThrowIfFeedIdIsInvalid);
137155
removed?.ForEach(FeedIdValidator.ThrowIfFeedIdIsInvalid);
138156

157+
158+
139159
var payload = new
140160
{
141161
id = id,

tests/ActivityTests/UpdateActivityTests.cs

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,96 @@ public async Task TestUpdateToTargets()
164164
Assert.AreEqual(2, updatedAct.To.ToList().FindAll(t => newOnes.Contains(t)).Count);
165165
}
166166

167+
[Test]
168+
public async Task TestBatchUpdateToTargets()
169+
{
170+
var fidTime = new ForeignIdTime(Guid.NewGuid().ToString(), DateTime.UtcNow);
171+
172+
var targets = new List<string>()
173+
{
174+
"flat:" + Guid.NewGuid().ToString(),
175+
"user:" + Guid.NewGuid().ToString(),
176+
};
177+
178+
var act = new Activity("upd", "test", "1")
179+
{
180+
ForeignId = fidTime.ForeignId,
181+
Time = fidTime.Time,
182+
To = targets,
183+
};
184+
185+
var insertedAct = await this.UserFeed.AddActivityAsync(act);
186+
Assert.AreEqual(2, insertedAct.To.Count);
187+
188+
// add 1
189+
var add = "user:" + Guid.NewGuid().ToString();
190+
var updateReqs = new List<UpdateToTargetsRequest>
191+
{
192+
new UpdateToTargetsRequest
193+
{
194+
Id = insertedAct.Id,
195+
Adds = new List<string> { add },
196+
}
197+
};
198+
var updateResp = await this.UserFeed.BatchUpdateActivityToTargetsAsync(updateReqs);
199+
Assert.AreEqual(insertedAct.Id, updateResp.Activity.Id);
200+
Assert.AreEqual(1, updateResp.Added.Count);
201+
Assert.AreEqual(add, updateResp.Added[0]);
202+
Assert.AreEqual(3, updateResp.Activity.To.Count);
203+
Assert.IsNotNull(updateResp.Activity.To.ToList().Find(t => t == add));
204+
205+
var updatedAct = (await this.UserFeed.GetActivitiesAsync(0, 1, FeedFilter.Where().IdLessThanEqual(insertedAct.Id))).Results.FirstOrDefault();
206+
Assert.NotNull(updatedAct);
207+
Assert.AreEqual(3, updatedAct.To.Count);
208+
Assert.IsNotNull(updatedAct.To.ToList().Find(t => t == add));
209+
210+
// remove 1
211+
var remove = targets[0];
212+
updateReqs = new List<UpdateToTargetsRequest>
213+
{
214+
new UpdateToTargetsRequest
215+
{
216+
Id = insertedAct.Id,
217+
RemovedTargets = new List<string> { remove },
218+
}
219+
};
220+
updateResp = await this.UserFeed.BatchUpdateActivityToTargetsAsync(updateReqs);
221+
Assert.AreEqual(insertedAct.Id, updateResp.Activity.Id);
222+
Assert.AreEqual(1, updateResp.Removed.Count);
223+
Assert.AreEqual(remove, updateResp.Removed[0]);
224+
Assert.AreEqual(2, updateResp.Activity.To.Count);
225+
Assert.IsNull(updateResp.Activity.To.ToList().Find(t => t == remove));
226+
227+
updatedAct = (await this.UserFeed.GetActivitiesAsync(0, 1, FeedFilter.Where().IdLessThanEqual(insertedAct.Id))).Results.FirstOrDefault();
228+
Assert.NotNull(updatedAct);
229+
Assert.AreEqual(2, updatedAct.To.Count);
230+
Assert.IsNull(updatedAct.To.ToList().Find(t => t == remove));
231+
232+
// new ones
233+
var newOnes = new List<string>()
234+
{
235+
"flat:" + Guid.NewGuid().ToString(),
236+
"user:" + Guid.NewGuid().ToString(),
237+
};
238+
updateReqs = new List<UpdateToTargetsRequest>
239+
{
240+
new UpdateToTargetsRequest
241+
{
242+
Id = insertedAct.Id,
243+
NewTargets = newOnes,
244+
}
245+
};
246+
updateResp = await this.UserFeed.BatchUpdateActivityToTargetsAsync(updateReqs);
247+
Assert.AreEqual(insertedAct.Id, updateResp.Activity.Id);
248+
Assert.AreEqual(2, updateResp.Activity.To.Count);
249+
Assert.AreEqual(2, updateResp.Added.Count);
250+
Assert.AreEqual(2, updateResp.Added.ToList().FindAll(t => newOnes.Contains(t)).Count);
251+
updatedAct = (await this.UserFeed.GetActivitiesAsync(0, 1, FeedFilter.Where().IdLessThanEqual(insertedAct.Id))).Results.FirstOrDefault();
252+
Assert.NotNull(updatedAct);
253+
Assert.AreEqual(2, updatedAct.To.Count);
254+
Assert.AreEqual(2, updatedAct.To.ToList().FindAll(t => newOnes.Contains(t)).Count);
255+
}
256+
167257
[Test]
168258
public async Task TestActivityPartialUpdateByForeignIDTime()
169259
{

tests/ClientTests.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,24 @@ public void TestToken()
115115
Assert.AreEqual(true, (bool)result["testing"]);
116116
Assert.False(result.ContainsKey("missing"));
117117
}
118+
119+
[Test]
120+
public void TestModerationToken()
121+
{
122+
var result = DecodeJwt(Client.CreateUserToken("user"));
123+
Assert.AreEqual("user", (string)result["user_id"]);
124+
125+
var extra = new Dictionary<string, object>()
126+
{
127+
{ "client", "dotnet" },
128+
{ "required_moderation_template", "mod_template_1" },
129+
};
130+
result = DecodeJwt(Client.CreateUserToken("user2", extra));
118131

132+
Assert.AreEqual("mod_template_1", (string)result["required_moderation_template"]);
133+
Assert.False(result.ContainsKey("missing"));
134+
}
135+
119136
private Dictionary<string, object> DecodeJwt(string token)
120137
{
121138
var segment = token.Split('.')[1];

0 commit comments

Comments
 (0)