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