From cd591ef5a479e1814d99b609c1049805553bfc4e Mon Sep 17 00:00:00 2001 From: DIYgod Date: Fri, 4 Aug 2023 22:19:34 +0100 Subject: [PATCH] feat: query portfolio in site home --- src/app/api/pages/route.ts | 2 +- src/app/site/[site]/page.tsx | 2 +- src/components/site/SiteHome.tsx | 2 +- src/lib/search-params.ts | 15 +++++++++ src/lib/server-helper.ts | 10 +++++- src/models/page.model.ts | 52 +++++++++++++++++++++++--------- src/queries/page.ts | 5 +-- 7 files changed, 68 insertions(+), 20 deletions(-) create mode 100644 src/lib/search-params.ts diff --git a/src/app/api/pages/route.ts b/src/app/api/pages/route.ts index 56f577f9..3722ee18 100644 --- a/src/app/api/pages/route.ts +++ b/src/app/api/pages/route.ts @@ -7,7 +7,7 @@ export async function GET(req: Request) { const result = await getPagesBySite({ characterId: +(query.characterId || 0) as number, - type: query.type as "post" | "page", + type: query.type, visibility: query.visibility as PageVisibilityEnum, limit: query.limit ? parseInt(query.limit as string) : undefined, cursor: query.cursor as string, diff --git a/src/app/site/[site]/page.tsx b/src/app/site/[site]/page.tsx index 359a02a0..e41a4541 100644 --- a/src/app/site/[site]/page.tsx +++ b/src/app/site/[site]/page.tsx @@ -19,7 +19,7 @@ async function SiteIndexPage({ await prefetchGetPagesBySite( { characterId: site?.characterId, - type: "post", + type: ["post", "portfolio"], visibility: PageVisibilityEnum.Published, useStat: true, }, diff --git a/src/components/site/SiteHome.tsx b/src/components/site/SiteHome.tsx index c693a57b..8f0e749d 100644 --- a/src/components/site/SiteHome.tsx +++ b/src/components/site/SiteHome.tsx @@ -9,7 +9,7 @@ export default function SiteHome({ handle }: { handle: string }) { const site = useGetSite(handle) const posts = useGetPagesBySiteLite({ characterId: site.data?.characterId, - type: "post", + type: ["post", "portfolio"], visibility: PageVisibilityEnum.Published, useStat: true, }) diff --git a/src/lib/search-params.ts b/src/lib/search-params.ts new file mode 100644 index 00000000..ce6dac32 --- /dev/null +++ b/src/lib/search-params.ts @@ -0,0 +1,15 @@ +export default function createSearchParams( + params: Record, +) { + const searchParams = new URLSearchParams() + Object.entries(params).forEach(([key, values]) => { + if (Array.isArray(values)) { + values.forEach((value) => { + searchParams.append(key, value) + }) + } else { + searchParams.append(key, values) + } + }) + return searchParams +} diff --git a/src/lib/server-helper.ts b/src/lib/server-helper.ts index 839a2366..09904ce6 100644 --- a/src/lib/server-helper.ts +++ b/src/lib/server-helper.ts @@ -7,7 +7,15 @@ export const getQuery = (req: Request) => { const obj = {} as Record for (const [key, value] of searchParams.entries()) { - obj[key] = value + if (obj[key]) { + if (Array.isArray(obj[key])) { + obj[key].push(value) + } else { + obj[key] = [obj[key], value] + } + } else { + obj[key] = value + } } return obj diff --git a/src/models/page.model.ts b/src/models/page.model.ts index e15f9d27..94966d56 100644 --- a/src/models/page.model.ts +++ b/src/models/page.model.ts @@ -157,7 +157,7 @@ const getLocalPages = (input: { export async function getPagesBySite(input: { characterId?: number - type: NoteType + type: NoteType | NoteType[] visibility?: PageVisibilityEnum limit?: number cursor?: string @@ -180,7 +180,7 @@ export async function getPagesBySite(input: { let pinnedNote: NoteEntity | null = null let pinnedNoteId: number | null = null - if (input.type === "post") { + if (input.type === "post" || input.type.includes("post")) { if (!input.cursor) { pinnedNote = await getPinnedPage(input) pinnedNoteId = pinnedNote?.noteId || null @@ -199,14 +199,18 @@ export async function getPagesBySite(input: { }, ` : "" - const tagsQuery = [...(input.tags || []), input.type] - .map( + + if (typeof input.type === "string") { + input.type = [input.type] + } + const typesQuery = input.type + ?.map( (tag) => `{ - content: { - path: "tags", - array_contains: "${tag}" - } - }`, + content: { + path: "tags", + array_contains: ["${tag}"] + } + }`, ) .join(", ") const whereQuery = ` @@ -223,11 +227,31 @@ export async function getPagesBySite(input: { equals: false, }, metadata: { - content: { - path: "sources", - array_contains: "xlog" - }, - AND: [${tagsQuery}] + AND: [ + { + content: { + path: "sources", + array_contains: "xlog" + }, + }, + ${ + input.tags + ? ` + { + content: { + path: "tags", + array_contains: ${JSON.stringify(input.tags)} + } + }, + ` + : "" + } + { + OR: [ + ${typesQuery} + ] + } + ], }, } ` diff --git a/src/queries/page.ts b/src/queries/page.ts index 806865e1..f755e7bb 100644 --- a/src/queries/page.ts +++ b/src/queries/page.ts @@ -25,6 +25,7 @@ import { useQueryClient, } from "@tanstack/react-query" +import createSearchParams from "~/lib/search-params" import { NoteType } from "~/lib/types" import * as pageModel from "~/models/page.model" @@ -37,10 +38,10 @@ export const useGetPagesBySiteLite = ( const result: ReturnType = await ( await fetch( "/api/pages?" + - new URLSearchParams({ + createSearchParams({ ...input, ...(pageParam && { cursor: pageParam }), - } as any), + }), ) ).json() return result