From 5a28a68c29a34c1200b5202fb0ac2c0f1f421c24 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 11:06:34 +0400 Subject: [PATCH 1/8] change TransformersRegistry class to Transformers_Registry --- src/plugin/class-engine.php | 2 +- src/plugin/class-subjects-controller.php | 4 ++-- ...ansformersregistry.php => class-transformers-registry.php} | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/plugin/{class-transformersregistry.php => class-transformers-registry.php} (99%) diff --git a/src/plugin/class-engine.php b/src/plugin/class-engine.php index e8ae2d62..75359d61 100644 --- a/src/plugin/class-engine.php +++ b/src/plugin/class-engine.php @@ -9,7 +9,7 @@ class Engine { public function __construct() { require 'enum-subject-type.php'; - require 'class-transformersregistry.php'; + require 'class-transformers-registry.php'; require 'class-post-type-ui.php'; require 'class-transformer.php'; require 'class-subjects-controller.php'; diff --git a/src/plugin/class-subjects-controller.php b/src/plugin/class-subjects-controller.php index 636d9e25..a80084f9 100644 --- a/src/plugin/class-subjects-controller.php +++ b/src/plugin/class-subjects-controller.php @@ -292,7 +292,7 @@ public function create_item( $request ): WP_REST_Response|WP_Error { update_post_meta( $item['ID'], 'subject_type', $subject_type->value ); try { - TransformersRegistry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + Transformers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } @@ -322,7 +322,7 @@ public function update_item( $request ): WP_REST_Response|WP_Error { $subject_type = $this->get_subject_type( $request ); try { - TransformersRegistry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + Transformers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } diff --git a/src/plugin/class-transformersregistry.php b/src/plugin/class-transformers-registry.php similarity index 99% rename from src/plugin/class-transformersregistry.php rename to src/plugin/class-transformers-registry.php index e2c22471..49fe442d 100644 --- a/src/plugin/class-transformersregistry.php +++ b/src/plugin/class-transformers-registry.php @@ -5,7 +5,7 @@ use Exception; use InvalidArgumentException; -class TransformersRegistry { +class Transformers_Registry { private static string $user_choice_meta_key_prefix = '_data_liberation_chosen_handler_'; private static array $handlers = array(); From b29316c12e42c5880455675a076e8759f2921ad9 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 12:41:05 +0400 Subject: [PATCH 2/8] design the Ops class as per the desired interface for integration --- src/plugin/class-engine.php | 3 ++ src/plugin/class-ops.php | 65 +++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 src/plugin/class-ops.php diff --git a/src/plugin/class-engine.php b/src/plugin/class-engine.php index 75359d61..be88660c 100644 --- a/src/plugin/class-engine.php +++ b/src/plugin/class-engine.php @@ -17,6 +17,7 @@ public function __construct() { require 'class-schema.php'; require 'utils.php'; require 'class-subject.php'; + require 'class-ops.php'; ( function () { new Transformer(); @@ -26,6 +27,8 @@ public function __construct() { new Subjects_Controller( self::STORAGE_POST_TYPE ); new Storage( self::STORAGE_POST_TYPE ); + + Ops::init( self::STORAGE_POST_TYPE ); } )(); } } diff --git a/src/plugin/class-ops.php b/src/plugin/class-ops.php new file mode 100644 index 00000000..cd888a98 --- /dev/null +++ b/src/plugin/class-ops.php @@ -0,0 +1,65 @@ + static::$post_type, + 'post_status' => 'publish', + 'posts_per_page' => -1, + // @phpcs:ignore + 'meta_query' => array( + 'key' => 'subject_type', + 'value' => $subject_type->value, + 'compare' => '=', + ), + ); + $posts = get_posts( $args ); + + return array_map( + fn( WP_Post $post ) => Subject::from_post( $post->ID ), + $posts + ); + } +} From 8254fa4170f3ef6e59e410b674ecc9d8584733e6 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 12:47:17 +0400 Subject: [PATCH 3/8] rename Transformers_Registry to Handlers_Registry --- src/plugin/class-engine.php | 2 +- ...-transformers-registry.php => class-handlers-registry.php} | 2 +- src/plugin/class-subjects-controller.php | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename src/plugin/{class-transformers-registry.php => class-handlers-registry.php} (99%) diff --git a/src/plugin/class-engine.php b/src/plugin/class-engine.php index be88660c..898da322 100644 --- a/src/plugin/class-engine.php +++ b/src/plugin/class-engine.php @@ -9,7 +9,7 @@ class Engine { public function __construct() { require 'enum-subject-type.php'; - require 'class-transformers-registry.php'; + require 'class-handlers-registry.php'; require 'class-post-type-ui.php'; require 'class-transformer.php'; require 'class-subjects-controller.php'; diff --git a/src/plugin/class-transformers-registry.php b/src/plugin/class-handlers-registry.php similarity index 99% rename from src/plugin/class-transformers-registry.php rename to src/plugin/class-handlers-registry.php index 49fe442d..93742259 100644 --- a/src/plugin/class-transformers-registry.php +++ b/src/plugin/class-handlers-registry.php @@ -5,7 +5,7 @@ use Exception; use InvalidArgumentException; -class Transformers_Registry { +class Handlers_Registry { private static string $user_choice_meta_key_prefix = '_data_liberation_chosen_handler_'; private static array $handlers = array(); diff --git a/src/plugin/class-subjects-controller.php b/src/plugin/class-subjects-controller.php index a80084f9..7b3f85cf 100644 --- a/src/plugin/class-subjects-controller.php +++ b/src/plugin/class-subjects-controller.php @@ -292,7 +292,7 @@ public function create_item( $request ): WP_REST_Response|WP_Error { update_post_meta( $item['ID'], 'subject_type', $subject_type->value ); try { - Transformers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + Handlers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } @@ -322,7 +322,7 @@ public function update_item( $request ): WP_REST_Response|WP_Error { $subject_type = $this->get_subject_type( $request ); try { - Transformers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + Handlers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } From dfc2928e80744e9b20ac8e90c10640ca0ab55320 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 12:47:30 +0400 Subject: [PATCH 4/8] add Observers_Registry class --- src/plugin/class-observers-registry.php | 77 +++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/plugin/class-observers-registry.php diff --git a/src/plugin/class-observers-registry.php b/src/plugin/class-observers-registry.php new file mode 100644 index 00000000..bacbb310 --- /dev/null +++ b/src/plugin/class-observers-registry.php @@ -0,0 +1,77 @@ +value ] ) ) { + self::$observers[ $type->value ] = array(); + } + + self::$observers[ $type->value ][ $identifier['slug'] ] = array( + 'slug' => $identifier['slug'], + 'description' => $identifier['description'], + 'observer' => $observer, + ); + } + + /** + * Check if observers exist for a type + * + * @param SubjectType $type The subject type to check for. + * @return bool True if observers exist + */ + public static function has( SubjectType $type ): bool { + return isset( self::$observers[ $type->value ] ) && ! empty( self::$observers[ $type->value ] ); + } + + /** + * Execute all observers for a type + * + * @param SubjectType $type The subject type to handle. + * @param Subject $subject Data to pass to observers. + * @return void + */ + public static function observe( SubjectType $type, Subject $subject ): void { + if ( ! self::has( $type ) ) { + return; + } + foreach ( self::$observers[ $type->value ] as $registered_observer ) { + $registered_observer['observer']( $subject ); + } + } + + /** + * Remove all observers for a type + * + * @param SubjectType $type The type to clear observers for. + * @return void + */ + public static function clear( SubjectType $type ): void { + if ( isset( self::$observers[ $type->value ] ) ) { + unset( self::$observers[ $type->value ] ); + } + } +} From c74f353d7752a48a76c93533b4ad0b4562285a34 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 12:47:58 +0400 Subject: [PATCH 5/8] remove clear method from both Handlers and Observers registry --- src/plugin/class-handlers-registry.php | 12 ------------ src/plugin/class-observers-registry.php | 12 ------------ 2 files changed, 24 deletions(-) diff --git a/src/plugin/class-handlers-registry.php b/src/plugin/class-handlers-registry.php index 93742259..6c51c8bc 100644 --- a/src/plugin/class-handlers-registry.php +++ b/src/plugin/class-handlers-registry.php @@ -90,18 +90,6 @@ public static function handle( SubjectType $type, Subject $subject ): void { } } - /** - * Remove all handlers for a type - * - * @param SubjectType $type The type to clear handlers for. - * @return void - */ - public static function clear( SubjectType $type ): void { - if ( isset( self::$handlers[ $type->value ] ) ) { - unset( self::$handlers[ $type->value ] ); - } - } - /** * Set user choice for what transformer to run for a subject type when multiples are registered * diff --git a/src/plugin/class-observers-registry.php b/src/plugin/class-observers-registry.php index bacbb310..38cdddc4 100644 --- a/src/plugin/class-observers-registry.php +++ b/src/plugin/class-observers-registry.php @@ -62,16 +62,4 @@ public static function observe( SubjectType $type, Subject $subject ): void { $registered_observer['observer']( $subject ); } } - - /** - * Remove all observers for a type - * - * @param SubjectType $type The type to clear observers for. - * @return void - */ - public static function clear( SubjectType $type ): void { - if ( isset( self::$observers[ $type->value ] ) ) { - unset( self::$observers[ $type->value ] ); - } - } } From c06eeee33afcbe8a7c8c772a33043a8385fc0239 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 12:52:47 +0400 Subject: [PATCH 6/8] announce subject to Observers registry before Handlers registry --- src/plugin/class-subjects-controller.php | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/plugin/class-subjects-controller.php b/src/plugin/class-subjects-controller.php index 7b3f85cf..4f144b6c 100644 --- a/src/plugin/class-subjects-controller.php +++ b/src/plugin/class-subjects-controller.php @@ -292,7 +292,7 @@ public function create_item( $request ): WP_REST_Response|WP_Error { update_post_meta( $item['ID'], 'subject_type', $subject_type->value ); try { - Handlers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + $this->announce_subject( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } @@ -322,7 +322,7 @@ public function update_item( $request ): WP_REST_Response|WP_Error { $subject_type = $this->get_subject_type( $request ); try { - Handlers_Registry::handle( $subject_type, Subject::from_post( $item['ID'] ) ); + $this->announce_subject( $subject_type, Subject::from_post( $item['ID'] ) ); } catch ( Exception $e ) { return new WP_Error( $e->getCode(), $e->getMessage() ); } @@ -465,4 +465,16 @@ private function get_subject_type( $request ): SubjectType { preg_match( '/\/subjects\/([^\/]+)/', $request->get_route(), $matches ); return SubjectType::tryFrom( $matches[1] ); } + + /** + * Announce subject to Observers_Registry & Handlers_Registry + * + * @param SubjectType $subject_type Type of subject to announce. + * @param Subject $subject Subject instance to announce. + * @throws Exception Handlers_Registry::handle can throw an exception. + */ + private function announce_subject( SubjectType $subject_type, Subject $subject ): void { + Observers_Registry::observe( $subject_type, $subject ); + Handlers_Registry::handle( $subject_type, $subject ); + } } From 04a090225fe1e11f50050f57def10421c33211c7 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 13:18:09 +0400 Subject: [PATCH 7/8] have our transformers also use Ops class --- src/plugin/class-transformer.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugin/class-transformer.php b/src/plugin/class-transformer.php index 22a8ac80..81f9ae82 100644 --- a/src/plugin/class-transformer.php +++ b/src/plugin/class-transformer.php @@ -7,7 +7,7 @@ class Transformer { public const string META_KEY_LIBERATED_OUTPUT = '_data_liberation_output'; public function __construct() { - TransformersRegistry::add( + Ops::handle( SubjectType::BLOGPOST, array( 'slug' => 'try_wordpress', @@ -19,7 +19,7 @@ public function __construct() { ) ); - TransformersRegistry::add( + Ops::handle( SubjectType::PAGE, array( 'slug' => 'try_wordpress', From af1ebce4730401d3c8c3aaed12671584ff272346 Mon Sep 17 00:00:00 2001 From: ashfame Date: Fri, 27 Dec 2024 13:27:27 +0400 Subject: [PATCH 8/8] load observers registry + reorder require calls --- src/plugin/class-engine.php | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/plugin/class-engine.php b/src/plugin/class-engine.php index 898da322..a88e6840 100644 --- a/src/plugin/class-engine.php +++ b/src/plugin/class-engine.php @@ -8,17 +8,22 @@ class Engine { public function __construct() { require 'enum-subject-type.php'; + require 'class-subject.php'; + require 'class-schema.php'; require 'class-handlers-registry.php'; - require 'class-post-type-ui.php'; - require 'class-transformer.php'; + require 'class-observers-registry.php'; + require 'class-subjects-controller.php'; + require 'class-storage.php'; - require 'class-schema.php'; - require 'utils.php'; - require 'class-subject.php'; + + require 'class-post-type-ui.php'; + require 'class-transformer.php'; require 'class-ops.php'; + require 'utils.php'; + ( function () { new Transformer(); new Post_Type_UI( self::STORAGE_POST_TYPE );