From 22a96030b5808fe4867fdaddd68a846fa7239e65 Mon Sep 17 00:00:00 2001 From: Remon van de Kamp Date: Sun, 9 Oct 2022 19:06:32 +0200 Subject: [PATCH] Use WP table prefix in User capabilities field mapping --- .../Repository/AbstractEntityRepository.php | 28 +++++++++++++------ .../Repository/AttachmentRepository.php | 6 ++++ src/Bridge/Repository/PageRepository.php | 6 ++++ src/Bridge/Repository/PostRepository.php | 6 ++++ src/Bridge/Repository/ProductRepository.php | 6 ++++ src/Bridge/Repository/ShopOrderRepository.php | 6 ++++ src/Bridge/Repository/UserRepository.php | 15 ++++++++++ .../Bridge/Repository/UserRepositoryTest.php | 17 +++++++++++ 8 files changed, 82 insertions(+), 8 deletions(-) diff --git a/src/Bridge/Repository/AbstractEntityRepository.php b/src/Bridge/Repository/AbstractEntityRepository.php index 485fa84..971a211 100644 --- a/src/Bridge/Repository/AbstractEntityRepository.php +++ b/src/Bridge/Repository/AbstractEntityRepository.php @@ -28,11 +28,15 @@ use function Williarin\WordpressInterop\Util\String\property_to_field; use function Williarin\WordpressInterop\Util\String\select_from_eav; +/** + * @method getMappedFields(): array + */ abstract class AbstractEntityRepository implements EntityRepositoryInterface { use FindByTrait; use EntityPropertiesTrait; + /** @deprecated Implement getMappedFields() method instead */ protected const MAPPED_FIELDS = []; protected const TABLE_NAME = 'posts'; protected const TABLE_META_NAME = 'postmeta'; @@ -216,10 +220,14 @@ public function persist(mixed $entity): void public function getMappedMetaKey(string $fieldName, string $entityClassName = null): string { - $mappedFields = $entityClassName ? (new \ReflectionClassConstant( - $this->entityManager->getRepository($entityClassName), - 'MAPPED_FIELDS', - ))->getValue() : static::MAPPED_FIELDS; + $targetClass = $entityClassName ? $this->entityManager->getRepository($entityClassName) : $this; + + if (method_exists($targetClass, 'getMappedFields')) { + $mappedFields = $targetClass->getMappedFields(); + } else { + // BC layer, to be removed when MAPPED_FIELDS constant is removed + $mappedFields = (new \ReflectionClassConstant($targetClass, 'MAPPED_FIELDS',))->getValue(); + } if ( !is_array($mappedFields) @@ -240,10 +248,14 @@ public function getMappedMetaKey(string $fieldName, string $entityClassName = nu public function isFieldMapped(string $fieldName, string $entityClassName = null): bool { - $mappedFields = $entityClassName ? (new \ReflectionClassConstant( - $this->entityManager->getRepository($entityClassName), - 'MAPPED_FIELDS', - ))->getValue() : static::MAPPED_FIELDS; + $targetClass = $entityClassName ? $this->entityManager->getRepository($entityClassName) : $this; + + if (method_exists($targetClass, 'getMappedFields')) { + $mappedFields = $targetClass->getMappedFields(); + } else { + // BC layer, to be removed when MAPPED_FIELDS constant is removed + $mappedFields = (new \ReflectionClassConstant($targetClass, 'MAPPED_FIELDS',))->getValue(); + } if ( !is_array($mappedFields) diff --git a/src/Bridge/Repository/AttachmentRepository.php b/src/Bridge/Repository/AttachmentRepository.php index b63c192..cf5ad06 100644 --- a/src/Bridge/Repository/AttachmentRepository.php +++ b/src/Bridge/Repository/AttachmentRepository.php @@ -59,6 +59,7 @@ */ class AttachmentRepository extends AbstractEntityRepository { + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = [ '_wp_attached_file' => 'attached_file', '_wp_attachment_metadata' => 'attachment_metadata', @@ -78,4 +79,9 @@ protected function getPostType(): string { return 'attachment'; } + + protected function getMappedFields(): array + { + return self::MAPPED_FIELDS; + } } diff --git a/src/Bridge/Repository/PageRepository.php b/src/Bridge/Repository/PageRepository.php index ca1f057..8f9d219 100644 --- a/src/Bridge/Repository/PageRepository.php +++ b/src/Bridge/Repository/PageRepository.php @@ -56,6 +56,7 @@ */ class PageRepository extends AbstractEntityRepository { + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = ['thumbnail_id']; public function __construct() @@ -67,4 +68,9 @@ protected function getPostType(): string { return 'page'; } + + protected function getMappedFields(): array + { + return self::MAPPED_FIELDS; + } } diff --git a/src/Bridge/Repository/PostRepository.php b/src/Bridge/Repository/PostRepository.php index dbfc482..30b0d1b 100644 --- a/src/Bridge/Repository/PostRepository.php +++ b/src/Bridge/Repository/PostRepository.php @@ -56,10 +56,16 @@ */ class PostRepository extends AbstractEntityRepository { + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = ['thumbnail_id']; public function __construct() { parent::__construct(Post::class); } + + protected function getMappedFields(): array + { + return self::MAPPED_FIELDS; + } } diff --git a/src/Bridge/Repository/ProductRepository.php b/src/Bridge/Repository/ProductRepository.php index 6c9102e..3d6fbf5 100644 --- a/src/Bridge/Repository/ProductRepository.php +++ b/src/Bridge/Repository/ProductRepository.php @@ -109,6 +109,7 @@ */ class ProductRepository extends AbstractEntityRepository { + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = [ 'sku', 'sale_price_dates_from', @@ -155,4 +156,9 @@ protected function getPostType(): string { return 'product'; } + + protected function getMappedFields(): array + { + return self::MAPPED_FIELDS; + } } diff --git a/src/Bridge/Repository/ShopOrderRepository.php b/src/Bridge/Repository/ShopOrderRepository.php index 23f5fd1..a10eb6d 100644 --- a/src/Bridge/Repository/ShopOrderRepository.php +++ b/src/Bridge/Repository/ShopOrderRepository.php @@ -55,6 +55,7 @@ */ class ShopOrderRepository extends AbstractEntityRepository { + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = [ 'payment_method', 'billing_email', @@ -94,4 +95,9 @@ public function getPostType(): string { return 'shop_order'; } + + protected function getMappedFields(): array + { + return self::MAPPED_FIELDS; + } } diff --git a/src/Bridge/Repository/UserRepository.php b/src/Bridge/Repository/UserRepository.php index 075c3b0..61ad59b 100644 --- a/src/Bridge/Repository/UserRepository.php +++ b/src/Bridge/Repository/UserRepository.php @@ -40,6 +40,7 @@ class UserRepository extends AbstractEntityRepository protected const TABLE_META_IDENTIFIER = 'user_id'; protected const FALLBACK_ENTITY = User::class; + /** @deprecated Left for BC reasons only, use getMappedFields instead */ protected const MAPPED_FIELDS = [ 'billing_address_1' => 'billing_address_1', 'billing_address_2' => 'billing_address_2', @@ -53,4 +54,18 @@ public function __construct() { parent::__construct(User::class); } + + protected function getMappedFields(): array + { + $capabilitiesKey = sprintf('%scapabilities', $this->entityManager->getTablesPrefix()); + + return [ + 'billing_address_1' => 'billing_address_1', + 'billing_address_2' => 'billing_address_2', + 'shipping_address_1' => 'shipping_address_1', + 'shipping_address_2' => 'shipping_address_2', + $capabilitiesKey => 'capabilities', + 'wp_last_active' => 'last_active', + ]; + } } diff --git a/test/Test/Bridge/Repository/UserRepositoryTest.php b/test/Test/Bridge/Repository/UserRepositoryTest.php index 9d43505..ac2a065 100644 --- a/test/Test/Bridge/Repository/UserRepositoryTest.php +++ b/test/Test/Bridge/Repository/UserRepositoryTest.php @@ -6,6 +6,7 @@ use Williarin\WordpressInterop\Bridge\Entity\User; use Williarin\WordpressInterop\Bridge\Repository\UserRepository; +use Williarin\WordpressInterop\EntityManager; use Williarin\WordpressInterop\Exception\EntityNotFoundException; use Williarin\WordpressInterop\Test\TestCase; @@ -100,4 +101,20 @@ public function testFindOneByEavAttribute(): void $user = $this->repository->findOneByShippingState('North Dakota'); self::assertSame(4, $user->id); } + + public function testFieldMapping(): void + { + $repository = new UserRepository(); + $repository->setEntityManager(new class extends EntityManager { + public function __construct() {} + public function getTablesPrefix(): string { return 'foo_'; } + }); + + $this->assertEquals('billing_address_1', $repository->getMappedMetaKey('billing_address_1')); + $this->assertEquals('billing_address_2', $repository->getMappedMetaKey('billing_address_2')); + $this->assertEquals('shipping_address_1', $repository->getMappedMetaKey('shipping_address_1')); + $this->assertEquals('shipping_address_2', $repository->getMappedMetaKey('shipping_address_2')); + $this->assertEquals('foo_capabilities', $repository->getMappedMetaKey('capabilities')); + $this->assertEquals('wp_last_active', $repository->getMappedMetaKey('last_active')); + } }