From af6893835fd0d30065aed36d97bb336528c49496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Mrnu=C5=A1t=C3=ADk?= Date: Wed, 11 Sep 2024 13:25:38 +0200 Subject: [PATCH] EN-261 Add schedule publish and unpublish endpoint to Management API SDK --- .../ManagementClientTests/PublishingTests.cs | 40 +++++++++++++++++++ Kontent.Ai.Management/IManagementClient.cs | 7 ++++ .../ManagementClient.Publishing.cs | 12 ++++++ .../SchedulePublishAndUnpublishModel.cs | 36 +++++++++++++++++ .../Modules/UrlBuilder/EndpointUrlBuilder.cs | 6 +++ 5 files changed, 101 insertions(+) create mode 100644 Kontent.Ai.Management/Models/Publishing/SchedulePublishAndUnpublishModel.cs diff --git a/Kontent.Ai.Management.Tests/ManagementClientTests/PublishingTests.cs b/Kontent.Ai.Management.Tests/ManagementClientTests/PublishingTests.cs index a21f0558..d6559283 100644 --- a/Kontent.Ai.Management.Tests/ManagementClientTests/PublishingTests.cs +++ b/Kontent.Ai.Management.Tests/ManagementClientTests/PublishingTests.cs @@ -130,6 +130,46 @@ public async void SchedulePublishingOfLanguageVariantAsync_NoIdentifier_Throws() await client.Invoking(x => x.SchedulePublishingOfLanguageVariantAsync(null, schedule)).Should().ThrowAsync(); } + [Theory] + [ClassData(typeof(CombinationOfVariantIdentifiersAndUrl))] + public async void SchedulePublishingAndUnpublishingOfLanguageVariantAsync_SchedulesVariant(LanguageVariantIdentifier variantIdentifier, string expectedUrl) + { + var client = _scenario.CreateManagementClient(); + + var schedule = new SchedulePublishAndUnpublishModel() + { + PublishDisplayTimeZone = "prague", + PublishScheduledTo = DateTimeOffset.UtcNow, + UnpublishDisplayTimeZone = "prague", + UnpublishScheduledTo = DateTimeOffset.UtcNow.AddDays(10) + }; + + await client.SchedulePublishingAndUnpublishingOfLanguageVariantAsync(variantIdentifier, schedule); + + _scenario + .CreateExpectations() + .HttpMethod(HttpMethod.Put) + .RequestPayload(schedule) + .Url($"{expectedUrl}/schedule-publish-and-unpublish") + .Validate(); + } + + [Fact] + public async void SchedulePublishingAndUnpublishingOfLanguageVariantAsync_NoIdentifier_Throws() + { + var client = _scenario.CreateManagementClient(); + + var schedule = new SchedulePublishAndUnpublishModel() + { + PublishDisplayTimeZone = "prague", + PublishScheduledTo = DateTimeOffset.UtcNow, + UnpublishDisplayTimeZone = "prague", + UnpublishScheduledTo = DateTimeOffset.UtcNow.AddDays(10) + }; + + await client.Invoking(x => x.SchedulePublishingAndUnpublishingOfLanguageVariantAsync(null, schedule)).Should().ThrowAsync(); + } + [Fact] public async void SchedulePublishingOfLanguageVariantAsync_ScheduleModelIsNull_Throws() { diff --git a/Kontent.Ai.Management/IManagementClient.cs b/Kontent.Ai.Management/IManagementClient.cs index e2794a07..d733bb7c 100644 --- a/Kontent.Ai.Management/IManagementClient.cs +++ b/Kontent.Ai.Management/IManagementClient.cs @@ -607,6 +607,13 @@ public interface IManagementClient /// The time when the language variant will be unpublished Task ScheduleUnpublishingOfLanguageVariantAsync(LanguageVariantIdentifier identifier, ScheduleModel scheduleModel); + /// + /// Schedules publish and unpublish of language variant. + /// + /// The identifier of the language variant that should be scheduled. + /// The interval in which the variant should be published + Task SchedulePublishingAndUnpublishingOfLanguageVariantAsync(LanguageVariantIdentifier identifier, SchedulePublishAndUnpublishModel schedule); + /// /// Unpublishes the language variant. /// diff --git a/Kontent.Ai.Management/ManagementClient.Publishing.cs b/Kontent.Ai.Management/ManagementClient.Publishing.cs index be5c43ab..0275f232 100644 --- a/Kontent.Ai.Management/ManagementClient.Publishing.cs +++ b/Kontent.Ai.Management/ManagementClient.Publishing.cs @@ -44,6 +44,18 @@ public async Task SchedulePublishingOfLanguageVariantAsync(LanguageVariantIdenti await _actionInvoker.InvokeMethodAsync(endpointUrl, HttpMethod.Put, scheduleModel); } + + /// + public async Task SchedulePublishingAndUnpublishingOfLanguageVariantAsync(LanguageVariantIdentifier identifier, SchedulePublishAndUnpublishModel schedule) + { + ArgumentNullException.ThrowIfNull(identifier); + + ArgumentNullException.ThrowIfNull(schedule); + + var endpointUrl = _urlBuilder.BuildSchedulePublishAndUnpublishVariantUrl(identifier); + + await _actionInvoker.InvokeMethodAsync(endpointUrl, HttpMethod.Put, schedule); + } /// public async Task CancelPublishingOfLanguageVariantAsync(LanguageVariantIdentifier identifier) diff --git a/Kontent.Ai.Management/Models/Publishing/SchedulePublishAndUnpublishModel.cs b/Kontent.Ai.Management/Models/Publishing/SchedulePublishAndUnpublishModel.cs new file mode 100644 index 00000000..85cc4310 --- /dev/null +++ b/Kontent.Ai.Management/Models/Publishing/SchedulePublishAndUnpublishModel.cs @@ -0,0 +1,36 @@ +using Newtonsoft.Json; +using System; + +namespace Kontent.Ai.Management.Models.Publishing; + +/// +/// Represents the schedule interval model. +/// +public class SchedulePublishAndUnpublishModel +{ + /// + /// Gets or sets ISO-8601 formatted date-time for scheduled publishing. + /// If you do not provide this property, the publishing schedule won't be updated + /// + [JsonProperty(PropertyName = "publish_scheduled_to")] + public DateTimeOffset? PublishScheduledTo { get; set; } + + /// + /// IANA time zone name used to display time offset of the scheduled publish date in the UI. + /// + [JsonProperty(PropertyName = "publish_display_timezone")] + public string PublishDisplayTimeZone { get; set; } + + /// + /// Gets or sets ISO-8601 formatted date-time for scheduled unpublishing. + /// If you do not provide this property, the unpublishing schedule won't be updated + /// + [JsonProperty(PropertyName = "unpublish_scheduled_to")] + public DateTimeOffset? UnpublishScheduledTo { get; set; } + + /// + /// IANA time zone name used to display time offset of the scheduled publish date in the UI. + /// + [JsonProperty(PropertyName = "unpublish_display_timezone")] + public string UnpublishDisplayTimeZone { get; set; } +} \ No newline at end of file diff --git a/Kontent.Ai.Management/Modules/UrlBuilder/EndpointUrlBuilder.cs b/Kontent.Ai.Management/Modules/UrlBuilder/EndpointUrlBuilder.cs index d0f3aaaf..12a4cbae 100644 --- a/Kontent.Ai.Management/Modules/UrlBuilder/EndpointUrlBuilder.cs +++ b/Kontent.Ai.Management/Modules/UrlBuilder/EndpointUrlBuilder.cs @@ -137,6 +137,12 @@ public string BuildPublishVariantUrl(LanguageVariantIdentifier identifier) => Ge _variantTemplate.GetIdentifierUrlSegment(identifier.LanguageIdentifier), "/publish")); + public string BuildSchedulePublishAndUnpublishVariantUrl(LanguageVariantIdentifier identifier) => GetEnvironmentUrl( + string.Concat( + _itemTemplate.GetIdentifierUrlSegment(identifier.ItemIdentifier), + _variantTemplate.GetIdentifierUrlSegment(identifier.LanguageIdentifier), + "/schedule-publish-and-unpublish")); + public string BuildCancelPublishingVariantUrl(LanguageVariantIdentifier identifier) => GetEnvironmentUrl( string.Concat( _itemTemplate.GetIdentifierUrlSegment(identifier.ItemIdentifier),