diff --git a/src/ZendeskApi_v2/Requests/Users.cs b/src/ZendeskApi_v2/Requests/Users.cs index e5fe1258..92a042d2 100644 --- a/src/ZendeskApi_v2/Requests/Users.cs +++ b/src/ZendeskApi_v2/Requests/Users.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using ZendeskApi_v2.Extensions; #if ASYNC @@ -74,6 +75,8 @@ public interface IUsers : ICore bool DeleteUser(long id); + JobStatusResponse BulkDeleteUsers(IEnumerable users); + bool SetUsersPassword(long userId, string newPassword); bool ChangeUsersPassword(long userId, string oldPassword, string newPassword); @@ -150,6 +153,8 @@ public interface IUsers : ICore Task DeleteUserAsync(long id); + Task BulkDeleteUsersAsync(IEnumerable users); + Task SetUsersPasswordAsync(long userId, string newPassword); Task ChangeUsersPasswordAsync(long userId, string oldPassword, string newPassword); @@ -345,6 +350,13 @@ public bool DeleteUser(long id) return GenericDelete($"users/{id}.json"); } + public JobStatusResponse BulkDeleteUsers(IEnumerable users) + { + var userIdsCommaSeperatedList = CreateCommaSeperatedUserIdString(users); + + return GenericDelete($"users/destroy_many.json?ids={userIdsCommaSeperatedList}"); + } + public bool SetUsersPassword(long userId, string newPassword) { var body = new { password = newPassword }; @@ -559,6 +571,13 @@ public async Task DeleteUserAsync(long id) return await GenericDeleteAsync($"users/{id}.json"); } + public Task BulkDeleteUsersAsync(IEnumerable users) + { + var userIdsCommaSeperatedList = CreateCommaSeperatedUserIdString(users); + + return GenericDeleteAsync($"users/destroy_many.json?ids={userIdsCommaSeperatedList}"); + } + public async Task SetUsersPasswordAsync(long userId, string newPassword) { var body = new { password = newPassword }; @@ -646,5 +665,13 @@ private string GetResourceStringWithSideLoadOptionsParam(string resource, UserSi return resource; } + + private static string CreateCommaSeperatedUserIdString(IEnumerable users) + { + var userIds = users.Select(user => user.Id); + var userIdsCommaSeperatedList = string.Join(",", userIds); + + return userIdsCommaSeperatedList; + } } } diff --git a/test/ZendeskApi_v2.Test/UserTests.cs b/test/ZendeskApi_v2.Test/UserTests.cs index ce18aa8b..29511c76 100644 --- a/test/ZendeskApi_v2.Test/UserTests.cs +++ b/test/ZendeskApi_v2.Test/UserTests.cs @@ -9,6 +9,8 @@ using ZendeskApi_v2.Requests; using ZendeskApi_v2.Models.Shared; using System.IO; +using System.Net; +using System.Threading; namespace Tests { @@ -16,6 +18,10 @@ namespace Tests [Category("Users")] public class UserTests { + private const int MaxRetryAttempts = 10; + private const string JobStatusCompleted = "completed"; + private const string JobStatusQueued = "queued"; + private ZendeskApi api = new ZendeskApi(Settings.Site, Settings.AdminEmail, Settings.AdminPassword); [Test] @@ -419,5 +425,77 @@ public async Task CanCreateUpdateAndDeleteIdentitiesAsync() Assert.True(api.Users.DeleteUserIdentity(userId, identityId)); Assert.True(api.Users.DeleteUser(userId)); } + + [Test] + public async Task CanBulkDeleteUsersAsync() + { + var users = new List(); + + for (var i = 0; i < 2; i++) + { + var user = new User() + { + Name = Guid.NewGuid().ToString("N") + " " + Guid.NewGuid().ToString("N"), + Email = Guid.NewGuid().ToString("N") + "@" + Guid.NewGuid().ToString("N") + ".com", + Verified = true + }; + + var response = await api.Users.CreateUserAsync(user); + + users.Add(response.User); + } + + var jobResponse = await api.Users.BulkDeleteUsersAsync(users); + + Assert.AreEqual(JobStatusQueued, jobResponse.JobStatus.Status.ToLower()); + + var count = 0; + + while (jobResponse.JobStatus.Status.ToLower() != JobStatusCompleted && count < MaxRetryAttempts) + { + await Task.Delay(1000); + jobResponse = api.JobStatuses.GetJobStatus(jobResponse.JobStatus.Id); + count++; + } + + Assert.AreEqual(JobStatusCompleted, jobResponse.JobStatus.Status.ToLower()); + Assert.AreEqual(users.Count, jobResponse.JobStatus.Total); + } + + [Test] + public void CanBulkDeleteUsers() + { + var users = new List(); + + for (var i = 0; i < 2; i++) + { + var user = new User() + { + Name = Guid.NewGuid().ToString("N") + " " + Guid.NewGuid().ToString("N"), + Email = Guid.NewGuid().ToString("N") + "@" + Guid.NewGuid().ToString("N") + ".com", + Verified = true + }; + + var response = api.Users.CreateUser(user); + + users.Add(response.User); + } + + var jobResponse = api.Users.BulkDeleteUsers(users); + + Assert.AreEqual(JobStatusQueued, jobResponse.JobStatus.Status.ToLower()); + + var count = 0; + + while (jobResponse.JobStatus.Status.ToLower() != JobStatusCompleted && count < MaxRetryAttempts) + { + Thread.Sleep(1000); + jobResponse = api.JobStatuses.GetJobStatus(jobResponse.JobStatus.Id); + count++; + } + + Assert.AreEqual(JobStatusCompleted, jobResponse.JobStatus.Status.ToLower()); + Assert.AreEqual(users.Count, jobResponse.JobStatus.Total); + } } }