From c459612ecc47e48b347159a6715df1e61fa100f6 Mon Sep 17 00:00:00 2001
From: Bartek Wajda <bartlomiej.wajda@ibexa.co>
Date: Mon, 2 Oct 2023 14:30:02 +0200
Subject: [PATCH 1/3] IBX-6644: Gracefully handle broken custom URL aliases

---
 src/bundle/Resources/config/services.yaml     |  2 ++
 .../translations/content_url.en.xliff         |  4 +--
 src/lib/UI/Dataset/CustomUrlsDataset.php      | 28 +++++++++++++++++--
 src/lib/UI/Dataset/DatasetFactory.php         | 14 ++++++++--
 4 files changed, 41 insertions(+), 7 deletions(-)

diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml
index 0a6797521d..5b5238cd36 100644
--- a/src/bundle/Resources/config/services.yaml
+++ b/src/bundle/Resources/config/services.yaml
@@ -59,6 +59,8 @@ services:
         lazy: true
         arguments:
             $configResolver: '@ezpublish.config.resolver'
+        calls:
+            - [setLogger, ['@?logger']]
 
     EzSystems\EzPlatformAdminUi\UI\Service\:
         resource: '../../../lib/UI/Service'
diff --git a/src/bundle/Resources/translations/content_url.en.xliff b/src/bundle/Resources/translations/content_url.en.xliff
index 961e9bff8c..54e7a0d708 100644
--- a/src/bundle/Resources/translations/content_url.en.xliff
+++ b/src/bundle/Resources/translations/content_url.en.xliff
@@ -102,8 +102,8 @@
         <note>key: tab.urls.modal_close</note>
       </trans-unit>
       <trans-unit id="56d218db883ed4cc59dbbca53364dc2e725013e4" resname="tab.urls.no_custom_urls">
-        <source>This Content item has no custom URL aliases.</source>
-        <target state="new">This Content item has no custom URL aliases.</target>
+        <source>This Content item has no custom URL aliases or they are broken.</source>
+        <target state="new">This Content item has no custom URL aliases or they are broken.</target>
         <note>key: tab.urls.no_custom_urls</note>
       </trans-unit>
       <trans-unit id="c9fdd1434b44a4592626e8fe493c19141aab24d5" resname="tab.urls.no_system_urls">
diff --git a/src/lib/UI/Dataset/CustomUrlsDataset.php b/src/lib/UI/Dataset/CustomUrlsDataset.php
index 48543bab8f..0a707d9f91 100644
--- a/src/lib/UI/Dataset/CustomUrlsDataset.php
+++ b/src/lib/UI/Dataset/CustomUrlsDataset.php
@@ -8,10 +8,12 @@
 
 namespace EzSystems\EzPlatformAdminUi\UI\Dataset;
 
+use eZ\Publish\API\Repository\Exceptions\BadStateException;
 use eZ\Publish\API\Repository\URLAliasService;
 use eZ\Publish\API\Repository\Values\Content\Location;
 use eZ\Publish\API\Repository\Values\Content\URLAlias;
 use EzSystems\EzPlatformAdminUi\UI\Value\ValueFactory;
