Skip to content

Commit 0c75236

Browse files
authored
[PBE-0]add users batch (#143)
* add users batch * add users batch * remove comments
1 parent 1e432ac commit 0c75236

File tree

6 files changed

+198
-2
lines changed

6 files changed

+198
-2
lines changed

src/IStreamClient.cs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,12 @@ public interface IStreamClient
2020
/// </summary>
2121
ICollections Collections { get; }
2222

23+
/// <summary>
24+
/// Returns an <see cref="IUsersBatch"/> instance that let's you interact with UsersBatch.
25+
/// You can used the returned instance as a singleton in your application.
26+
/// </summary>
27+
IUsersBatch UsersBatch { get; }
28+
2329
/// <summary>
2430
/// Returns an <see cref="IReactions"/> instance that let's you interact with reactions.
2531
/// You can used the returned instance as a singleton in your application.
@@ -77,4 +83,4 @@ public interface IStreamClient
7783
/// </summary>
7884
string CreateUserToken(string userId, IDictionary<string, object> extraData = null);
7985
}
80-
}
86+
}

src/IUsersBatch.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Stream.Models;
2+
using System.Collections.Generic;
3+
using System.Threading.Tasks;
4+
5+
namespace Stream
6+
{
7+
public interface IUsersBatch
8+
{
9+
Task<IEnumerable<User>> UpsertUsersAsync(IEnumerable<User> users, bool overrideExisting = false);
10+
Task<IEnumerable<User>> GetUsersAsync(IEnumerable<string> userIds);
11+
Task<IEnumerable<string>> DeleteUsersAsync(IEnumerable<string> userIds);
12+
}
13+
}

src/Models/UsersBatch.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
using Newtonsoft.Json;
2+
using Newtonsoft.Json.Linq;
3+
using Stream.Utils;
4+
using System;
5+
using System.Collections.Generic;
6+
7+
namespace Stream.Models
8+
{
9+
public class AddUserBatchResponse
10+
{
11+
public IEnumerable<User> CreatedUsers { get; set; }
12+
}
13+
14+
public class GetUserBatchResponse
15+
{
16+
public IEnumerable<User> Users { get; set; }
17+
}
18+
19+
public class DeleteUsersBatchResponse
20+
{
21+
public IEnumerable<string> DeletedUserIds { get; set; }
22+
}
23+
}

src/StreamClient.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ public StreamClient(string apiKey, string apiSecretOrToken, StreamClientOptions
7171

7272
Batch = new BatchOperations(this);
7373
Collections = new Collections(this);
74+
UsersBatch = new UsersBatch(this);
7475
Reactions = new Reactions(this);
7576
Users = new Users(this);
7677
Moderation = new Moderation(this);
@@ -90,6 +91,7 @@ private StreamClient(string apiKey, IToken streamClientToken, RestClient client,
9091

9192
public IBatchOperations Batch { get; }
9293
public ICollections Collections { get; }
94+
public IUsersBatch UsersBatch { get; }
9395
public IReactions Reactions { get; }
9496
public IUsers Users { get; }
9597
public IPersonalization Personalization { get; }
@@ -244,4 +246,4 @@ internal string JWToken(string feedId, string userId = null)
244246
return _streamClientToken.For(payload);
245247
}
246248
}
247-
}
249+
}

