From d4af0b4a4df2ad9b2c62ea4216fa69d95a5724bb Mon Sep 17 00:00:00 2001 From: Sonny Date: Thu, 23 Nov 2023 14:02:32 +0100 Subject: [PATCH] feat: add support for domain without extension (ie: localhost) --- src/lib/link/linkValidationSchema.ts | 4 ++-- src/lib/url.ts | 12 ++++++++++++ src/pages/api/link/[lid].ts | 1 - src/pages/link/create.tsx | 4 ++-- src/pages/link/edit/[lid].tsx | 4 ++-- src/utils/front.ts | 6 ------ 6 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 src/utils/front.ts diff --git a/src/lib/link/linkValidationSchema.ts b/src/lib/link/linkValidationSchema.ts index 8b9918e..09b0e56 100644 --- a/src/lib/link/linkValidationSchema.ts +++ b/src/lib/link/linkValidationSchema.ts @@ -1,5 +1,5 @@ -import { VALID_URL_REGEX } from "constants/url"; import { boolean, number, object, string } from "yup"; +import { isValidHttpUrl } from "../url"; const LinkBodySchema = object({ name: string() @@ -9,7 +9,7 @@ const LinkBodySchema = object({ url: string() .trim() .required("URl is required") - .matches(VALID_URL_REGEX, "Invalid URL format"), + .test("test_url", "Invalid URL format", (value) => isValidHttpUrl(value)), categoryId: number().required("CategoryId must be a number"), favorite: boolean().default(() => false), }).typeError("Missing request Body"); diff --git a/src/lib/url.ts b/src/lib/url.ts index 26a9243..3632022 100644 --- a/src/lib/url.ts +++ b/src/lib/url.ts @@ -47,3 +47,15 @@ export function findFaviconPath(text: string) { return favicon?.getAttribute("href") || undefined; } + +export function isValidHttpUrl(urlParam: string) { + let url; + + try { + url = new URL(urlParam); + } catch (_) { + return false; + } + + return url.protocol === "http:" || url.protocol === "https:"; +} diff --git a/src/pages/api/link/[lid].ts b/src/pages/api/link/[lid].ts index 40719f5..b32b5cb 100644 --- a/src/pages/api/link/[lid].ts +++ b/src/pages/api/link/[lid].ts @@ -1,7 +1,6 @@ import { apiHandler } from "lib/api/handler"; import getUserLink from "lib/link/getUserLink"; import { LinkBodySchema, LinkQuerySchema } from "lib/link/linkValidationSchema"; - import prisma from "utils/prisma"; export default apiHandler({ diff --git a/src/pages/link/create.tsx b/src/pages/link/create.tsx index db8f9ca..499d842 100644 --- a/src/pages/link/create.tsx +++ b/src/pages/link/create.tsx @@ -12,9 +12,9 @@ import { useRouter } from "next/router"; import { FormEvent, useMemo, useState } from "react"; import styles from "styles/form.module.scss"; import { Category, Link } from "types"; -import { IsValidURL } from "utils/front"; import { withAuthentication } from "utils/session"; import { makeRequest } from "lib/request"; +import { isValidHttpUrl } from "lib/url"; export default function PageCreateLink({ categories, @@ -39,7 +39,7 @@ export default function PageCreateLink({ const canSubmit = useMemo( () => name !== "" && - IsValidURL(url) && + isValidHttpUrl(url) && favorite !== null && categoryId !== null && !submitted, diff --git a/src/pages/link/edit/[lid].tsx b/src/pages/link/edit/[lid].tsx index 2204304..0870e54 100644 --- a/src/pages/link/edit/[lid].tsx +++ b/src/pages/link/edit/[lid].tsx @@ -13,7 +13,7 @@ import { useRouter } from "next/router"; import { FormEvent, useMemo, useState } from "react"; import styles from "styles/form.module.scss"; import { Category, Link } from "types"; -import { IsValidURL } from "utils/front"; +import { isValidHttpUrl } from "lib/url"; import { withAuthentication } from "utils/session"; import { makeRequest } from "lib/request"; @@ -46,7 +46,7 @@ export default function PageEditLink({ categoryId !== link.category.id; const isFormValid = name !== "" && - IsValidURL(url) && + isValidHttpUrl(url) && favorite !== null && categoryId !== null; return isFormEdited && isFormValid && !submitted; diff --git a/src/utils/front.ts b/src/utils/front.ts deleted file mode 100644 index 9daeb7b..0000000 --- a/src/utils/front.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { VALID_URL_REGEX } from "constants/url"; - -export function IsValidURL(url: string): boolean { - const regex = new RegExp(VALID_URL_REGEX); - return !!url.match(regex); -}