From be24125bd7d94c8c876b5026235522bb50d4317f Mon Sep 17 00:00:00 2001 From: DIYgod Date: Tue, 9 May 2023 01:47:36 +0100 Subject: [PATCH] fix: getIdBySlug in api slug2id --- src/app/api/redirection/route.ts | 2 +- src/app/api/slug2id/route.ts | 54 +----------------- src/app/dashboard/[subdomain]/editor/page.tsx | 2 +- .../site/[site]/preview/[previewId]/page.tsx | 4 ++ src/components/dashboard/PagesManagerMenu.tsx | 2 +- src/lib/helpers.ts | 6 +- src/queries/page.server.ts | 55 ++++++++++++++++++- 7 files changed, 64 insertions(+), 61 deletions(-) diff --git a/src/app/api/redirection/route.ts b/src/app/api/redirection/route.ts index fdb41a19..f54f8b90 100644 --- a/src/app/api/redirection/route.ts +++ b/src/app/api/redirection/route.ts @@ -82,7 +82,7 @@ export async function GET(req: Request): Promise { if (IS_VERCEL_PREVIEW) { const path = new URL(link).pathname - redirect(`/_site/${character.handle}${path}`) + redirect(`/site/${character.handle}${path}`) } else { redirect(link) } diff --git a/src/app/api/slug2id/route.ts b/src/app/api/slug2id/route.ts index a5fea7b6..65c8e4cc 100644 --- a/src/app/api/slug2id/route.ts +++ b/src/app/api/slug2id/route.ts @@ -1,57 +1,5 @@ -import { getNoteSlug } from "~/lib/helpers" -import { cacheDelete, cacheGet } from "~/lib/redis.server" import { NextServerResponse, getQuery } from "~/lib/server-helper" - -export async function getIdBySlug(slug: string, characterId: string | number) { - slug = (slug as string)?.toLowerCase?.() - - const result = (await cacheGet({ - key: ["slug2id", characterId, slug], - getValueFun: async () => { - let note - let cursor = "" - - do { - const response = await ( - await fetch( - `https://indexer.crossbell.io/v1/notes?characterId=${characterId}&sources=xlog&cursor=${cursor}&limit=100`, - ) - ).json() - cursor = response.cursor - note = response?.list?.find( - (item: any) => - slug === getNoteSlug(item) || - slug === `${characterId}-${item.noteId}`, - ) - } while (!note && cursor) - - return { - noteId: note?.noteId, - } - }, - noUpdate: true, - })) as { - noteId: number - } - - // revalidate - if (result) { - const noteIdMatch = slug.match(`^${characterId}-(\\d+)$`) - if (!noteIdMatch?.[1]) { - fetch( - `https://indexer.crossbell.io/v1/characters/${characterId}/notes/${result.noteId}`, - ) - .then((res) => res.json()) - .then((note) => { - if ((note && getNoteSlug(note) !== slug) || note.deleted) { - cacheDelete(["slug2id", characterId + "", slug]) - } - }) - } - } - - return result -} +import { getIdBySlug } from "~/queries/page.server" // GET /api/slug2id?characterId=52055&slug=note-144 export async function GET(req: Request): Promise { diff --git a/src/app/dashboard/[subdomain]/editor/page.tsx b/src/app/dashboard/[subdomain]/editor/page.tsx index 9fd4589f..1fd82633 100644 --- a/src/app/dashboard/[subdomain]/editor/page.tsx +++ b/src/app/dashboard/[subdomain]/editor/page.tsx @@ -505,7 +505,7 @@ export default function SubdomainEditor() { const onPreviewButtonClick = useCallback(() => { window.open( - `/_site/${subdomain}/preview/${draftKey.replace( + `/site/${subdomain}/preview/${draftKey.replace( `draft-${site.data?.characterId}-`, "", )}`, diff --git a/src/app/site/[site]/preview/[previewId]/page.tsx b/src/app/site/[site]/preview/[previewId]/page.tsx index e1e9bc62..96f672bf 100644 --- a/src/app/site/[site]/preview/[previewId]/page.tsx +++ b/src/app/site/[site]/preview/[previewId]/page.tsx @@ -17,6 +17,10 @@ export default function SitePreviewPage({ const page = useGetPage({ characterId: site.data?.characterId, + noteId: + params.previewId && /\d+/.test(params.previewId) + ? +params.previewId + : undefined, slug: params.previewId, useStat: true, }) diff --git a/src/components/dashboard/PagesManagerMenu.tsx b/src/components/dashboard/PagesManagerMenu.tsx index a0659a69..3a6d4ec9 100644 --- a/src/components/dashboard/PagesManagerMenu.tsx +++ b/src/components/dashboard/PagesManagerMenu.tsx @@ -158,7 +158,7 @@ export const PagesManagerMenu: FC<{ onClick() { const slug = getNoteSlugFromNote(page) if (!slug) return - window.open(`/_site/${subdomain}/${slug}`) + window.open(`/site/${subdomain}/${slug}`) }, }, { diff --git a/src/lib/helpers.ts b/src/lib/helpers.ts index 5eb950e4..e8bc3379 100644 --- a/src/lib/helpers.ts +++ b/src/lib/helpers.ts @@ -15,7 +15,7 @@ export const getSiteLink = ({ subdomain: string noProtocol?: boolean }) => { - if (IS_VERCEL_PREVIEW) return `/_site/${subdomain}` + if (IS_VERCEL_PREVIEW) return `/site/${subdomain}` if (domain) { return `https://${domain}` @@ -30,11 +30,11 @@ export const getSiteLink = ({ export const getSlugUrl = (slug: string) => { if (!isServerSide() && IS_VERCEL_PREVIEW) { const pathArr = new URL(location.href).pathname.split("/").filter(($) => $) - const indicatorIndex = pathArr.findIndex(($) => $ === "_site") + const indicatorIndex = pathArr.findIndex(($) => $ === "site") if (-~indicatorIndex) { const handle = pathArr[indicatorIndex + 1] - return `/_site/${handle}${slug}` + return `/site/${handle}${slug}` } } diff --git a/src/queries/page.server.ts b/src/queries/page.server.ts index a6249ae2..3ad4b48b 100644 --- a/src/queries/page.server.ts +++ b/src/queries/page.server.ts @@ -1,10 +1,61 @@ import { QueryClient } from "@tanstack/react-query" -import { getIdBySlug } from "~/app/api/slug2id/route" import { getSummary } from "~/app/api/summary/route" -import { cacheGet } from "~/lib/redis.server" +import { getNoteSlug } from "~/lib/helpers" +import { cacheDelete, cacheGet } from "~/lib/redis.server" import * as pageModel from "~/models/page.model" +export async function getIdBySlug(slug: string, characterId: string | number) { + slug = (slug as string)?.toLowerCase?.() + + const result = (await cacheGet({ + key: ["slug2id", characterId, slug], + getValueFun: async () => { + let note + let cursor = "" + + do { + const response = await ( + await fetch( + `https://indexer.crossbell.io/v1/notes?characterId=${characterId}&sources=xlog&cursor=${cursor}&limit=100`, + ) + ).json() + cursor = response.cursor + note = response?.list?.find( + (item: any) => + slug === getNoteSlug(item) || + slug === `${characterId}-${item.noteId}`, + ) + } while (!note && cursor) + + return { + noteId: note?.noteId, + } + }, + noUpdate: true, + })) as { + noteId: number + } + + // revalidate + if (result) { + const noteIdMatch = slug.match(`^${characterId}-(\\d+)$`) + if (!noteIdMatch?.[1]) { + fetch( + `https://indexer.crossbell.io/v1/characters/${characterId}/notes/${result.noteId}`, + ) + .then((res) => res.json()) + .then((note) => { + if ((note && getNoteSlug(note) !== slug) || note.deleted) { + cacheDelete(["slug2id", characterId + "", slug]) + } + }) + } + } + + return result +} + export const fetchGetPage = async ( input: Partial[0]>, queryClient: QueryClient,