From 4de8042c35d12be53af739f02e26848b9d7f9607 Mon Sep 17 00:00:00 2001
From: bZverok <137277669+bZverok@users.noreply.github.com>
Date: Tue, 11 Jun 2024 19:37:54 +0300
Subject: [PATCH] added polling events
---
Apps.Wordpress/Apps.Wordpress.csproj | 2 +-
.../Polling/Models/ContentPollingResult.cs | 8 +
.../Memory/ContentCreatedPollingMemory.cs | 6 +
.../Memory/ContentUpdatedPollingMemory.cs | 6 +
Apps.Wordpress/Events/Polling/PollingList.cs | 164 ++++++++++++++++++
.../Models/Requests/Post/PostRequest.cs | 2 +-
6 files changed, 186 insertions(+), 2 deletions(-)
create mode 100644 Apps.Wordpress/Events/Polling/Models/ContentPollingResult.cs
create mode 100644 Apps.Wordpress/Events/Polling/Models/Memory/ContentCreatedPollingMemory.cs
create mode 100644 Apps.Wordpress/Events/Polling/Models/Memory/ContentUpdatedPollingMemory.cs
create mode 100644 Apps.Wordpress/Events/Polling/PollingList.cs
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; }
}