From 4dd2d8f7d92769f0aaec01b50223b26cd7280fb1 Mon Sep 17 00:00:00 2001
From: Patrick Kenny <33362-ptmkenny@users.noreply.drupalcode.org>
Date: Sat, 7 Dec 2024 06:07:56 +0000
Subject: [PATCH] Issue #3483948 by ptmkenny, bbrala: Add support for
 attributes

---
 src/Attribute/ResourceFieldEnhancer.php       | 36 +++++++++++++++++++
 src/Plugin/ResourceFieldEnhancerManager.php   |  9 +++--
 .../FieldEnhancer/DateTimeEnhancer.php        | 15 ++++----
 .../DateTimeFromStringEnhancer.php            | 15 ++++----
 .../FieldEnhancer/JSONFieldEnhancer.php       | 13 +++----
 .../FieldEnhancer/ListFieldEnhancer.php       | 13 +++----
 .../FieldEnhancer/SingleNestedEnhancer.php    | 13 +++----
 .../jsonapi/FieldEnhancer/UrlLinkEnhancer.php | 13 +++----
 .../FieldEnhancer/UuidLinkEnhancer.php        | 13 +++----
 9 files changed, 94 insertions(+), 46 deletions(-)
 create mode 100644 src/Attribute/ResourceFieldEnhancer.php

diff --git a/src/Attribute/ResourceFieldEnhancer.php b/src/Attribute/ResourceFieldEnhancer.php
new file mode 100644
index 0000000..f409d52
--- /dev/null
+++ b/src/Attribute/ResourceFieldEnhancer.php
@@ -0,0 +1,36 @@
+<?php
+
+namespace Drupal\jsonapi_extras\Attribute;
+
+use Drupal\Component\Plugin\Attribute\Plugin;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+
+/**
+ * Defines a Plugin annotation object for resource field enhancers.
+ *
+ * @see \Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerInterface
+ */
+#[\Attribute(\Attribute::TARGET_CLASS)]
+class ResourceFieldEnhancer extends Plugin {
+
+  /**
+   * Constructs a ResourceFieldEnhancer attribute.
+   *
+   * @param string $id
+   *   The plugin ID.
+   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $label
+   *   The human-readable name of the formatter type.
+   * @param \Drupal\Core\StringTranslation\TranslatableMarkup $description
+   *   A short description of the formatter type.
+   * @param array $dependencies
+   *   The name of modules that are required for this Field Enhancer to be usable.
+   */
+  public function __construct(
+    public readonly string $id,
+    public readonly TranslatableMarkup $label,
+    public readonly TranslatableMarkup $description,
+    public readonly array $dependencies = [],
+  ) {
+  }
+
+}
diff --git a/src/Plugin/ResourceFieldEnhancerManager.php b/src/Plugin/ResourceFieldEnhancerManager.php
index 4123d17..0630570 100644
--- a/src/Plugin/ResourceFieldEnhancerManager.php
+++ b/src/Plugin/ResourceFieldEnhancerManager.php
@@ -22,13 +22,18 @@ class ResourceFieldEnhancerManager extends DefaultPluginManager {
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
    *   The module handler to invoke the alter hook with.
    */
-  public function __construct(\Traversable $namespaces, CacheBackendInterface $cache_backend, ModuleHandlerInterface $module_handler) {
+  public function __construct(
+    \Traversable $namespaces,
+    CacheBackendInterface $cache_backend,
+    ModuleHandlerInterface $module_handler,
+  ) {
     parent::__construct(
       'Plugin/jsonapi/FieldEnhancer',
       $namespaces,
       $module_handler,
       'Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerInterface',
-      'Drupal\jsonapi_extras\Annotation\ResourceFieldEnhancer'
+      'Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer',
+      'Drupal\jsonapi_extras\Annotation\ResourceFieldEnhancer',
     );
 
     $this->alterInfo('resource_field_enhancer_info');
diff --git a/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
index 26382d0..9aa2099 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/DateTimeEnhancer.php
@@ -3,19 +3,20 @@
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Core\Datetime\DrupalDateTime;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\DateTimeEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to timestamp fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "date_time",
- *   label = @Translation("Date Time (Timestamp field)"),
- *   description = @Translation("Formats a date based the configured date format for timestamp fields."),
- *   dependencies = {"datetime"}
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'date_time',
+  label: new TranslatableMarkup('Date Time (Timestamp field)'),
+  description: new TranslatableMarkup('Formats a date based the configured date format for timestamp fields.'),
+  dependencies: ['datetime'],
+)]
 class DateTimeEnhancer extends DateTimeEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
index 4c4f3b4..c48d4b2 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/DateTimeFromStringEnhancer.php
@@ -2,20 +2,21 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\datetime\Plugin\Field\FieldType\DateTimeItemInterface;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\DateTimeEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to datetime fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "date_time_from_string",
- *   label = @Translation("Date Time (Date Time field)"),
- *   description = @Translation("Formats a date based the configured date format for date fields."),
- *   dependencies = {"datetime"}
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'date_time_from_string',
+  label: new TranslatableMarkup('Date Time (Date Time field)'),
+  description: new TranslatableMarkup('Formats a date based the configured date format for date fields.'),
+  dependencies: ['datetime'],
+)]
 class DateTimeFromStringEnhancer extends DateTimeEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
