changeset 4178:cf0ea77f9537

plugin XEP-0277, doc: conflict is now checked and avoided if `user_friendly_id_suffix` is `False`, doc updated
author Goffi <goffi@goffi.org>
date Tue, 05 Dec 2023 13:39:03 +0100
parents 0f1a4ffcd419
children 3b95704ab777
files doc/libervia-cli/blog.rst libervia/backend/plugins/plugin_xep_0277.py
diffstat 2 files changed, 30 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/doc/libervia-cli/blog.rst	Tue Dec 05 13:14:55 2023 +0100
+++ b/doc/libervia-cli/blog.rst	Tue Dec 05 13:39:03 2023 +0100
@@ -17,11 +17,17 @@
 
 ``--no-id-suffix``
 
-   This option removes the randomly generated suffix from the auto-generated, user-friendly ID. The suffix is initially added to ensure unique IDs, especially useful when two posts have similar titles. Use this option with caution, as it may lead to ID conflicts and potential overwriting of existing posts.
+   This option removes the randomly generated suffix from the auto-generated,
+   user-friendly ID. The suffix is initially added to ensure unique IDs, especially useful
+   when two posts have similar titles.
+
+   .. note::
 
-   .. warning::
-
-      Use this option judiciously to avoid unintended overwriting of blog posts.
+      When the ``--no-id-suffix`` option is selected, an extra validation is performed to
+      check for ID uniqueness. If an existing item already uses the same ID, a suffix is
+      added to the new ID regardless of the option, ensuring no existing content is
+      overwritten. This additional check incurs a slight performance impact due to the
+      extra request needed.
 
 ``--alt-link URL [MEDIA_TYPE]``
 
--- a/libervia/backend/plugins/plugin_xep_0277.py	Tue Dec 05 13:14:55 2023 +0100
+++ b/libervia/backend/plugins/plugin_xep_0277.py	Tue Dec 05 13:39:03 2023 +0100
@@ -1068,8 +1068,26 @@
         if item_id is None:
             if data.get("user_friendly_id", True):
                 item_id = self.friendly_id(data)
-            else:
-                item_id = str(shortuuid.uuid())
+                if not data.get("user_friendly_id_suffix", True):
+                    # we have no random suffix, which can lead to conflict, so we check if
+                    # the item doesn't already exist, and change ID if it's the case.
+                    try:
+                        items, __ = await self._p.get_items(
+                            client,
+                            service,
+                            node,
+                            item_ids = [item_id]
+                        )
+                    except exceptions.NotFound:
+                        pass
+                    else:
+                        # the item already exists
+                        log.info(
+                            f"there is already an item with ID {item_id}, we have to "
+                            ' set the "user_friendly_id_suffix" flag.'
+                        )
+                        data["user_friendly_id_suffix"] = True
+                        item_id = self.friendly_id(data)
 
         try:
             await self._manage_comments(client, data, service, node, item_id, access=None)