+use Psr\Log\LoggerInterface;
 
 class CustomUrlsDataset
 {
@@ -24,16 +26,21 @@ class CustomUrlsDataset
     /** @var \EzSystems\EzPlatformAdminUi\UI\Value\Content\UrlAlias[] */
     private $data;
 
+    /** @var \Psr\Log\LoggerInterface */
+    private $logger;
+
     /**
      * @param \eZ\Publish\API\Repository\URLAliasService $urlAliasService
      * @param \EzSystems\EzPlatformAdminUi\UI\Value\ValueFactory $valueFactory
      */
     public function __construct(
         URLAliasService $urlAliasService,
-        ValueFactory $valueFactory
+        ValueFactory $valueFactory,
+        LoggerInterface $logger
     ) {
         $this->urlAliasService = $urlAliasService;
         $this->valueFactory = $valueFactory;
+        $this->logger = $logger;
     }
 
     /**
@@ -43,7 +50,24 @@ public function __construct(
      */
     public function load(Location $location): self
     {
-        $customUrlAliases = $this->urlAliasService->listLocationAliases($location, true, null, true);
+        try {
+            $customUrlAliases = $this->urlAliasService->listLocationAliases(
+                $location,
+                true,
+                null,
+                true
+            );
+        } catch (BadStateException $e) {
+            $this->logger->warning(
+                sprintf(
+                    'At least one custom alias belonging to location %d is broken. Fix it by using the ezplatform:urls:regenerate-aliases command.',
+                    $location->id
+                ),
+                [$e->getMessage()]
+            );
+            $customUrlAliases = [];
+        }
+
         $this->data = array_map(
             function (URLAlias $urlAlias) {
                 return $this->valueFactory->createUrlAlias($urlAlias);
diff --git a/src/lib/UI/Dataset/DatasetFactory.php b/src/lib/UI/Dataset/DatasetFactory.php
index dd9b4989a5..f72d918e47 100644
--- a/src/lib/UI/Dataset/DatasetFactory.php
+++ b/src/lib/UI/Dataset/DatasetFactory.php
@@ -19,9 +19,15 @@
 use eZ\Publish\API\Repository\UserService;
 use eZ\Publish\Core\MVC\ConfigResolverInterface;
 use EzSystems\EzPlatformAdminUi\UI\Value\ValueFactory;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerAwareTrait;
+use Psr\Log\LoggerInterface;
+use Psr\Log\NullLogger;
 
-class DatasetFactory
+class DatasetFactory implements LoggerAwareInterface
 {
+    use LoggerAwareTrait;
+
     /** @var \eZ\Publish\API\Repository\ContentService */
     protected $contentService;
 
@@ -66,7 +72,8 @@ public function __construct(
         UserService $userService,
         BookmarkService $bookmarkService,
         ValueFactory $valueFactory,
-        ConfigResolverInterface $configResolver
+        ConfigResolverInterface $configResolver,
+        ?LoggerInterface $logger = null
     ) {
         $this->contentService = $contentService;
         $this->contentTypeService = $contentTypeService;
@@ -79,6 +86,7 @@ public function __construct(
         $this->bookmarkService = $bookmarkService;
         $this->valueFactory = $valueFactory;
         $this->configResolver = $configResolver;
+        $this->logger = $logger ?? new NullLogger();
     }
 
     /**
@@ -150,7 +158,7 @@ public function objectStates(): ObjectStatesDataset
      */
     public function customUrls(): CustomUrlsDataset
     {
-        return new CustomUrlsDataset($this->urlAliasService, $this->valueFactory);
+        return new CustomUrlsDataset($this->urlAliasService, $this->valueFactory, $this->logger);
     }
 
     /**

From a97f2b6db3b46a0a82ee9f585380a24ade816b6e Mon Sep 17 00:00:00 2001
From: Bartek Wajda <bartlomiej.wajda@ibexa.co>
Date: Mon, 2 Oct 2023 14:33:15 +0200
Subject: [PATCH 2/3] IBX-6644: Template update

---
 .../themes/admin/content/tab/url/custom_urls_table.html.twig    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig b/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
index e687d2c188..2340f7060f 100644
--- a/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
+++ b/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
@@ -45,7 +45,7 @@
                 <tr>
                     <td class="ez-table__cell ez-table__cell--no-content" colspan="4">
                         <p class="ez-table-no-content mb-0 py-0">
-                            {{ 'tab.urls.no_custom_urls'|trans|desc('This Content item has no custom URL aliases.') }}
+                            {{ 'tab.urls.no_custom_urls'|trans|desc('This Content item has no custom URL aliases or they are broken.') }}
                         </p>
                     </td>
                 </tr>

From f76d33082b6e51024b4cea3b96435dadaba09958 Mon Sep 17 00:00:00 2001
From: Bartek Wajda <bartlomiej.wajda@ibexa.co>
Date: Mon, 2 Oct 2023 16:23:02 +0200
Subject: [PATCH 3/3] IBX-6644: Applied review remarks

---
 src/bundle/Resources/config/services.yaml                     | 4 ++--
 src/bundle/Resources/translations/content_url.en.xliff        | 4 ++--
 .../themes/admin/content/tab/url/custom_urls_table.html.twig  | 2 +-
 src/lib/UI/Dataset/CustomUrlsDataset.php                      | 2 +-
 4 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/src/bundle/Resources/config/services.yaml b/src/bundle/Resources/config/services.yaml
index 5b5238cd36..214c359e0e 100644
--- a/src/bundle/Resources/config/services.yaml
+++ b/src/bundle/Resources/config/services.yaml
@@ -59,8 +59,8 @@ services:
         lazy: true
         arguments:
             $configResolver: '@ezpublish.config.resolver'
-        calls:
-            - [setLogger, ['@?logger']]
+        tags:
+            - { name: 'monolog.logger', channel: 'ibexa.admin_ui' }
 
     EzSystems\EzPlatformAdminUi\UI\Service\:
         resource: '../../../lib/UI/Service'
diff --git a/src/bundle/Resources/translations/content_url.en.xliff b/src/bundle/Resources/translations/content_url.en.xliff
index 54e7a0d708..961e9bff8c 100644
--- a/src/bundle/Resources/translations/content_url.en.xliff
+++ b/src/bundle/Resources/translations/content_url.en.xliff
@@ -102,8 +102,8 @@
         <note>key: tab.urls.modal_close</note>
       </trans-unit>
       <trans-unit id="56d218db883ed4cc59dbbca53364dc2e725013e4" resname="tab.urls.no_custom_urls">
-        <source>This Content item has no custom URL aliases or they are broken.</source>
-        <target state="new">This Content item has no custom URL aliases or they are broken.</target>
+        <source>This Content item has no custom URL aliases.</source>
+        <target state="new">This Content item has no custom URL aliases.</target>
         <note>key: tab.urls.no_custom_urls</note>
       </trans-unit>
       <trans-unit id="c9fdd1434b44a4592626e8fe493c19141aab24d5" resname="tab.urls.no_system_urls">
diff --git a/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig b/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
index 2340f7060f..e687d2c188 100644
--- a/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
+++ b/src/bundle/Resources/views/themes/admin/content/tab/url/custom_urls_table.html.twig
@@ -45,7 +45,7 @@
                 <tr>
                     <td class="ez-table__cell ez-table__cell--no-content" colspan="4">
                         <p class="ez-table-no-content mb-0 py-0">
-                            {{ 'tab.urls.no_custom_urls'|trans|desc('This Content item has no custom URL aliases or they are broken.') }}
+                            {{ 'tab.urls.no_custom_urls'|trans|desc('This Content item has no custom URL aliases.') }}
                         </p>
                     </td>
                 </tr>
diff --git a/src/lib/UI/Dataset/CustomUrlsDataset.php b/src/lib/UI/Dataset/CustomUrlsDataset.php
index 0a707d9f91..53a6d03200 100644
--- a/src/lib/UI/Dataset/CustomUrlsDataset.php
+++ b/src/lib/UI/Dataset/CustomUrlsDataset.php
@@ -63,7 +63,7 @@ public function load(Location $location): self
                     'At least one custom alias belonging to location %d is broken. Fix it by using the ezplatform:urls:regenerate-aliases command.',
                     $location->id
                 ),
-                [$e->getMessage()]
+                ['exception' => $e]
             );
             $customUrlAliases = [];
         }