From cda08a9843b2e0dc739da3d56f46105952084134 Mon Sep 17 00:00:00 2001 From: Taran Vohra Date: Mon, 21 Oct 2024 15:54:29 +0530 Subject: [PATCH] Add support for search in a sections site (#2541) --- .changeset/lovely-lies-complain.md | 5 + bun.lockb | Bin 580040 -> 579648 bytes packages/gitbook/package.json | 2 +- .../src/components/Search/SearchResults.tsx | 8 +- .../src/components/Search/server-actions.tsx | 89 ++++++++++++------ packages/gitbook/src/lib/api.ts | 11 +-- packages/react-contentkit/package.json | 2 +- 7 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 .changeset/lovely-lies-complain.md diff --git a/.changeset/lovely-lies-complain.md b/.changeset/lovely-lies-complain.md new file mode 100644 index 000000000..c8df9e3d5 --- /dev/null +++ b/.changeset/lovely-lies-complain.md @@ -0,0 +1,5 @@ +--- +'gitbook': minor +--- + +Add support for searching results in a sections site diff --git a/bun.lockb b/bun.lockb index ee93c9e0592d5cbb3577504b1235b7d98362c4ca..61c39c34ad1773b8786827bddf8ea3863a229d0c 100755 GIT binary patch delta 40613 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 delta 40803 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 diff --git a/packages/gitbook/package.json b/packages/gitbook/package.json index 8a095c00f..3c4f61568 100644 --- a/packages/gitbook/package.json +++ b/packages/gitbook/package.json @@ -16,7 +16,7 @@ "clean": "rm -rf ./.next && rm -rf ./public/~gitbook/static" }, "dependencies": { - "@gitbook/api": "^0.71.0", + "@gitbook/api": "^0.72.0", "@gitbook/cache-do": "workspace:*", "@gitbook/emoji-codepoints": "workspace:*", "@gitbook/icons": "workspace:*", diff --git a/packages/gitbook/src/components/Search/SearchResults.tsx b/packages/gitbook/src/components/Search/SearchResults.tsx index 023f109df..edfd13f69 100644 --- a/packages/gitbook/src/components/Search/SearchResults.tsx +++ b/packages/gitbook/src/components/Search/SearchResults.tsx @@ -12,8 +12,8 @@ import { SearchSectionResultItem } from './SearchSectionResultItem'; import { getRecommendedQuestions, OrderedComputedResult, - searchCurrentSpaceContent, - searchSiteContent, + searchSiteSpaceContent, + searchAllSiteContent, } from './server-actions'; import { Loading } from '../primitives'; @@ -95,8 +95,8 @@ export const SearchResults = React.forwardRef(function SearchResults( setCursor(null); const fetchedResults = await (global - ? searchSiteContent({ query, pointer }) - : searchCurrentSpaceContent(query, pointer, revisionId)); + ? searchAllSiteContent(query, pointer) + : searchSiteSpaceContent(query, pointer, revisionId)); setResults(withAsk ? withQuestionResult(fetchedResults, query) : fetchedResults); }, 350); diff --git a/packages/gitbook/src/components/Search/server-actions.tsx b/packages/gitbook/src/components/Search/server-actions.tsx index cf60df8ac..efc626b98 100644 --- a/packages/gitbook/src/components/Search/server-actions.tsx +++ b/packages/gitbook/src/components/Search/server-actions.tsx @@ -2,6 +2,7 @@ import { RevisionPage, SearchAIAnswer, SearchPageResult, SiteSpace, Space } from '@gitbook/api'; import * as React from 'react'; +import { assert } from 'ts-essentials'; import { streamResponse } from '@/lib/actions'; import * as api from '@/lib/api'; @@ -45,47 +46,61 @@ export interface AskAnswerResult { } /** - * Search for content in the entire site. + * Search for content in a site by scoping the search to all content, a specific spaces or current space. */ -export async function searchSiteContent(args: { +async function searchSiteContent(args: { pointer: api.SiteContentPointer; query: string; - siteSpaceIds?: string[]; + scope: + | { mode: 'all' } + | { mode: 'current'; siteSpaceId: string } + | { mode: 'specific'; siteSpaceIds: string[] }; cacheBust?: string; }): Promise { - const { pointer, siteSpaceIds, query, cacheBust } = args; + const { pointer, scope, query, cacheBust } = args; if (query.length <= 1) { return []; } - if (siteSpaceIds?.length === 0) { - // if we have no siteSpaces to search in then we won't find anything. skip the call. - return []; - } + const needsStructure = + scope.mode === 'all' || + scope.mode === 'current' || + (scope.mode === 'specific' && scope.siteSpaceIds.length > 1); - const [searchResults, allSiteSpaces] = await Promise.all([ - api.searchSiteContent( - pointer.organizationId, - pointer.siteId, - query, - siteSpaceIds, - cacheBust, - ), - siteSpaceIds - ? null - : api.getSiteSpaces({ + const [searchResults, siteStructure] = 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, ]); - if (!siteSpaceIds) { + const siteSpaces = siteStructure + ? siteStructure.type === 'siteSpaces' + ? siteStructure.structure + : siteStructure.structure.reduce((prev, section) => { + const sectionSiteSpaces = section.siteSpaces.map((siteSpace) => ({ + ...siteSpace, + space: { + ...siteSpace.space, + title: section.title + ' › ' + siteSpace.space.title, + }, + })); + + prev.push(...sectionSiteSpaces); + return prev; + }, []) + : null; + + if (siteSpaces) { // We are searching all of this Site's content return searchResults.items .map((spaceItem) => { - const siteSpace = allSiteSpaces?.find( + const siteSpace = siteSpaces.find( (siteSpace) => siteSpace.space.id === spaceItem.id, ); @@ -102,21 +117,39 @@ export async function searchSiteContent(args: { } /** - * Server action to search content in the current space + * Server action to search content in the entire site. */ -export async function searchCurrentSpaceContent( +export async function searchAllSiteContent( + query: string, + pointer: api.SiteContentPointer, +): Promise { + return await searchSiteContent({ + pointer, + query, + scope: { mode: 'all' }, + }); +} + +/** + * Server action to search content in a space. + */ +export async function searchSiteSpaceContent( query: string, pointer: api.SiteContentPointer, revisionId: string, ): Promise { - const siteSpaceIds = pointer.siteSpaceId ? [pointer.siteSpaceId] : []; // if we don't have a siteSpaceID search all content + const siteSpaceId = pointer.siteSpaceId; + assert(siteSpaceId, 'Expected siteSpaceId for searchSiteSpaceContent'); - // This is a site so use a different function which we can eventually call directly - // We also want to break cache for this specific space if the revisionId is different so use it as a cache busting key return await searchSiteContent({ pointer, - siteSpaceIds, query, + // If we have a siteSectionId that means its a sections site use `current` mode + // which searches in the current space + all default spaces of sections + scope: pointer.siteSectionId + ? { mode: 'current', siteSpaceId } + : { mode: 'specific', siteSpaceIds: [siteSpaceId] }, + // We want to break cache for this specific space if the revisionId is different so use it as a cache busting key cacheBust: revisionId, }); } diff --git a/packages/gitbook/src/lib/api.ts b/packages/gitbook/src/lib/api.ts index 3dcb62bd3..6b388631d 100644 --- a/packages/gitbook/src/lib/api.ts +++ b/packages/gitbook/src/lib/api.ts @@ -1058,7 +1058,10 @@ export const searchSiteContent = cache({ organizationId: string, siteId: string, query: string, - siteSpaceIds?: string[], + scope: + | { mode: 'all' } + | { mode: 'current'; siteSpaceId: string } + | { mode: 'specific'; siteSpaceIds: string[] }, /** A cache bust param to avoid revalidating lot of cache entries by tags */ cacheBust?: string, options?: CacheFunctionOptions, @@ -1068,11 +1071,7 @@ export const searchSiteContent = cache({ siteId, { query, - ...(siteSpaceIds && siteSpaceIds.length > 0 - ? { siteSpaceIds } - : { - mode: 'all', - }), + ...scope, }, undefined, { diff --git a/packages/react-contentkit/package.json b/packages/react-contentkit/package.json index 41d1e750e..62f2ffafa 100644 --- a/packages/react-contentkit/package.json +++ b/packages/react-contentkit/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "classnames": "^2.5.1", - "@gitbook/api": "^0.66.0", + "@gitbook/api": "^0.72.0", "assert-never": "^1.2.1" }, "peerDependencies": {