diff --git a/.env.cleaner b/.env.cleaner index 954918e..f4c44ac 100644 --- a/.env.cleaner +++ b/.env.cleaner @@ -1,4 +1,4 @@ RELEASE=dev VERSION=1 BUILD=3 -FIX=8 +FIX=9 diff --git a/.env.fileproc b/.env.fileproc index eca0603..5b2cf5e 100644 --- a/.env.fileproc +++ b/.env.fileproc @@ -1,4 +1,4 @@ RELEASE=dev VERSION=1 BUILD=3 -FIX=4 +FIX=5 diff --git a/.env.scrapper b/.env.scrapper index cf1cdd9..954918e 100644 --- a/.env.scrapper +++ b/.env.scrapper @@ -1,4 +1,4 @@ RELEASE=dev VERSION=1 BUILD=3 -FIX=7 +FIX=8 diff --git a/.env.search b/.env.search index 0c14c84..eca0603 100644 --- a/.env.search +++ b/.env.search @@ -1,4 +1,4 @@ RELEASE=dev VERSION=1 BUILD=3 -FIX=3 +FIX=4 diff --git a/DSL/Ruuter/ckb/POST/source/add.yml b/DSL/Ruuter/ckb/POST/source/add.yml index 8fa6b49..4e0a956 100644 --- a/DSL/Ruuter/ckb/POST/source/add.yml +++ b/DSL/Ruuter/ckb/POST/source/add.yml @@ -38,6 +38,17 @@ extractRequestData: quality_control: "${incoming.body.qualityControl != null && incoming.body.qualityControl != '' ? incoming.body.qualityControl : ''}" extract_images: "${incoming.body.extractImages == true}" +validateUrl: + switch: + - condition: "${type == 'url_to_scrape' && !(url != null && (url.startsWith('http://') || url.startsWith('https://')))}" + next: returnInvalidUrl + next: createSource + +returnInvalidUrl: + return: "Invalid URL" + status: 400 + next: end + createSource: call: http.post args: diff --git a/GUI/src/pages/Agency/Agency.tsx b/GUI/src/pages/Agency/Agency.tsx index e6ce918..37a0b16 100644 --- a/GUI/src/pages/Agency/Agency.tsx +++ b/GUI/src/pages/Agency/Agency.tsx @@ -73,6 +73,15 @@ const getInitialFormData = (): KnowledgeBaseFormData => ({ extractImages: false, }); +const isValidUrl = (value: string): boolean => { + try { + const parsed = new URL(value); + return parsed.protocol === 'http:' || parsed.protocol === 'https:'; + } catch { + return false; + } +}; + const Agency: FC = () => { const { t } = useTranslation(); const toast = useToast(); @@ -108,6 +117,7 @@ const Agency: FC = () => { const [formData, setFormData] = useState( getInitialFormData() ); + const [urlError, setUrlError] = useState(null); // Convert sorting state to API format const getSortingParam = (sorting: SortingState): string => { @@ -472,6 +482,12 @@ const Agency: FC = () => { return; } + if (!isValidUrl(formData.websiteUrl)) { + setUrlError(t('knowledgeBase.invalidUrl')); + return; + } + + setUrlError(null); addUrlMutation.mutate({ agencyBaseId, url: formData.websiteUrl, @@ -564,6 +580,12 @@ const Agency: FC = () => { return; } + if (!isValidUrl(formData.websiteUrl)) { + setUrlError(t('knowledgeBase.invalidUrl')); + return; + } + + setUrlError(null); addUrlListMutation.mutate({ agencyBaseId, url: formData.websiteUrl, @@ -909,16 +931,22 @@ const Agency: FC = () => { { + { setAddUrlModal(false); setFormData(getInitialFormData()); + }; + setUrlError(null); }} footer={