diff --git a/src/ZendeskApi_v2/Models/Organizations/GroupOrganizationExportResponse.cs b/src/ZendeskApi_v2/Models/Organizations/GroupOrganizationExportResponse.cs new file mode 100644 index 00000000..c744bed5 --- /dev/null +++ b/src/ZendeskApi_v2/Models/Organizations/GroupOrganizationExportResponse.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; + +namespace ZendeskApi_v2.Models.Organizations +{ + public class GroupOrganizationExportResponse + { + [JsonProperty("count")] + public long Count { get; set; } + + [JsonProperty("end_time")] + [JsonConverter(typeof(UnixDateTimeConverter))] + public DateTimeOffset EndTime { get; set; } + + [JsonProperty("next_page")] + public string NextPage { get; set; } + + [JsonProperty("organizations")] + public IList Organizations { get; set; } + } +} diff --git a/src/ZendeskApi_v2/Requests/Organizations.cs b/src/ZendeskApi_v2/Requests/Organizations.cs index 08e86758..3572111b 100644 --- a/src/ZendeskApi_v2/Requests/Organizations.cs +++ b/src/ZendeskApi_v2/Requests/Organizations.cs @@ -1,6 +1,7 @@ #if ASYNC using System.Threading.Tasks; #endif +using System; using System.Collections.Generic; using System.Linq; using ZendeskApi_v2.Extensions; @@ -40,6 +41,9 @@ public interface IOrganizations : ICore bool DeleteOrganizationMembership(long id, long userId); JobStatusResponse DestroyManyOrganizationMemberships(IEnumerable ids); GroupOrganizationMembershipResponse SetOrganizationMembershipAsDefault(long id, long userId); + + GroupOrganizationExportResponse GetIncrementalOrganizationExport(DateTimeOffset startTime); + GroupOrganizationExportResponse GetIncrementalOrganizationExportNextPage(string nextPage); #endif #if ASYNC @@ -72,11 +76,16 @@ public interface IOrganizations : ICore Task DeleteOrganizationMembershipAsync(long id, long userId); Task DestroyManyOrganizationMembershipsAsync(IEnumerable ids); Task SetOrganizationMembershipAsDefaultAsync(long id, long userId); + + Task GetIncrementalOrganizationExportAsync(DateTimeOffset startTime); + Task GetIncrementalOrganizationExportNextPageAsync(string nextPage); #endif } public class Organizations : Core, IOrganizations { + private const string _incremental_export = "incremental/organizations.json?start_time="; + public Organizations(string yourZendeskUrl, string user, string password, string apiToken, string p_OAuthToken) : base(yourZendeskUrl, user, password, apiToken, p_OAuthToken) { @@ -192,6 +201,17 @@ public GroupOrganizationMembershipResponse SetOrganizationMembershipAsDefault(lo return GenericPut($"users/{userId}/organization_memberships/{id}/make_default.json"); } + public GroupOrganizationExportResponse GetIncrementalOrganizationExport(DateTimeOffset startTime) + { + var resource = _incremental_export + startTime.UtcDateTime.GetEpoch(); + return GenericGet(resource); + } + + public GroupOrganizationExportResponse GetIncrementalOrganizationExportNextPage(string nextPage) + { + var resource = nextPage.Replace(ZendeskUrl, string.Empty); + return GenericGet(resource); + } #endif #if ASYNC @@ -303,6 +323,18 @@ public async Task SetOrganizationMembership { return await GenericPutAsync($"users/{userId}/organization_memberships/{id}/make_default.json"); } + + public async Task GetIncrementalOrganizationExportAsync(DateTimeOffset startTime) + { + var resource = _incremental_export + startTime.UtcDateTime.GetEpoch(); + return await GenericGetAsync(resource); + } + + public async Task GetIncrementalOrganizationExportNextPageAsync(string nextPage) + { + var resource = nextPage.Replace(ZendeskUrl, string.Empty); + return await GenericGetAsync(resource); + } #endif } } \ No newline at end of file diff --git a/test/ZendeskApi_v2.Test/OrganizationTests.cs b/test/ZendeskApi_v2.Test/OrganizationTests.cs index ec9210ee..e962b23e 100644 --- a/test/ZendeskApi_v2.Test/OrganizationTests.cs +++ b/test/ZendeskApi_v2.Test/OrganizationTests.cs @@ -1,3 +1,4 @@ +using System; using System.Collections.Generic; using System.Linq; using NUnit.Framework; @@ -199,5 +200,25 @@ public async Task CanSearchForOrganizationsAsync() var search = await api.Organizations.SearchForOrganizationsAsync(Settings.DefaultExternalId); Assert.Greater(search.Count, 0); } + + [Test] + public void CanGetIncrementalOrganizationExport() + { + var incrementalOrganizationExport = api.Organizations.GetIncrementalOrganizationExport(DateTimeOffset.MinValue); + Assert.That(incrementalOrganizationExport.Organizations.Count, Is.GreaterThan(0)); + + var incrementalOrganizationExportNextPage = api.Organizations.GetIncrementalOrganizationExportNextPage(incrementalOrganizationExport.NextPage); + Assert.That(incrementalOrganizationExportNextPage.Organizations.Count, Is.GreaterThan(0)); + } + + [Test] + public async Task CanGetIncrementalOrganizationExportAsync() + { + var incrementalOrganizationExport = await api.Organizations.GetIncrementalOrganizationExportAsync(DateTimeOffset.MinValue); + Assert.That(incrementalOrganizationExport.Organizations.Count, Is.GreaterThan(0)); + + var incrementalOrganizationExportNextPage = await api.Organizations.GetIncrementalOrganizationExportNextPageAsync(incrementalOrganizationExport.NextPage); + Assert.That(incrementalOrganizationExportNextPage.Organizations.Count, Is.GreaterThan(0)); + } } } \ No newline at end of file