From 750aa294d0ff54902436325a4fc79763bf8a3f01 Mon Sep 17 00:00:00 2001 From: Isaac Wise Date: Mon, 4 Mar 2024 23:24:30 -0600 Subject: [PATCH 1/2] Allow users to enable merging links --- components/CollectionListing.tsx | 5 ++--- components/ModalContent/NewLinkModal.tsx | 1 - lib/api/controllers/links/postLink.ts | 22 +++++++++++++++++++ .../users/userId/updateUserById.ts | 1 + pages/settings/preference.tsx | 12 ++++++++++ .../migration.sql | 2 ++ prisma/schema.prisma | 1 + 7 files changed, 40 insertions(+), 4 deletions(-) create mode 100644 prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql diff --git a/components/CollectionListing.tsx b/components/CollectionListing.tsx index 01d81d0..1a309c4 100644 --- a/components/CollectionListing.tsx +++ b/components/CollectionListing.tsx @@ -223,11 +223,10 @@ const renderItem = ( return (
{Icon(item as ExtendedTreeItem, onExpand, onCollapse)} diff --git a/components/ModalContent/NewLinkModal.tsx b/components/ModalContent/NewLinkModal.tsx index 20bcef2..46c9ffe 100644 --- a/components/ModalContent/NewLinkModal.tsx +++ b/components/ModalContent/NewLinkModal.tsx @@ -109,7 +109,6 @@ export default function NewLinkModal({ onClose }: Props) { toast.success(`Created!`); onClose(); } else toast.error(response.data as string); - setSubmitLoader(false); return response; diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index eb82949..0dcc5dc 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -87,6 +87,28 @@ export default async function postLink( return { response: "Uncaught error.", status: 500 }; } + const user = await prisma.user.findUnique({ + where: { + id: userId, + }, + }); + + const existingLink = await prisma.link.findFirst({ + where: { + url: link.url, + collection: { + ownerId: userId, + }, + }, + }); + + if (existingLink && user?.mergeDuplicateLinks) { + return { + response: "Link already exists", + status: 409, + }; + } + const numberOfLinksTheUserHas = await prisma.link.count({ where: { collection: { diff --git a/lib/api/controllers/users/userId/updateUserById.ts b/lib/api/controllers/users/userId/updateUserById.ts index e4e5726..7459d1d 100644 --- a/lib/api/controllers/users/userId/updateUserById.ts +++ b/lib/api/controllers/users/userId/updateUserById.ts @@ -190,6 +190,7 @@ export default async function updateUserById( archiveAsPDF: data.archiveAsPDF, archiveAsWaybackMachine: data.archiveAsWaybackMachine, linksRouteTo: data.linksRouteTo, + mergeDuplicateLinks: data.mergeDuplicateLinks, password: data.newPassword && data.newPassword !== "" ? newHashedPassword diff --git a/pages/settings/preference.tsx b/pages/settings/preference.tsx index 2456e92..b581045 100644 --- a/pages/settings/preference.tsx +++ b/pages/settings/preference.tsx @@ -16,6 +16,8 @@ export default function Appearance() { const { account, updateAccount } = useAccountStore(); const [user, setUser] = useState(account); + const [mergeDuplicateLinks, setMergeDuplicateLinks] = + useState(false); const [archiveAsScreenshot, setArchiveAsScreenshot] = useState(false); const [archiveAsPDF, setArchiveAsPDF] = useState(false); @@ -32,6 +34,7 @@ export default function Appearance() { archiveAsPDF, archiveAsWaybackMachine, linksRouteTo, + mergeDuplicateLinks, }); }, [ account, @@ -39,6 +42,7 @@ export default function Appearance() { archiveAsPDF, archiveAsWaybackMachine, linksRouteTo, + mergeDuplicateLinks, ]); function objectIsEmpty(obj: object) { @@ -51,6 +55,7 @@ export default function Appearance() { setArchiveAsPDF(account.archiveAsPDF); setArchiveAsWaybackMachine(account.archiveAsWaybackMachine); setLinksRouteTo(account.linksRouteTo); + setMergeDuplicateLinks(account.mergeDuplicateLinks); } }, [account]); @@ -144,6 +149,13 @@ export default function Appearance() {

Link Settings

+
+ setMergeDuplicateLinks(!mergeDuplicateLinks)} + /> +

Clicking on Links should:

diff --git a/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql b/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql new file mode 100644 index 0000000..cb534b9 --- /dev/null +++ b/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql @@ -0,0 +1,2 @@ +-- AlterTable +ALTER TABLE "User" ADD COLUMN "mergeDuplicateLinks" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 6bdc8de..64945ca 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -43,6 +43,7 @@ model User { accessTokens AccessToken[] subscriptions Subscription? linksRouteTo LinksRouteTo @default(ORIGINAL) + mergeDuplicateLinks Boolean @default(false) archiveAsScreenshot Boolean @default(true) archiveAsPDF Boolean @default(true) archiveAsWaybackMachine Boolean @default(false) From f26cd31694f034b27db2d508cdd1dd7ea750fb53 Mon Sep 17 00:00:00 2001 From: daniel31x13 Date: Tue, 5 Mar 2024 09:03:04 -0500 Subject: [PATCH 2/2] final touch --- lib/api/controllers/links/postLink.ts | 27 ++++++++++--------- .../users/userId/updateUserById.ts | 2 +- pages/settings/preference.tsx | 14 +++++----- .../migration.sql | 2 +- prisma/schema.prisma | 2 +- 5 files changed, 24 insertions(+), 23 deletions(-) diff --git a/lib/api/controllers/links/postLink.ts b/lib/api/controllers/links/postLink.ts index 0dcc5dc..0301bca 100644 --- a/lib/api/controllers/links/postLink.ts +++ b/lib/api/controllers/links/postLink.ts @@ -93,20 +93,21 @@ export default async function postLink( }, }); - const existingLink = await prisma.link.findFirst({ - where: { - url: link.url, - collection: { - ownerId: userId, + if (user?.preventDuplicateLinks) { + const existingLink = await prisma.link.findFirst({ + where: { + url: link.url?.trim(), + collection: { + ownerId: userId, + }, }, - }, - }); + }); - if (existingLink && user?.mergeDuplicateLinks) { - return { - response: "Link already exists", - status: 409, - }; + if (existingLink) + return { + response: "Link already exists", + status: 409, + }; } const numberOfLinksTheUserHas = await prisma.link.count({ @@ -148,7 +149,7 @@ export default async function postLink( const newLink = await prisma.link.create({ data: { - url: link.url, + url: link.url?.trim(), name: link.name, description, type: linkType, diff --git a/lib/api/controllers/users/userId/updateUserById.ts b/lib/api/controllers/users/userId/updateUserById.ts index 7459d1d..f2b5e91 100644 --- a/lib/api/controllers/users/userId/updateUserById.ts +++ b/lib/api/controllers/users/userId/updateUserById.ts @@ -190,7 +190,7 @@ export default async function updateUserById( archiveAsPDF: data.archiveAsPDF, archiveAsWaybackMachine: data.archiveAsWaybackMachine, linksRouteTo: data.linksRouteTo, - mergeDuplicateLinks: data.mergeDuplicateLinks, + preventDuplicateLinks: data.preventDuplicateLinks, password: data.newPassword && data.newPassword !== "" ? newHashedPassword diff --git a/pages/settings/preference.tsx b/pages/settings/preference.tsx index b581045..1d5a2e0 100644 --- a/pages/settings/preference.tsx +++ b/pages/settings/preference.tsx @@ -16,7 +16,7 @@ export default function Appearance() { const { account, updateAccount } = useAccountStore(); const [user, setUser] = useState(account); - const [mergeDuplicateLinks, setMergeDuplicateLinks] = + const [preventDuplicateLinks, setPreventDuplicateLinks] = useState(false); const [archiveAsScreenshot, setArchiveAsScreenshot] = useState(false); @@ -34,7 +34,7 @@ export default function Appearance() { archiveAsPDF, archiveAsWaybackMachine, linksRouteTo, - mergeDuplicateLinks, + preventDuplicateLinks, }); }, [ account, @@ -42,7 +42,7 @@ export default function Appearance() { archiveAsPDF, archiveAsWaybackMachine, linksRouteTo, - mergeDuplicateLinks, + preventDuplicateLinks, ]); function objectIsEmpty(obj: object) { @@ -55,7 +55,7 @@ export default function Appearance() { setArchiveAsPDF(account.archiveAsPDF); setArchiveAsWaybackMachine(account.archiveAsWaybackMachine); setLinksRouteTo(account.linksRouteTo); - setMergeDuplicateLinks(account.mergeDuplicateLinks); + setPreventDuplicateLinks(account.preventDuplicateLinks); } }, [account]); @@ -151,9 +151,9 @@ export default function Appearance() {
setMergeDuplicateLinks(!mergeDuplicateLinks)} + label="Prevent duplicate links" + state={preventDuplicateLinks} + onClick={() => setPreventDuplicateLinks(!preventDuplicateLinks)} />
diff --git a/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql b/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql index cb534b9..873a36e 100644 --- a/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql +++ b/prisma/migrations/20240305045701_add_merge_duplicate_links/migration.sql @@ -1,2 +1,2 @@ -- AlterTable -ALTER TABLE "User" ADD COLUMN "mergeDuplicateLinks" BOOLEAN NOT NULL DEFAULT false; +ALTER TABLE "User" ADD COLUMN "preventDuplicateLinks" BOOLEAN NOT NULL DEFAULT false; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 64945ca..64c7b86 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -43,7 +43,7 @@ model User { accessTokens AccessToken[] subscriptions Subscription? linksRouteTo LinksRouteTo @default(ORIGINAL) - mergeDuplicateLinks Boolean @default(false) + preventDuplicateLinks Boolean @default(false) archiveAsScreenshot Boolean @default(true) archiveAsPDF Boolean @default(true) archiveAsWaybackMachine Boolean @default(false)