src/UsersBatch.cs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using Stream.Models;
2+
using Stream.Utils;
3+
using System.Collections.Generic;
4+
using System.Linq;
5+
using System.Net;
6+
using System.Net.Http;
7+
using System.Threading.Tasks;
8+
9+
namespace Stream
10+
{
11+
public class UsersBatch : IUsersBatch
12+
{
13+
private readonly StreamClient _client;
14+
15+
internal UsersBatch(StreamClient client)
16+
{
17+
_client = client;
18+
}
19+
20+
public async Task<IEnumerable<User>> UpsertUsersAsync(IEnumerable<User> users, bool overrideExisting = false)
21+
{
22+
var body = new Dictionary<string, object>
23+
{
24+
{ "users", users },
25+
{ "override", overrideExisting },
26+
};
27+
var request = _client.BuildAppRequest("users/", HttpMethod.Post);
28+
request.SetJsonBody(StreamJsonConverter.SerializeObject(body));
29+
30+
var response = await _client.MakeRequestAsync(request);
31+
32+
if (response.StatusCode == HttpStatusCode.Created)
33+
{
34+
var addUserBatchResponse = StreamJsonConverter.DeserializeObject<AddUserBatchResponse>(response.Content);
35+
return addUserBatchResponse.CreatedUsers;
36+
}
37+
38+
throw StreamException.FromResponse(response);
39+
}
40+
41+
public async Task<IEnumerable<User>> GetUsersAsync(IEnumerable<string> userIds)
42+
{
43+
var request = _client.BuildAppRequest("users/", HttpMethod.Get);
44+
request.AddQueryParameter("ids", string.Join(",", userIds));
45+
46+
var response = await _client.MakeRequestAsync(request);
47+
48+
if (response.StatusCode == HttpStatusCode.OK)
49+
{
50+
var getUserBatchResponse = StreamJsonConverter.DeserializeObject<GetUserBatchResponse>(response.Content);
51+
return getUserBatchResponse.Users;
52+
}
53+
54+
throw StreamException.FromResponse(response);
55+
}
56+
57+
public async Task<IEnumerable<string>> DeleteUsersAsync(IEnumerable<string> userIds)
58+
{
59+
var request = _client.BuildAppRequest("users/", HttpMethod.Delete);
60+
request.AddQueryParameter("ids", string.Join(",", userIds));
61+
62+
var response = await _client.MakeRequestAsync(request);
63+
64+
if (response.StatusCode == HttpStatusCode.OK)
65+
{
66+
var deleteUserBatchResponse = StreamJsonConverter.DeserializeObject<DeleteUsersBatchResponse>(response.Content);
67+
return deleteUserBatchResponse.DeletedUserIds;
68+
}
69+
70+
throw StreamException.FromResponse(response);
71+
}
72+
}
73+
}

tests/UsersBatchTests.cs

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
using NUnit.Framework;
2+
using Stream;
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Threading.Tasks;
7+
8+
namespace StreamNetTests
9+
{
10+
[TestFixture]
11+
public class UsersBatchTests : TestBase
12+
{
13+
[Test]
14+
public async Task TestAddGetUsersAsync()
15+
{
16+
var userIds = new List<string> { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() };
17+
18+
var users = new List<User>
19+
{
20+
new User { Id = userIds[0], Data = new Dictionary<string, object> { { "field", "value1" } } },
21+
new User { Id = userIds[1], Data = new Dictionary<string, object> { { "field", "value2" } } },
22+
};
23+
24+
var response = await Client.UsersBatch.UpsertUsersAsync(users);
25+
26+
Assert.NotNull(response);
27+
Assert.AreEqual(users.Count, response.Count());
28+
29+
var usersReturned = await Client.UsersBatch.GetUsersAsync(userIds);
30+
31+
Assert.NotNull(usersReturned);
32+
Assert.AreEqual(userIds.Count, usersReturned.Count());
33+
}
34+
35+
[Test]
36+
public async Task TestDeleteUsersAsync()
37+
{
38+
var userIds = new List<string> { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() };
39+
40+
var deletedUserIds = await Client.UsersBatch.DeleteUsersAsync(userIds);
41+
42+
Assert.NotNull(deletedUserIds);
43+
Assert.AreEqual(userIds.Count, deletedUserIds.Count());
44+
Assert.IsTrue(userIds.All(id => deletedUserIds.Contains(id)));
45+
}
46+
47+
[Test]
48+
public async Task AddGetDeleteGetUsersAsync()
49+
{
50+
var userIds = new List<string> { Guid.NewGuid().ToString(), Guid.NewGuid().ToString() };
51+
52+
// Add users
53+
var users = new List<User>
54+
{
55+
new User { Id = userIds[0], Data = new Dictionary<string, object> { { "field", "value1" } } },
56+
new User { Id = userIds[1], Data = new Dictionary<string, object> { { "field", "value2" } } },
57+
};
58+
59+
var addResponse = await Client.UsersBatch.UpsertUsersAsync(users);
60+
Assert.NotNull(addResponse);
61+
Assert.AreEqual(users.Count, addResponse.Count());
62+
63+
// Get users to confirm they were added
64+
var getUsersResponse = await Client.UsersBatch.GetUsersAsync(userIds);
65+
Assert.NotNull(getUsersResponse);
66+
Assert.AreEqual(users.Count, getUsersResponse.Count());
67+
68+
// Delete users
69+
var deleteResponse = await Client.UsersBatch.DeleteUsersAsync(userIds);
70+
Assert.NotNull(deleteResponse);
71+
Assert.AreEqual(userIds.Count(), deleteResponse.Count());
72+
Assert.IsTrue(userIds.All(id => deleteResponse.Contains(id)));
73+
74+
// Attempt to get deleted users to confirm they were deleted
75+
var getDeletedUsersResponse = await Client.UsersBatch.GetUsersAsync(userIds);
76+
Assert.IsEmpty(getDeletedUsersResponse);
77+
}
78+
}
79+
}

0 commit comments

Comments
 (0)