index 327ffcc..05c6c2a 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/JSONFieldEnhancer.php
@@ -4,19 +4,20 @@ namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Component\Serialization\Json;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Perform additional manipulations to JSON fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "json",
- *   label = @Translation("JSON Field"),
- *   description = @Translation("Render JSON Field has real json")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'json',
+  label: new TranslatableMarkup('JSON Field'),
+  description: new TranslatableMarkup('Render JSON Field has real json'),
+)]
 class JSONFieldEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
index 4db9844..acc6ca2 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/ListFieldEnhancer.php
@@ -2,19 +2,20 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Drupal\options\Plugin\Field\FieldType\ListItemBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to list fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "list",
- *   label = @Translation("List Field"),
- *   description = @Translation("Formats a list field based on labels and values.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'list',
+  label: new TranslatableMarkup('List Field'),
+  description: new TranslatableMarkup('Formats a list field based on labels and values.'),
+)]
 class ListFieldEnhancer extends ResourceFieldEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
index c712bf5..16f83d3 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/SingleNestedEnhancer.php
@@ -2,18 +2,19 @@
 
 namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 
 /**
  * Perform additional manipulations to date fields.
- *
- * @ResourceFieldEnhancer(
- *   id = "nested",
- *   label = @Translation("Single Nested Property"),
- *   description = @Translation("Extracts or wraps nested properties from an object.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'nested',
+  label: new TranslatableMarkup('Single Nested Property'),
+  description: new TranslatableMarkup('Extracts or wraps nested properties from an object.'),
+)]
 class SingleNestedEnhancer extends ResourceFieldEnhancerBase {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
index 9566d57..03be283 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/UrlLinkEnhancer.php
@@ -6,7 +6,9 @@ use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Language\LanguageManagerInterface;
 use Drupal\Core\Logger\LoggerChannelFactoryInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
 use Drupal\Core\Url;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Drupal\serialization\Normalizer\CacheableNormalizerInterface;
 use Shaper\Util\Context;
@@ -14,13 +16,12 @@ use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Add URL aliases to links.
- *
- * @ResourceFieldEnhancer(
- *   id = "url_link",
- *   label = @Translation("URL for link (link field only)"),
- *   description = @Translation("Use Url for link fields.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'url_link',
+  label: new TranslatableMarkup('URL for link (link field only)'),
+  description: new TranslatableMarkup('Use Url for link fields.'),
+)]
 class UrlLinkEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**
diff --git a/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
index 5c0383c..bd366f6 100644
--- a/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
+++ b/src/Plugin/jsonapi/FieldEnhancer/UuidLinkEnhancer.php
@@ -4,19 +4,20 @@ namespace Drupal\jsonapi_extras\Plugin\jsonapi\FieldEnhancer;
 
 use Drupal\Core\Entity\EntityTypeManagerInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\jsonapi_extras\Attribute\ResourceFieldEnhancer;
 use Drupal\jsonapi_extras\Plugin\ResourceFieldEnhancerBase;
 use Shaper\Util\Context;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
  * Use UUID for internal link field value.
- *
- * @ResourceFieldEnhancer(
- *   id = "uuid_link",
- *   label = @Translation("UUID for link (link field only)"),
- *   description = @Translation("Use UUID for internal link field.")
- * )
  */
+#[ResourceFieldEnhancer(
+  id: 'uuid_link',
+  label: new TranslatableMarkup('UUID for link (link field only)'),
+  description: new TranslatableMarkup('Use UUID for internal link field.'),
+)]
 class UuidLinkEnhancer extends ResourceFieldEnhancerBase implements ContainerFactoryPluginInterface {
 
   /**
-- 
GitLab