From 35ffa830741e775cb235059f64cd6dd4b55c1511 Mon Sep 17 00:00:00 2001
From: Duy Minh Vo <duy.minh.vo@fokus.fraunhofer.de>
Date: Thu, 20 Feb 2025 09:07:05 +0100
Subject: [PATCH] fix(dpi): fix dataset id validation reacting to uniqueness
 response

---
 .../components/UniqueIdentifierInput.vue      | 56 +++++++++----------
 1 file changed, 27 insertions(+), 29 deletions(-)

diff --git a/packages/piveau-hub-ui-modules/lib/data-provider-interface/components/UniqueIdentifierInput.vue b/packages/piveau-hub-ui-modules/lib/data-provider-interface/components/UniqueIdentifierInput.vue
index 4f4fe0963..11942b7fe 100644
--- a/packages/piveau-hub-ui-modules/lib/data-provider-interface/components/UniqueIdentifierInput.vue
+++ b/packages/piveau-hub-ui-modules/lib/data-provider-interface/components/UniqueIdentifierInput.vue
@@ -11,9 +11,8 @@ let env = getCurrentInstance().appContext.app.config.globalProperties.$env;
 
 const store = useStore();
 const dpiContext = useDpiContext();
-const isDuplicate = ref();
+const isDuplicate = ref(localStorage.getItem('dpi_duplicate') || false);
 const isEditMode = computed(() => !!dpiContext.value.edit?.enabled)
-isDuplicate.value = localStorage.getItem('dpi_duplicate');
 
 const { t, locale } = useI18n({ useScope: 'global' });
 
@@ -31,34 +30,33 @@ onMounted(() => {
   validationMessages.value.required = t('message.dataupload.datasets.datasetID.required');
 });
 
-
-watchEffect(() => {
-
-
-});
-
-
-
-async function idunique(node) {
-  let isUniqueID = true;
-  let hubUrl = env.api.hubUrl;
-  const draftIDs = store.getters['auth/getUserDraftIds'];
-
-  new Promise(() => {
-    if (isNil(node.value) || node.value === '' || node.value === undefined) isUniqueID = true;
-    else if (draftIDs.includes(node.value)) isUniqueID = false;
-    else {
-      const request = `${hubUrl}datasets/${node.value}?useNormalizedId=true`;
-      axios.head(request)
-        .then(() => {
-          isUniqueID = false;
-        })
-        .catch((e) => {
-          isUniqueID = true;
-        });
+const draftIDs = store.getters['auth/getUserDraftIds'];
+const hubUrl = env.api.hubUrl;
+function idunique(node) {
+  const id = node?.value;
+
+  return new Promise(async (resolve) => {
+    // resolve(true) -> datasetId is unique
+    // resolve(false) -> datasetId is not unique
+
+    if (isNil(id) || id === '' || id === undefined) resolve(true)
+
+    const existIdInUserDrafts = draftIDs?.includes(id)
+    if (existIdInUserDrafts) resolve(false)
+
+    const request = `${hubUrl}datasets/${id}?useNormalizedId=true`;
+    try {
+      const res = await axios.head(request);
+      // if 2xx -> datsetId is not unique -> validation error
+      const isNotUnique = !(res.status >= 200 && res.status < 300);
+      if (isNotUnique) resolve(false)
+    } catch (error) {
+      // if 404 -> datasetId is unique
+      resolve(true);
     }
+
+    resolve(false)
   });
-  return isUniqueID;
 }
 
 function idformatvalid(node) {
@@ -73,7 +71,7 @@ function idformatvalid(node) {
     <FormKit v-if="!isEditMode || isDuplicate" type="text" name="datasetID" id="datasetID"
       :placeholder="$t(`message.dataupload.datasets.datasetID.label`)"
       :info="$t(`message.dataupload.datasets.datasetID.info`)" :help="$t(`message.dataupload.datasets.datasetID.help`)"
-      :validation-rules="{ idformatvalid, idunique }" validation="idformatvalid|idunique|required"
+      :validation-rules="{ idformatvalid, idunique }" validation="required|idformatvalid|(900)idunique"
       validation-visibility="live" :validation-messages="validationMessages" outer-class="formkitCmpWrap p-3">
     </FormKit>
     <FormKit v-else type="text" name="datasetID" id="datasetID" :disabled="true"
-- 
GitLab