diff --git a/src/Content/ContentRecordNormalizer.php b/src/Content/ContentRecordNormalizer.php new file mode 100644 index 0000000..af40a33 --- /dev/null +++ b/src/Content/ContentRecordNormalizer.php @@ -0,0 +1,68 @@ + $record Raw post record. + * @return array + */ + public function post( array $record ): array { + return array( + 'id' => (int) ( $record['id'] ?? 0 ), + 'post_type' => sanitize_text_field( (string) ( $record['post_type'] ?? 'post' ) ), + 'post_title' => sanitize_text_field( (string) ( $record['post_title'] ?? '' ) ), + 'post_content' => (string) ( $record['post_content'] ?? '' ), + 'post_excerpt' => sanitize_text_field( (string) ( $record['post_excerpt'] ?? '' ) ), + 'post_status' => sanitize_text_field( (string) ( $record['post_status'] ?? 'draft' ) ), + 'post_name' => sanitize_text_field( (string) ( $record['post_name'] ?? '' ) ), + 'post_parent' => (int) ( $record['post_parent'] ?? 0 ), + 'menu_order' => (int) ( $record['menu_order'] ?? 0 ), + 'meta' => $this->arrayValue( $record['meta'] ?? array() ), + ); + } + + /** + * @param array $record Raw term record. + * @return array + */ + public function term( array $record ): array { + return array( + 'id' => (int) ( $record['id'] ?? 0 ), + 'taxonomy' => sanitize_text_field( (string) ( $record['taxonomy'] ?? '' ) ), + 'name' => sanitize_text_field( (string) ( $record['name'] ?? '' ) ), + 'slug' => sanitize_text_field( (string) ( $record['slug'] ?? '' ) ), + 'description' => (string) ( $record['description'] ?? '' ), + 'parent' => (int) ( $record['parent'] ?? 0 ), + 'meta' => $this->arrayValue( $record['meta'] ?? array() ), + ); + } + + /** + * @param array $record Raw media record. + * @return array + */ + public function media( array $record ): array { + return array( + 'id' => (int) ( $record['id'] ?? 0 ), + 'post_title' => sanitize_text_field( (string) ( $record['post_title'] ?? '' ) ), + 'post_mime_type' => sanitize_text_field( (string) ( $record['post_mime_type'] ?? '' ) ), + 'source_url' => esc_url_raw( (string) ( $record['source_url'] ?? '' ) ), + 'metadata' => $this->arrayValue( $record['metadata'] ?? array() ), + 'meta' => $this->arrayValue( $record['meta'] ?? array() ), + ); + } + + /** + * @param mixed $value Value to normalize. + * @return array + */ + private function arrayValue( $value ): array { + return is_array( $value ) ? $value : array(); + } +} diff --git a/tests/Unit/Content/ContentRecordNormalizerTest.php b/tests/Unit/Content/ContentRecordNormalizerTest.php new file mode 100644 index 0000000..d7e6004 --- /dev/null +++ b/tests/Unit/Content/ContentRecordNormalizerTest.php @@ -0,0 +1,120 @@ +post( + array( + 'id' => '42', + 'post_type' => 'post', + 'post_title' => "Hello\nWorld", + 'post_content' => '

Keep HTML

', + 'post_excerpt' => 'Excerpt', + 'post_status' => 'publish', + 'post_name' => 'hello-world', + 'post_parent' => '7', + 'menu_order' => '3', + 'meta' => array( + '_source_url' => 'https://source.test/page', + ), + ) + ); + + self::assertSame( + array( + 'id' => 42, + 'post_type' => 'post', + 'post_title' => 'Hello World', + 'post_content' => '

Keep HTML

', + 'post_excerpt' => 'Excerpt', + 'post_status' => 'publish', + 'post_name' => 'hello-world', + 'post_parent' => 7, + 'menu_order' => 3, + 'meta' => array( + '_source_url' => 'https://source.test/page', + ), + ), + $record + ); + } + + public function test_it_normalizes_term_records(): void { + $normalizer = new ContentRecordNormalizer(); + + $record = $normalizer->term( + array( + 'id' => '9', + 'taxonomy' => 'category', + 'name' => "News\nUpdates", + 'slug' => 'news-updates', + 'description' => '

Keep description HTML

', + 'parent' => '2', + 'meta' => array( + 'landing_url' => 'https://source.test/news', + ), + ) + ); + + self::assertSame( + array( + 'id' => 9, + 'taxonomy' => 'category', + 'name' => 'News Updates', + 'slug' => 'news-updates', + 'description' => '

Keep description HTML

', + 'parent' => 2, + 'meta' => array( + 'landing_url' => 'https://source.test/news', + ), + ), + $record + ); + } + + public function test_it_normalizes_media_records(): void { + $normalizer = new ContentRecordNormalizer(); + + $record = $normalizer->media( + array( + 'id' => '12', + 'post_title' => "Hero\nImage", + 'post_mime_type' => 'image/jpeg', + 'source_url' => 'https://source.test/uploads/hero.jpg', + 'metadata' => array( + 'width' => 1200, + ), + 'meta' => array( + '_wp_attachment_image_alt' => 'Hero', + ), + ) + ); + + self::assertSame( + array( + 'id' => 12, + 'post_title' => 'Hero Image', + 'post_mime_type' => 'image/jpeg', + 'source_url' => 'https://source.test/uploads/hero.jpg', + 'metadata' => array( + 'width' => 1200, + ), + 'meta' => array( + '_wp_attachment_image_alt' => 'Hero', + ), + ), + $record + ); + } +}