From 7f9b0d8977a01da0ca8d7469e1bc0141aa0e3057 Mon Sep 17 00:00:00 2001 From: Daniel Date: Mon, 29 May 2023 23:10:23 +0330 Subject: [PATCH] created a route for public collections --- lib/api/controllers/public/getCollection.ts | 43 +++++++++++++++++++++ lib/client/getPublicCollectionData.ts | 18 +++++++++ pages/api/public/routes/collections.ts | 24 ++++++++++++ pages/public/collections/[id].tsx | 28 +++++++++++++- store/account.ts | 2 - store/collections.ts | 2 - types/global.ts | 6 +++ 7 files changed, 117 insertions(+), 6 deletions(-) create mode 100644 lib/api/controllers/public/getCollection.ts create mode 100644 lib/client/getPublicCollectionData.ts create mode 100644 pages/api/public/routes/collections.ts diff --git a/lib/api/controllers/public/getCollection.ts b/lib/api/controllers/public/getCollection.ts new file mode 100644 index 0000000..c3860fd --- /dev/null +++ b/lib/api/controllers/public/getCollection.ts @@ -0,0 +1,43 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import { prisma } from "@/lib/api/db"; + +export default async function (collectionId: number) { + let data; + + const collection = await prisma.collection.findFirst({ + where: { + id: collectionId, + isPublic: true, + }, + include: { + links: { + select: { + id: true, + name: true, + url: true, + title: true, + collectionId: true, + createdAt: true, + }, + }, + }, + }); + + if (collection) { + const user = await prisma.user.findUnique({ + where: { + id: collection.ownerId, + }, + }); + + data = { ownerName: user?.name, ...collection }; + + return { response: data, status: 200 }; + } else { + return { response: "Collection not found...", status: 400 }; + } +} diff --git a/lib/client/getPublicCollectionData.ts b/lib/client/getPublicCollectionData.ts new file mode 100644 index 0000000..942802d --- /dev/null +++ b/lib/client/getPublicCollectionData.ts @@ -0,0 +1,18 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +const getPublicCollectionData = async (collectionId: string) => { + const res = await fetch( + "/api/public/routes/collections/?collectionId=" + collectionId + ); + + const data = await res.json(); + + console.log(data); + + return data; +}; + +export default getPublicCollectionData; diff --git a/pages/api/public/routes/collections.ts b/pages/api/public/routes/collections.ts new file mode 100644 index 0000000..bc87cb6 --- /dev/null +++ b/pages/api/public/routes/collections.ts @@ -0,0 +1,24 @@ +// Copyright (C) 2022-present Daniel31x13 +// This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 3. +// This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. +// You should have received a copy of the GNU General Public License along with this program. If not, see . + +import getCollection from "@/lib/api/controllers/public/getCollection"; +import type { NextApiRequest, NextApiResponse } from "next"; + +export default async function (req: NextApiRequest, res: NextApiResponse) { + const collectionId = Number(req.query.collectionId); + + if (!collectionId) { + return res + .status(401) + .json({ response: "Please choose a valid collection." }); + } + + if (req.method === "GET") { + const collection = await getCollection(collectionId); + return res + .status(collection.status) + .json({ response: collection.response }); + } +} diff --git a/pages/public/collections/[id].tsx b/pages/public/collections/[id].tsx index 6f6ae03..5d1ee5a 100644 --- a/pages/public/collections/[id].tsx +++ b/pages/public/collections/[id].tsx @@ -1,5 +1,29 @@ -import React from "react"; +import getPublicCollectionData from "@/lib/client/getPublicCollectionData"; +import { PublicCollectionIncludingLinks } from "@/types/global"; +import { useRouter } from "next/router"; +import React, { useEffect, useState } from "react"; export default function PublicCollections() { - return
Hello
; + const router = useRouter(); + + const [data, setData] = useState(); + + useEffect(() => { + const init = async () => { + if (router.query.id) { + const data = await getPublicCollectionData(router.query.id as string); + + setData(data); + } + }; + + init(); + }, []); + + return ( +
+

Hello

+ {JSON.stringify(data)} +
+ ); } diff --git a/store/account.ts b/store/account.ts index ddd13a4..4b430d6 100644 --- a/store/account.ts +++ b/store/account.ts @@ -29,8 +29,6 @@ const useAccountStore = create()((set) => ({ const profilePic = await determineProfilePicSource(data); - console.log({ ...data.response, profilePic }); - if (response.ok) set({ account: { ...data.response, profilePic } }); }, updateAccount: async (user) => { diff --git a/store/collections.ts b/store/collections.ts index 05d7efe..907debf 100644 --- a/store/collections.ts +++ b/store/collections.ts @@ -25,8 +25,6 @@ const useCollectionStore = create()((set) => ({ const data = await response.json(); - console.log(data); - if (response.ok) set({ collections: data.response }); }, addCollection: async (body) => { diff --git a/types/global.ts b/types/global.ts index df4e632..78d695a 100644 --- a/types/global.ts +++ b/types/global.ts @@ -49,3 +49,9 @@ export type SearchSettings = { tags: boolean; }; }; + +export interface PublicCollectionIncludingLinks + extends Omit { + ownerName?: string; + links: Omit; +}