diff --git a/Apps.Wordpress/Apps.Wordpress.csproj b/Apps.Wordpress/Apps.Wordpress.csproj index c0ee8eb..ac59494 100644 --- a/Apps.Wordpress/Apps.Wordpress.csproj +++ b/Apps.Wordpress/Apps.Wordpress.csproj @@ -9,7 +9,7 @@ Apps.Wordpress - + diff --git a/Apps.Wordpress/Events/Polling/Models/ContentPollingResult.cs b/Apps.Wordpress/Events/Polling/Models/ContentPollingResult.cs new file mode 100644 index 0000000..b7f1276 --- /dev/null +++ b/Apps.Wordpress/Events/Polling/Models/ContentPollingResult.cs @@ -0,0 +1,8 @@ +using Apps.Wordpress.Models.Entities; + +namespace Apps.Wordpress.Events.Polling.Models; + +public class ContentPollingResult +{ + public IEnumerable Items { get; set; } +} \ No newline at end of file diff --git a/Apps.Wordpress/Events/Polling/Models/Memory/ContentCreatedPollingMemory.cs b/Apps.Wordpress/Events/Polling/Models/Memory/ContentCreatedPollingMemory.cs new file mode 100644 index 0000000..bd04bad --- /dev/null +++ b/Apps.Wordpress/Events/Polling/Models/Memory/ContentCreatedPollingMemory.cs @@ -0,0 +1,6 @@ +namespace Apps.Wordpress.Events.Polling.Models.Memory; + +public class ContentCreatedPollingMemory +{ + public DateTime LastCreationDate { get; set; } +} \ No newline at end of file diff --git a/Apps.Wordpress/Events/Polling/Models/Memory/ContentUpdatedPollingMemory.cs b/Apps.Wordpress/Events/Polling/Models/Memory/ContentUpdatedPollingMemory.cs new file mode 100644 index 0000000..7b7024a --- /dev/null +++ b/Apps.Wordpress/Events/Polling/Models/Memory/ContentUpdatedPollingMemory.cs @@ -0,0 +1,6 @@ +namespace Apps.Wordpress.Events.Polling.Models.Memory; + +public class ContentUpdatedPollingMemory +{ + public DateTime LastModificationTime { get; set; } +} \ No newline at end of file diff --git a/Apps.Wordpress/Events/Polling/PollingList.cs b/Apps.Wordpress/Events/Polling/PollingList.cs new file mode 100644 index 0000000..a3a62b4 --- /dev/null +++ b/Apps.Wordpress/Events/Polling/PollingList.cs @@ -0,0 +1,164 @@ +using Apps.Wordpress.Api.RestSharp; +using Apps.Wordpress.Constants; +using Apps.Wordpress.DataSourceHandlers; +using Apps.Wordpress.Events.Polling.Models; +using Apps.Wordpress.Events.Polling.Models.Memory; +using Apps.Wordpress.Models.Dtos; +using Apps.Wordpress.Models.Entities; +using Blackbird.Applications.Sdk.Common; +using Blackbird.Applications.Sdk.Common.Dynamic; +using Blackbird.Applications.Sdk.Common.Invocation; +using Blackbird.Applications.Sdk.Common.Polling; +using Blackbird.Applications.Sdk.Utils.Extensions.String; +using RestSharp; + +namespace Apps.Wordpress.Events.Polling; + +[PollingEventList] +public class PollingList : BaseInvocable +{ + public PollingList(InvocationContext invocationContext) : base(invocationContext) + { + } + + [PollingEvent("On post created", "On a new post created")] + public Task> OnPostCreated( + PollingEventRequest request) + => PollContentCreation(request, new() + { + ["after"] = request.Memory?.LastCreationDate.ToString(Formats.ISO8601) ?? string.Empty + }, "posts", () => new() + { + LastCreationDate = DateTime.UtcNow + }); + + + [PollingEvent("On post updated", "On a specific post updated")] + public Task> OnPostUpdated( + PollingEventRequest request, + [PollingEventParameter] [Display("Post ID")] [DataSource(typeof(PostDataHandler))] + string? postId) + => PollContentChanges(request, postId, new() + { + ["modified_after"] = request.Memory?.LastModificationTime.ToString(Formats.ISO8601) ?? string.Empty + }, "posts", () => new() + { + LastModificationTime = DateTime.UtcNow + }); + + [PollingEvent("On page created", "On a new page created")] + public Task> OnPageCreated( + PollingEventRequest request) + => PollContentCreation(request, new() + { + ["after"] = request.Memory?.LastCreationDate.ToString(Formats.ISO8601) ?? string.Empty + }, "pages", () => new() + { + LastCreationDate = DateTime.UtcNow + }); + + + [PollingEvent("On page updated", "On a specific page updated")] + public Task> OnPageUpdated( + PollingEventRequest request, + [PollingEventParameter] [Display("Page ID")] [DataSource(typeof(PageDataHandler))] + string? pageId) + => PollContentChanges(request, pageId, new() + { + ["modified_after"] = request.Memory?.LastModificationTime.ToString(Formats.ISO8601) ?? string.Empty + }, "pages", () => new() + { + LastModificationTime = DateTime.UtcNow + }); + + private async Task> PollContentCreation( + PollingEventRequest request, Dictionary query, string endpoint, Func createMemory) + { + if (request.Memory is null) + { + return new() + { + FlyBird = false, + Memory = createMemory() + }; + } + + var items = await ListContentItems(endpoint.WithQuery(query)); + + if (!items.Any()) + { + return new() + { + FlyBird = false, + Memory = createMemory() + }; + } + + return new() + { + FlyBird = true, + Result = new() + { + Items = items.Select(x => new WordPressItem(x)).ToList() + }, + Memory = createMemory() + }; + } + + private async Task> PollContentChanges( + PollingEventRequest request, string? resourceId, Dictionary query, string endpoint, + Func createMemory) where T : ContentUpdatedPollingMemory + { + if (request.Memory is null) + { + return new() + { + FlyBird = false, + Memory = createMemory() + }; + } + + var items = string.IsNullOrWhiteSpace(resourceId) + ? await ListContentItems(endpoint.WithQuery(query)) + : await GetContentItem($"{endpoint}/{resourceId}", request.Memory); + + if (!items.Any()) + { + return new() + { + FlyBird = false, + Memory = createMemory() + }; + } + + return new() + { + FlyBird = true, + Result = new() + { + Items = items.Select(x => new WordPressItem(x)).ToList() + }, + Memory = createMemory() + }; + } + + private Task> ListContentItems(string endpoint) + { + var client = new WordpressRestClient(InvocationContext.AuthenticationCredentialsProviders); + var listRequest = + new WordpressRestRequest(endpoint, Method.Get, InvocationContext.AuthenticationCredentialsProviders); + + return client.Paginate(listRequest); + } + + private async Task> GetContentItem(string endpoint, ContentUpdatedPollingMemory memory) + { + var client = new WordpressRestClient(InvocationContext.AuthenticationCredentialsProviders); + var listRequest = + new WordpressRestRequest(endpoint, Method.Get, InvocationContext.AuthenticationCredentialsProviders); + + var item = await client.ExecuteWithHandling(listRequest); + + return item.ModifiedGmt > memory.LastModificationTime ? [item] : []; + } +} \ No newline at end of file diff --git a/Apps.Wordpress/Models/Requests/Post/PostRequest.cs b/Apps.Wordpress/Models/Requests/Post/PostRequest.cs index 4c4fe9a..2419e2a 100644 --- a/Apps.Wordpress/Models/Requests/Post/PostRequest.cs +++ b/Apps.Wordpress/Models/Requests/Post/PostRequest.cs @@ -6,7 +6,7 @@ namespace Apps.Wordpress.Models.Requests.Post { public class PostRequest { - [Display("Post")] + [Display("Post ID")] [DataSource(typeof(PostDataHandler))] public string Id { get; set; } }