From b6394338ee47e1ec5099e951fbbc9af4583ee266 Mon Sep 17 00:00:00 2001 From: taranvohra Date: Thu, 14 Nov 2024 15:47:06 +0530 Subject: [PATCH 1/4] bump api client --- bun.lockb | Bin 569592 -> 569208 bytes packages/gitbook/package.json | 2 +- packages/react-contentkit/package.json | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bun.lockb b/bun.lockb index 5f010c7dda62f8d08cbf35c6f3f0eefa33fb9442..2ec7b80ac4a817f6e7076137b97ac818c52d8409 100755 GIT binary patch delta 47481 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 delta 47932 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 Date: Thu, 14 Nov 2024 17:45:47 +0530 Subject: [PATCH 2/4] WIP: use getPublishedContentSite --- .../(content)/[[...pathname]]/not-found.tsx | 4 +- .../(site)/(content)/[[...pathname]]/page.tsx | 2 +- .../src/app/(site)/(core)/robots.txt/route.ts | 3 +- packages/gitbook/src/app/(site)/fetch.ts | 118 +---------- packages/gitbook/src/app/(site)/layout.tsx | 4 +- .../src/app/(space)/~gitbook/pdf/layout.tsx | 8 +- .../DocumentView/BlockContentRef.tsx | 2 +- .../gitbook/src/components/Header/Header.tsx | 2 +- .../src/components/Search/server-actions.tsx | 11 +- .../components/SpaceLayout/SpaceLayout.tsx | 3 +- packages/gitbook/src/lib/api.ts | 196 ++++++++---------- packages/gitbook/src/middleware.ts | 12 +- 12 files changed, 127 insertions(+), 238 deletions(-) diff --git a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx index 797d6af8f2..304451dffd 100644 --- a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx +++ b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx @@ -1,11 +1,11 @@ import { getSpaceLanguage, t } from '@/intl/server'; -import { getSiteLayoutData } from '@/lib/api'; +import { getCurrentSiteCustomization } from '@/lib/api'; import { getSiteContentPointer } from '@/lib/pointer'; import { tcls } from '@/lib/tailwind'; export default async function NotFound() { const pointer = getSiteContentPointer(); - const { customization } = await getSiteLayoutData(pointer); + const customization = await getCurrentSiteCustomization(pointer); const language = getSpaceLanguage(customization); diff --git a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/page.tsx b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/page.tsx index c36214e341..516fc78677 100644 --- a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/page.tsx +++ b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/page.tsx @@ -73,7 +73,7 @@ export default async function Page(props: { page, }; - const withSections = Boolean(sections && sections.length > 0); + const withSections = Boolean(sections && sections.list.length > 0); const headerOffset = { sectionsHeader: withSections, topHeader: withTopHeader }; return ( diff --git a/packages/gitbook/src/app/(site)/(core)/robots.txt/route.ts b/packages/gitbook/src/app/(site)/(core)/robots.txt/route.ts index 9e39759e94..08ec1b783c 100644 --- a/packages/gitbook/src/app/(site)/(core)/robots.txt/route.ts +++ b/packages/gitbook/src/app/(site)/(core)/robots.txt/route.ts @@ -1,7 +1,6 @@ -import { ContentVisibility } from '@gitbook/api'; import { NextRequest } from 'next/server'; -import { getCollection, getSite, getSpace } from '@/lib/api'; +import { getSpace, getSite } from '@/lib/api'; import { absoluteHref } from '@/lib/links'; import { getSiteContentPointer } from '@/lib/pointer'; import { isSpaceIndexable } from '@/lib/seo'; diff --git a/packages/gitbook/src/app/(site)/fetch.ts b/packages/gitbook/src/app/(site)/fetch.ts index 2270fba780..3c6b118875 100644 --- a/packages/gitbook/src/app/(site)/fetch.ts +++ b/packages/gitbook/src/app/(site)/fetch.ts @@ -1,14 +1,11 @@ -import { RevisionPage, SiteSection, SiteSpace, Space } from '@gitbook/api'; -import { assert } from 'ts-essentials'; +import { RevisionPage } from '@gitbook/api'; import { getRevisionPageByPath, getDocument, ContentTarget, + getSpaceContentData, getSiteData, - getSite, - getCurrentSiteCustomization, - getSiteStructure, } from '@/lib/api'; import { resolvePagePath, resolvePageId } from '@/lib/pages'; import { getSiteContentPointer } from '@/lib/pointer'; @@ -21,35 +18,18 @@ export interface PageIdParams { pageId: string; } -export type SectionsList = { list: SiteSection[]; section: SiteSection; index: number }; - /** * Fetch all the data needed to render the content layout. */ export async function fetchContentData() { const content = getSiteContentPointer(); - const [{ space, contentTarget, pages, customization, scripts }, siteStructure] = + const [{ space, contentTarget, pages }, { customization, site, sections, spaces, scripts }] = await Promise.all([ + getSpaceContentData(content, content.siteShareKey), getSiteData(content), - fetchSiteStructure({ - organizationId: content.organizationId, - siteId: content.siteId, - siteShareKey: content.siteShareKey, - }), ]); - const site = siteStructure.site; - - const siteSections = - content.siteSectionId && siteStructure.sections - ? parseSiteSectionsList(content.siteSectionId, siteStructure.sections) - : null; - - const spaces = - siteStructure.spaces ?? - (siteSections ? parseSpacesFromSiteSpaces(siteSections.section.siteSpaces) : []); - // we grab the space attached to the parent as it contains overriden customizations const spaceRelativeToParent = spaces?.find((space) => space.id === content.spaceId); @@ -58,8 +38,8 @@ export async function fetchContentData() { contentTarget, space: spaceRelativeToParent ?? space, pages, - sections: siteSections, site, + sections, spaces, customization, scripts, @@ -67,44 +47,21 @@ export async function fetchContentData() { }; } -function parseSiteSectionsList(siteSectionId: string, sections: SiteSection[]) { - const section = sections.find((section) => section.id === siteSectionId); - assert(sectionIsDefined(section), 'A section must be defined when there are multiple sections'); - return { list: sections, section, index: sections.indexOf(section) } satisfies SectionsList; -} - -function sectionIsDefined(section?: SiteSection): section is NonNullable { - return typeof section !== 'undefined' && section !== null; -} - /** * Fetch all the data needed to render the content. * Optimized to fetch in parallel as much as possible. */ export async function fetchPageData(params: PagePathParams | PageIdParams) { - const content = getSiteContentPointer(); + const contentData = await fetchContentData(); - const { space, contentTarget, pages, customization, scripts } = await getSiteData(content); - const page = await resolvePage(contentTarget, pages, params); - const [siteStructure, document] = await Promise.all([ - fetchSiteStructure({ - organizationId: content.organizationId, - siteId: content.siteId, - siteShareKey: content.siteShareKey, - }), - page?.page.documentId ? getDocument(space.id, page.page.documentId) : null, - ]); + const page = await resolvePage(contentData.contentTarget, contentData.pages, params); + const document = page?.page.documentId + ? await getDocument(contentData.space.id, page.page.documentId) + : null; return { - content, - contentTarget, - space, - pages, - customization, - scripts, - ancestors: [], + ...contentData, ...page, - ...siteStructure, document, }; } @@ -150,59 +107,6 @@ async function resolvePage( return undefined; } -/** - * Fetch the structure of an organization site. - * This includes the site and its sections or spaces. - */ -async function fetchSiteStructure(args: { - organizationId: string; - siteId: string; - siteShareKey: string | undefined; -}) { - const { organizationId, siteId, siteShareKey } = args; - const [orgSite, siteStructure, siteParentCustomizations] = await Promise.all([ - getSite(organizationId, siteId), - getSiteStructure({ organizationId, siteId, siteShareKey }), - getCurrentSiteCustomization({ organizationId, siteId, siteSpaceId: undefined }), - ]); - - const siteSections = - siteStructure.type === 'sections' && siteStructure.structure - ? siteStructure.structure - : null; - const siteSpaces = - siteStructure.type === 'siteSpaces' && siteStructure.structure - ? parseSpacesFromSiteSpaces(siteStructure.structure) - : null; - - // override the title with the customization title - const site = { - ...orgSite, - ...(siteParentCustomizations?.title ? { title: siteParentCustomizations.title } : {}), - }; - - return { - site, - spaces: siteSpaces, - sections: siteSections, - }; -} - -function parseSpacesFromSiteSpaces(siteSpaces: SiteSpace[]) { - const spaces: Record = {}; - siteSpaces.forEach((siteSpace) => { - spaces[siteSpace.space.id] = { - ...siteSpace.space, - title: siteSpace.title ?? siteSpace.space.title, - urls: { - ...siteSpace.space.urls, - published: siteSpace.urls.published, - }, - }; - }); - return Object.values(spaces); -} - /** * Get the page path from the params. */ diff --git a/packages/gitbook/src/app/(site)/layout.tsx b/packages/gitbook/src/app/(site)/layout.tsx index 0b28075270..5746c72256 100644 --- a/packages/gitbook/src/app/(site)/layout.tsx +++ b/packages/gitbook/src/app/(site)/layout.tsx @@ -1,5 +1,5 @@ import { CustomizationRootLayout } from '@/components/RootLayout'; -import { getSiteLayoutData } from '@/lib/api'; +import { getSiteData } from '@/lib/api'; import { getSiteContentPointer } from '@/lib/pointer'; /** @@ -10,7 +10,7 @@ export default async function SiteRootLayout(props: { children: React.ReactNode const { children } = props; const pointer = getSiteContentPointer(); - const { customization } = await getSiteLayoutData(pointer); + const { customization } = await getSiteData(pointer); return ( {children} diff --git a/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx index 7fbf52e303..369244ce98 100644 --- a/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx +++ b/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx @@ -1,7 +1,7 @@ import { SpaceIntegrationScript } from '@gitbook/api'; import { CustomizationRootLayout } from '@/components/RootLayout'; -import { getSiteLayoutData, getSpaceCustomization } from '@/lib/api'; +import { getCurrentSiteCustomization, getSpaceCustomization } from '@/lib/api'; import { getSiteOrSpacePointerForPDF } from './pointer'; @@ -13,10 +13,12 @@ export default async function PDFRootLayout(props: { children: React.ReactNode } const { children } = props; const pointer = getSiteOrSpacePointerForPDF(); - const { customization } = await ('siteId' in pointer - ? getSiteLayoutData(pointer) + const data = await ('siteId' in pointer + ? getCurrentSiteCustomization(pointer) : getSpaceLayoutData(pointer.spaceId)); + const customization = 'customization' in data ? data.customization : data; + return ( {children} ); diff --git a/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx b/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx index 5a9ae61dd3..0934eb56a9 100644 --- a/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx +++ b/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx @@ -48,7 +48,7 @@ async function SpaceRefCard( return null; } - const spaceCustomization = await ignoreAPIError(getSpaceCustomization(spaceId)); + const spaceCustomization = getSpaceCustomization(spaceId); const customFavicon = spaceCustomization?.favicon; const customEmoji = customFavicon && 'emoji' in customFavicon ? customFavicon.emoji : undefined; const customIcon = customFavicon && 'icon' in customFavicon ? customFavicon.icon : undefined; diff --git a/packages/gitbook/src/components/Header/Header.tsx b/packages/gitbook/src/components/Header/Header.tsx index a08a797d75..d8664adcf0 100644 --- a/packages/gitbook/src/components/Header/Header.tsx +++ b/packages/gitbook/src/components/Header/Header.tsx @@ -2,9 +2,9 @@ import { CustomizationSettings, Site, SiteCustomizationSettings, Space } from '@ import { CustomizationHeaderPreset } from '@gitbook/api'; import { Suspense } from 'react'; -import type { SectionsList } from '@/app/(site)/fetch'; import { CONTAINER_STYLE, HEADER_HEIGHT_DESKTOP } from '@/components/layout'; import { t, getSpaceLanguage } from '@/intl/server'; +import type { SectionsList } from '@/lib/api'; import { ContentRefContext } from '@/lib/references'; import { tcls } from '@/lib/tailwind'; diff --git a/packages/gitbook/src/components/Search/server-actions.tsx b/packages/gitbook/src/components/Search/server-actions.tsx index efc626b984..01c6855261 100644 --- a/packages/gitbook/src/components/Search/server-actions.tsx +++ b/packages/gitbook/src/components/Search/server-actions.tsx @@ -68,16 +68,11 @@ async function searchSiteContent(args: { scope.mode === 'current' || (scope.mode === 'specific' && scope.siteSpaceIds.length > 1); - const [searchResults, siteStructure] = await Promise.all([ + const [searchResults, siteData] = await Promise.all([ api.searchSiteContent(pointer.organizationId, pointer.siteId, query, scope, cacheBust), - needsStructure - ? api.getSiteStructure({ - organizationId: pointer.organizationId, - siteId: pointer.siteId, - siteShareKey: pointer.siteShareKey, - }) - : null, + needsStructure ? api.getSiteData(pointer) : null, ]); + const siteStructure = siteData?.structure; const siteSpaces = siteStructure ? siteStructure.type === 'siteSpaces' diff --git a/packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx b/packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx index 575e42a1df..9704e1784a 100644 --- a/packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx +++ b/packages/gitbook/src/components/SpaceLayout/SpaceLayout.tsx @@ -10,14 +10,13 @@ import { } from '@gitbook/api'; import React from 'react'; -import { SectionsList } from '@/app/(site)/fetch'; import { Footer } from '@/components/Footer'; import { CompactHeader, Header } from '@/components/Header'; import { CONTAINER_STYLE } from '@/components/layout'; import { ColorDebugger } from '@/components/primitives/ColorDebugger'; import { SearchModal } from '@/components/Search'; import { TableOfContents } from '@/components/TableOfContents'; -import { ContentTarget, SiteContentPointer } from '@/lib/api'; +import { ContentTarget, type SectionsList, SiteContentPointer } from '@/lib/api'; import { ContentRefContext } from '@/lib/references'; import { tcls } from '@/lib/tailwind'; diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index 427b239473..1170a36d3b 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -13,11 +13,14 @@ import { RevisionFile, SiteCustomizationSettings, RevisionReusableContent, + SiteSpace, + Space, + SiteSection, } from '@gitbook/api'; import assertNever from 'assert-never'; import { headers } from 'next/headers'; import rison from 'rison'; -import { DeepPartial } from 'ts-essentials'; +import { assert, DeepPartial } from 'ts-essentials'; import { batch } from './async'; import { buildVersion } from './build'; @@ -724,126 +727,34 @@ export const getSite = cache({ }); /** - * List all the site-spaces variants published in a site. + * List the scripts to load for the site. */ -export const getSiteSpaces = cache({ - name: 'api.getSiteSpaces', - tag: ({ siteId }) => getAPICacheTag({ tag: 'site', site: siteId }), - get: async ( - args: { - organizationId: string; - siteId: string; - /** Site share key that can be used as context to resolve site space published urls */ - siteShareKey: string | undefined; - }, - options: CacheFunctionOptions, - ) => { - const response = await getAll((params) => - api().orgs.listSiteSpaces( - args.organizationId, - args.siteId, - { - ...params, - ...(args.siteShareKey ? { shareKey: args.siteShareKey } : {}), - }, - { - ...noCacheFetchOptions, - signal: options.signal, - }, - ), - ); - - return cacheResponse(response, { - revalidateBefore: 60 * 60, - data: response.data.items.map((siteSpace) => siteSpace), - }); - }, -}); - -export const getSiteStructure = cache({ - name: 'api.getSiteStructure', - tag: ({ siteId }) => getAPICacheTag({ tag: 'site', site: siteId }), +export const getPublishedContentSite = cache({ + name: 'api.getPublishedContentSite', + tag: (organizationId, siteId) => getAPICacheTag({ tag: 'site', site: siteId }), get: async ( - args: { - organizationId: string; - siteId: string; - /** Site share key that can be used as context to resolve site space published urls */ - siteShareKey: string | undefined; - }, + organizationId: string, + siteId: string /** Site share key that can be used as context to resolve site space published urls */, + siteShareKey: string | undefined, options: CacheFunctionOptions, ) => { - const response = await api().orgs.getSiteStructure( - args.organizationId, - args.siteId, + const response = await api().orgs.getPublishedContentSite( + organizationId, + siteId, { - ...(args.siteShareKey ? { shareKey: args.siteShareKey } : {}), + shareKey: siteShareKey, }, { ...noCacheFetchOptions, signal: options.signal, }, ); - return cacheResponse(response, { - revalidateBefore: 60 * 60, - data: response.data, - }); - }, -}); - -/** - * List the scripts to load for the site. - */ -export const getSiteIntegrationScripts = cache({ - name: 'api.getSiteIntegrationScripts', - tag: (organizationId, siteId) => getAPICacheTag({ tag: 'site', site: siteId }), - get: async (organizationId: string, siteId: string, options: CacheFunctionOptions) => { - const response = await api().orgs.listSiteIntegrationScripts(organizationId, siteId, { - ...noCacheFetchOptions, - signal: options.signal, - }); return cacheResponse(response, { revalidateBefore: 60 * 60, }); }, }); -/** - * Fetch all the data to render the current site at once. - */ -export async function getSiteData(pointer: SiteContentPointer) { - const [{ space, pages, contentTarget }, { customization, scripts }] = await Promise.all([ - getSpaceContentData(pointer, pointer.siteShareKey), - getSiteLayoutData(pointer), - ]); - - return { - space, - pages, - contentTarget, - customization, - scripts, - }; -} - -/** - * Fetch all the layout data about the current site at once. - */ -export async function getSiteLayoutData(args: { - organizationId: string; - siteId: string; - siteSpaceId: string | undefined; -}) { - const [customization, scripts] = await Promise.all([ - getCurrentSiteCustomization(args), - getSiteIntegrationScripts(args.organizationId, args.siteId), - ]); - - return { - customization, - scripts, - }; -} - /** * Get the customization settings for the current site from the API. */ @@ -864,10 +775,85 @@ export async function getCurrentSiteCustomization(args: { }); } +export type SectionsList = { list: SiteSection[]; section: SiteSection; index: number }; + +function parseSpacesFromSiteSpaces(siteSpaces: SiteSpace[]) { + const spaces: Record = {}; + siteSpaces.forEach((siteSpace) => { + spaces[siteSpace.space.id] = { + ...siteSpace.space, + title: siteSpace.title ?? siteSpace.space.title, + urls: { + ...siteSpace.space.urls, + published: siteSpace.urls.published, + }, + }; + }); + return Object.values(spaces); +} + +function parseSiteSectionsList(siteSectionId: string, sections: SiteSection[]) { + const section = sections.find((section) => section.id === siteSectionId); + assert(section, 'A section must be defined when there are multiple sections'); + return { list: sections, section, index: sections.indexOf(section) } satisfies SectionsList; +} + +/** + * This function fetches the published content site data to render the published + * experience for the site (structure, customizations, scripts etc) + */ +export async function getSiteData( + pointer: Pick< + SiteContentPointer, + 'organizationId' | 'siteId' | 'siteSectionId' | 'siteSpaceId' | 'siteShareKey' + >, +) { + const { + site: orgSite, + structure: siteStructure, + customizations, + scripts, + } = await getPublishedContentSite(pointer.organizationId, pointer.siteId, pointer.siteShareKey); + + const siteSections = + siteStructure.type === 'sections' && siteStructure.structure + ? siteStructure.structure + : null; + const siteSpaces = + siteStructure.type === 'siteSpaces' && siteStructure.structure + ? parseSpacesFromSiteSpaces(siteStructure.structure) + : null; + // override the title with the customization title + const site = { + ...orgSite, + ...(customizations.site?.title ? { title: customizations.site.title } : {}), + }; + + const sections = + pointer.siteSectionId && siteSections + ? parseSiteSectionsList(pointer.siteSectionId, siteSections) + : null; + const spaces = + siteSpaces ?? (sections ? parseSpacesFromSiteSpaces(sections.section.siteSpaces) : []); + + const customization = mergeCustomizationWithExtend( + pointer.siteSpaceId ? customizations.siteSpaces[pointer.siteSpaceId] : customizations.site, + ); + + return { + customization, + site, + structure: siteStructure, + sections, + spaces, + scripts, + }; +} + /** * Get the customization settings for a space from the API. */ -export async function getSpaceCustomization(spaceId: string): Promise { +export function getSpaceCustomization(spaceId: string): CustomizationSettings { const headersList = headers(); const raw = defaultCustomizationForSpace(); diff --git a/packages/gitbook/src/middleware.ts b/packages/gitbook/src/middleware.ts index 1b34603280..73ee347ecf 100644 --- a/packages/gitbook/src/middleware.ts +++ b/packages/gitbook/src/middleware.ts @@ -14,8 +14,8 @@ import { userAgent, withAPI, DEFAULT_API_ENDPOINT, - getSiteLayoutData, - getSite, + getPublishedContentSite, + getSiteData, } from '@/lib/api'; import { race } from '@/lib/async'; import { buildVersion } from '@/lib/build'; @@ -175,10 +175,12 @@ export async function middleware(request: NextRequest) { ); const { scripts } = await ('site' in resolved - ? getSiteLayoutData({ + ? getSiteData({ organizationId: resolved.organization, siteId: resolved.site, + siteSectionId: resolved.siteSection, siteSpaceId: resolved.siteSpace, + siteShareKey: resolved.shareKey, }) : { scripts: [] }); return getContentSecurityPolicy(scripts, nonce); @@ -480,7 +482,9 @@ async function lookupSiteOrSpaceInMultiIdMode( // Verify access to the site to avoid leaking cached data in this mode // (the cache is not dependend on the auth token, so it could leak data) if (source.kind === 'site') { - await withAPI(gitbookAPI, () => getSite.revalidate(decoded.organization, source.id)); + await withAPI(gitbookAPI, () => + getPublishedContentSite.revalidate(decoded.organization, source.id, undefined), + ); } const cookies: LookupCookies = { From 0c390b82223a49d0c91733f140278e41d26236f1 Mon Sep 17 00:00:00 2001 From: taranvohra Date: Thu, 14 Nov 2024 19:22:43 +0530 Subject: [PATCH 3/4] review --- .../(content)/[[...pathname]]/not-found.tsx | 4 +- .../app/(site)/(core)/~gitbook/icon/route.tsx | 6 +- .../src/app/(space)/~gitbook/pdf/layout.tsx | 10 +- .../src/app/(space)/~gitbook/pdf/page.tsx | 14 +- .../DocumentView/BlockContentRef.tsx | 2 +- packages/gitbook/src/lib/api.ts | 151 +++--------------- packages/gitbook/src/middleware.ts | 6 +- 7 files changed, 45 insertions(+), 148 deletions(-) diff --git a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx index 304451dffd..db85ac35d8 100644 --- a/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx +++ b/packages/gitbook/src/app/(site)/(content)/[[...pathname]]/not-found.tsx @@ -1,11 +1,11 @@ import { getSpaceLanguage, t } from '@/intl/server'; -import { getCurrentSiteCustomization } from '@/lib/api'; +import { getSiteData } from '@/lib/api'; import { getSiteContentPointer } from '@/lib/pointer'; import { tcls } from '@/lib/tailwind'; export default async function NotFound() { const pointer = getSiteContentPointer(); - const customization = await getCurrentSiteCustomization(pointer); + const { customization } = await getSiteData(pointer); const language = getSpaceLanguage(customization); diff --git a/packages/gitbook/src/app/(site)/(core)/~gitbook/icon/route.tsx b/packages/gitbook/src/app/(site)/(core)/~gitbook/icon/route.tsx index 24ea163cc5..98c98ed1a0 100644 --- a/packages/gitbook/src/app/(site)/(core)/~gitbook/icon/route.tsx +++ b/packages/gitbook/src/app/(site)/(core)/~gitbook/icon/route.tsx @@ -3,7 +3,7 @@ import { ImageResponse } from 'next/og'; import { NextRequest } from 'next/server'; import React from 'react'; -import { getCurrentSiteCustomization, getSite, getSpace } from '@/lib/api'; +import { getSite, getSiteData, getSpace } from '@/lib/api'; import { getEmojiForCode } from '@/lib/emojis'; import { getSiteContentPointer } from '@/lib/pointer'; import { tcls } from '@/lib/tailwind'; @@ -38,9 +38,9 @@ export async function GET(req: NextRequest) { const pointer = getSiteContentPointer(); const spaceId = pointer.spaceId; - const [space, customization] = await Promise.all([ + const [space, { customization }] = await Promise.all([ getSpace(spaceId, pointer.siteShareKey), - getCurrentSiteCustomization(pointer), + getSiteData(pointer), ]); const site = await getSite(pointer.organizationId, pointer.siteId); const contentTitle = getContentTitle(space, customization, site); diff --git a/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx b/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx index 369244ce98..3cf0609b73 100644 --- a/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx +++ b/packages/gitbook/src/app/(space)/~gitbook/pdf/layout.tsx @@ -1,7 +1,7 @@ import { SpaceIntegrationScript } from '@gitbook/api'; import { CustomizationRootLayout } from '@/components/RootLayout'; -import { getCurrentSiteCustomization, getSpaceCustomization } from '@/lib/api'; +import { getSiteData, getSpaceCustomization } from '@/lib/api'; import { getSiteOrSpacePointerForPDF } from './pointer'; @@ -13,12 +13,10 @@ export default async function PDFRootLayout(props: { children: React.ReactNode } const { children } = props; const pointer = getSiteOrSpacePointerForPDF(); - const data = await ('siteId' in pointer - ? getCurrentSiteCustomization(pointer) + const { customization } = await ('siteId' in pointer + ? getSiteData(pointer) : getSpaceLayoutData(pointer.spaceId)); - const customization = 'customization' in data ? data.customization : data; - return ( {children} ); @@ -28,7 +26,7 @@ export default async function PDFRootLayout(props: { children: React.ReactNode } * Fetch all the layout data about a space at once. */ async function getSpaceLayoutData(spaceId: string) { - const [customization, scripts] = await Promise.all([ + const [{ customization }, scripts] = await Promise.all([ getSpaceCustomization(spaceId), [] as SpaceIntegrationScript[], ]); diff --git a/packages/gitbook/src/app/(space)/~gitbook/pdf/page.tsx b/packages/gitbook/src/app/(space)/~gitbook/pdf/page.tsx index 56a2d3a342..7e9be1e7b5 100644 --- a/packages/gitbook/src/app/(space)/~gitbook/pdf/page.tsx +++ b/packages/gitbook/src/app/(space)/~gitbook/pdf/page.tsx @@ -21,7 +21,7 @@ import { getSpace, getSpaceCustomization, getSpaceContentData, - getCurrentSiteCustomization, + getSiteData, } from '@/lib/api'; import { pagePDFContainerId, PageHrefContext, absoluteHref } from '@/lib/links'; import { resolvePageId } from '@/lib/pages'; @@ -40,11 +40,9 @@ export const runtime = 'edge'; export async function generateMetadata(): Promise { const pointer = getSiteOrSpacePointerForPDF(); - const [space, customization] = await Promise.all([ + const [space, { customization }] = await Promise.all([ getSpace(pointer.spaceId, 'siteId' in pointer ? pointer.siteShareKey : undefined), - 'siteId' in pointer - ? getCurrentSiteCustomization(pointer) - : getSpaceCustomization(pointer.spaceId), + 'siteId' in pointer ? getSiteData(pointer) : getSpaceCustomization(pointer.spaceId), ]); return { @@ -67,10 +65,8 @@ export default async function PDFHTMLOutput(props: { searchParams: { [key: strin currentPDFUrl += '?' + searchParams.toString(); // Load the content, - const [customization, { space, contentTarget, pages: rootPages }] = await Promise.all([ - 'siteId' in pointer - ? getCurrentSiteCustomization(pointer) - : getSpaceCustomization(pointer.spaceId), + const [{ customization }, { space, contentTarget, pages: rootPages }] = await Promise.all([ + 'siteId' in pointer ? getSiteData(pointer) : getSpaceCustomization(pointer.spaceId), getSpaceContentData(pointer, 'siteId' in pointer ? pointer.siteShareKey : undefined), ]); const language = getSpaceLanguage(customization); diff --git a/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx b/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx index 0934eb56a9..6611cfabca 100644 --- a/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx +++ b/packages/gitbook/src/components/DocumentView/BlockContentRef.tsx @@ -48,7 +48,7 @@ async function SpaceRefCard( return null; } - const spaceCustomization = getSpaceCustomization(spaceId); + const { customization: spaceCustomization } = getSpaceCustomization(spaceId); const customFavicon = spaceCustomization?.favicon; const customEmoji = customFavicon && 'emoji' in customFavicon ? customFavicon.emoji : undefined; const customIcon = customFavicon && 'icon' in customFavicon ? customFavicon.icon : undefined; diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index 1170a36d3b..b9a7992bde 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -16,6 +16,7 @@ import { SiteSpace, Space, SiteSection, + PublishedSiteContent, } from '@gitbook/api'; import assertNever from 'assert-never'; import { headers } from 'next/headers'; @@ -134,22 +135,10 @@ export function withAPI(client: GitBookAPI, fn: () => Promise): Promise return apiSyncStorage.run(client, fn); } -// FIXME: Fix @gitbook/api types for PublishedSiteContentLookup -type SpaceContentLookup = { - kind: 'space'; - /** ID of the space matching. */ - space: string; - /** Identifier of the change request being previewed in this URL. */ - changeRequest?: string; - /** Identifier of the revision being previewed in this URL. */ - revision?: string; - /** Path of the content relative to the space */ - pathname: string; - /** Prefix of the path in the URL dedicated to the space */ - basePath: string; - /** Short-lived API token to fetch content related to the space in the context of the URL. */ - apiToken: string; -}; +type SpaceContentLookup = Pick< + PublishedSiteContent, + 'space' | 'changeRequest' | 'revision' | 'pathname' | 'basePath' | 'apiToken' +> & { kind: 'space' }; export type PublishedContentWithCache = | ((SpaceContentLookup | PublishedSiteContentLookup) & { @@ -631,84 +620,6 @@ export const getDocument = cache({ timeout: 20 * 1000, }); -/** - * Get the customization settings for a site-space from the API. - */ -const getSiteSpaceCustomizationFromAPI = cache({ - name: 'api.getSiteSpaceCustomizationById', - tag: (organizationId, siteId, siteSpaceId) => getAPICacheTag({ tag: 'site', site: siteId }), - get: async ( - organizationId: string, - siteId: string, - siteSpaceId: string, - options: CacheFunctionOptions, - ) => { - const response = await api().orgs.getSiteSpaceCustomizationById( - organizationId, - siteId, - siteSpaceId, - {}, - { - signal: options.signal, - ...noCacheFetchOptions, - }, - ); - return cacheResponse(response, { - revalidateBefore: 60 * 60, - }); - }, -}); - -/** - * Get the customization settings for a site from the API. - */ -const getSiteCustomizationFromAPI = cache({ - name: 'api.getSiteCustomizationById', - tag: (organizationId, siteId) => getAPICacheTag({ tag: 'site', site: siteId }), - get: async (organizationId: string, siteId: string, options: CacheFunctionOptions) => { - const response = await api().orgs.getSiteCustomizationById( - organizationId, - siteId, - {}, - { - signal: options.signal, - ...noCacheFetchOptions, - }, - ); - return cacheResponse(response, { - revalidateBefore: 60 * 60, - }); - }, -}); - -/** - * Get the customization settings for a site space from the API. - */ -async function getSiteSpaceCustomization(args: { - organizationId: string; - siteId: string; - siteSpaceId: string; -}): Promise { - const raw = await getSiteSpaceCustomizationFromAPI( - args.organizationId, - args.siteId, - args.siteSpaceId, - ); - - return mergeCustomizationWithExtend(raw); -} - -/** - * Get the customization settings for a site space from the API. - */ -async function getSiteCustomization(args: { - organizationId: string; - siteId: string; -}): Promise { - const raw = await getSiteCustomizationFromAPI(args.organizationId, args.siteId); - return mergeCustomizationWithExtend(raw); -} - /** * Get the infos about a site by its ID. */ @@ -727,22 +638,24 @@ export const getSite = cache({ }); /** - * List the scripts to load for the site. + * Get the published content site data for a site's published experience */ export const getPublishedContentSite = cache({ name: 'api.getPublishedContentSite', - tag: (organizationId, siteId) => getAPICacheTag({ tag: 'site', site: siteId }), + tag: ({ siteId }) => getAPICacheTag({ tag: 'site', site: siteId }), get: async ( - organizationId: string, - siteId: string /** Site share key that can be used as context to resolve site space published urls */, - siteShareKey: string | undefined, + args: { + organizationId: string; + siteId: string /** Site share key that can be used as context to resolve site space published urls */; + siteShareKey: string | undefined; + }, options: CacheFunctionOptions, ) => { const response = await api().orgs.getPublishedContentSite( - organizationId, - siteId, + args.organizationId, + args.siteId, { - shareKey: siteShareKey, + shareKey: args.siteShareKey, }, { ...noCacheFetchOptions, @@ -755,26 +668,6 @@ export const getPublishedContentSite = cache({ }, }); -/** - * Get the customization settings for the current site from the API. - */ -export async function getCurrentSiteCustomization(args: { - organizationId: string; - siteId: string; - siteSpaceId: string | undefined; -}): Promise { - return args.siteSpaceId - ? getSiteSpaceCustomization({ - organizationId: args.organizationId, - siteId: args.siteId, - siteSpaceId: args.siteSpaceId, - }) - : getSiteCustomization({ - organizationId: args.organizationId, - siteId: args.siteId, - }); -} - export type SectionsList = { list: SiteSection[]; section: SiteSection; index: number }; function parseSpacesFromSiteSpaces(siteSpaces: SiteSpace[]) { @@ -813,7 +706,11 @@ export async function getSiteData( structure: siteStructure, customizations, scripts, - } = await getPublishedContentSite(pointer.organizationId, pointer.siteId, pointer.siteShareKey); + } = await getPublishedContentSite({ + organizationId: pointer.organizationId, + siteId: pointer.siteId, + siteShareKey: pointer.siteShareKey, + }); const siteSections = siteStructure.type === 'sections' && siteStructure.structure @@ -853,7 +750,7 @@ export async function getSiteData( /** * Get the customization settings for a space from the API. */ -export function getSpaceCustomization(spaceId: string): CustomizationSettings { +export function getSpaceCustomization(spaceId: string): { customization: CustomizationSettings } { const headersList = headers(); const raw = defaultCustomizationForSpace(); @@ -861,7 +758,7 @@ export function getSpaceCustomization(spaceId: string): CustomizationSettings { if (extend) { try { const parsed = rison.decode_object>(extend); - return { ...raw, ...parsed }; + return { customization: { ...raw, ...parsed } }; } catch (error) { console.error( `Failed to parse x-gitbook-customization header (ignored): ${ @@ -871,7 +768,9 @@ export function getSpaceCustomization(spaceId: string): CustomizationSettings { } } - return raw; + return { + customization: raw, + }; } /** diff --git a/packages/gitbook/src/middleware.ts b/packages/gitbook/src/middleware.ts index 73ee347ecf..928dcd3231 100644 --- a/packages/gitbook/src/middleware.ts +++ b/packages/gitbook/src/middleware.ts @@ -483,7 +483,11 @@ async function lookupSiteOrSpaceInMultiIdMode( // (the cache is not dependend on the auth token, so it could leak data) if (source.kind === 'site') { await withAPI(gitbookAPI, () => - getPublishedContentSite.revalidate(decoded.organization, source.id, undefined), + getPublishedContentSite.revalidate({ + organizationId: decoded.organization, + siteId: source.id, + siteShareKey: undefined, + }), ); } From 8793338029f309bcad7683b9febd5b6146f94a80 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Samy=20Pess=C3=A9?= Date: Fri, 15 Nov 2024 09:02:56 +0100 Subject: [PATCH 4/4] Changeset --- .changeset/long-dryers-try.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/long-dryers-try.md diff --git a/.changeset/long-dryers-try.md b/.changeset/long-dryers-try.md new file mode 100644 index 0000000000..8382b6bbd5 --- /dev/null +++ b/.changeset/long-dryers-try.md @@ -0,0 +1,5 @@ +--- +'gitbook': patch +--- + +Optimize performances by using new API endpoint for fetching site data.