Skip to content

Commit

Permalink
Revert "chore: plumb new navigation record generation" (#1774)
Browse files Browse the repository at this point in the history
  • Loading branch information
RohinBhargava authored Nov 4, 2024
1 parent 891c83a commit 5d10763
Show file tree
Hide file tree
Showing 9 changed files with 63 additions and 168 deletions.
1 change: 0 additions & 1 deletion packages/fdr-sdk/src/converters/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,3 @@ export { SDKSnippetHolder } from "./db/snippets/SDKSnippetHolder";
export { migrateDocsDbDefinition } from "./db/upgrade/migrateDocsDbDefinition";
export { convertDbAPIDefinitionToRead, convertDbAPIDefinitionsToRead } from "./read/convertDbAPIDefinitionToRead";
export { convertDbDocsConfigToRead } from "./read/convertDbDocsConfigToRead";
export { convertDocsDefinitionToRead } from "./read/convertDocsDefinitionToRead";

This file was deleted.

3 changes: 0 additions & 3 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 0 additions & 1 deletion servers/fdr/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
"dependencies": {
"@aws-sdk/client-s3": "^3.335.0",
"@aws-sdk/s3-request-presigner": "^3.574.0",
"@fern-ui/fern-docs-search-server": "workspace:*",
"@fern-api/fdr-sdk": "workspace:*",
"@fern-api/github": "workspace:*",
"@fern-api/template-resolver": "workspace:*",
Expand Down
67 changes: 52 additions & 15 deletions servers/fdr/src/controllers/docs/v1/getDocsReadService.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,20 +6,18 @@ import {
DocsV1Read,
FdrAPI,
convertDbAPIDefinitionToRead,
convertDocsDefinitionToRead,
convertDbDocsConfigToRead,
migrateDocsDbDefinition,
visitDbNavigationConfig,
} from "@fern-api/fdr-sdk";
import { AuthType, type IndexSegment } from "@prisma/client";
import { keyBy } from "es-toolkit";
import { mapValues } from "lodash-es";
import { DocsV1ReadService } from "../../../api";
import { UnauthorizedError } from "../../../api/generated/api";
import { DomainNotRegisteredError } from "../../../api/generated/api/resources/docs/resources/v1/resources/read";
import type { FdrApplication } from "../../../app";
import { LoadDocsDefinitionByUrlResponse } from "../../../db";
import { readBuffer } from "../../../util";
import { getFilesV2 } from "../../../util/getFilesV2";

export function getDocsReadService(app: FdrApplication): DocsV1ReadService {
return new DocsV1ReadService({
Expand Down Expand Up @@ -129,22 +127,61 @@ export async function getDocsDefinition({
}),
]);

const bufferedApiDefinitionsById = keyBy(apiDefinitions, (def) => DocsV1Db.ApiDefinitionId(def.apiDefinitionId));

const filesV2 = await getFilesV2(docsDbDefinition, app);

const apiDefinitionsById = mapValues(bufferedApiDefinitionsById, (def) =>
convertDbApiDefinitionToRead(def.definition),
);

return convertDocsDefinitionToRead({
docsDbDefinition,
return {
algoliaSearchIndex: docsV2?.algoliaIndex ?? undefined,
config: convertDbDocsConfigToRead({ dbShape: docsDbDefinition.config }),
apis: Object.fromEntries(
apiDefinitions.map((apiDefinition) => {
const parsedApiDefinition = convertDbApiDefinitionToRead(apiDefinition.definition);
return [apiDefinition.apiDefinitionId, parsedApiDefinition];
}),
),
files: mapValues(filesV2, (fileV2) => fileV2.url),
jsFiles: docsDbDefinition.type === "v3" ? docsDbDefinition.jsFiles : undefined,
filesV2,
apis: apiDefinitionsById,
id: docsV2?.docsConfigInstanceId ?? undefined,
pages: docsDbDefinition.pages,
search: searchInfo,
});
id: docsV2?.docsConfigInstanceId ?? undefined,
};
}

async function getFilesV2(docsDbDefinition: DocsV1Db.DocsDefinitionDb, app: FdrApplication) {
let promisedFiles: Promise<[DocsV1Read.FileId, DocsV1Read.File_]>[];
if (docsDbDefinition.type === "v3") {
promisedFiles = Object.entries(docsDbDefinition.files).map(
async ([fileId, fileDbInfo]): Promise<[DocsV1Read.FileId, DocsV1Read.File_]> => {
const s3DownloadUrl = await app.services.s3.getPresignedDocsAssetsDownloadUrl({
key: fileDbInfo.s3Key,
isPrivate: true, // for backcompat
});
const readFile: DocsV1Read.File_ =
fileDbInfo.type === "image"
? {
type: "image",
url: s3DownloadUrl,
width: fileDbInfo.width,
height: fileDbInfo.height,
blurDataUrl: fileDbInfo.blurDataUrl,
alt: fileDbInfo.alt,
}
: { type: "url", url: s3DownloadUrl };
return [DocsV1Read.FileId(fileId), readFile];
},
);
} else {
promisedFiles = Object.entries(docsDbDefinition.files).map(
async ([fileId, fileDbInfo]): Promise<[DocsV1Read.FileId, DocsV1Read.File_]> => {
const s3DownloadUrl = await app.services.s3.getPresignedDocsAssetsDownloadUrl({
key: fileDbInfo.s3Key,
isPrivate: true, // for backcompat
});
return [DocsV1Read.FileId(fileId), { type: "url", url: s3DownloadUrl }];
},
);
}
return Object.fromEntries(await Promise.all(promisedFiles));
}

export async function loadIndexSegmentsAndGetSearchInfo({
Expand All @@ -171,7 +208,7 @@ export async function loadIndexSegmentsAndGetSearchInfo({
});
}

export function getSearchInfoFromDocs({
function getSearchInfoFromDocs({
algoliaIndex,
indexSegmentIds,
activeIndexSegments,
Expand Down
82 changes: 9 additions & 73 deletions servers/fdr/src/controllers/docs/v2/getDocsWriteV2Service.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,21 @@
import {
APIV1Db,
convertDbAPIDefinitionToRead,
convertDocsDefinitionToDb,
convertDocsDefinitionToRead,
DocsV1Db,
DocsV1Write,
FdrAPI,
FernNavigation,
} from "@fern-api/fdr-sdk";
import { APIV1Db, convertDocsDefinitionToDb, DocsV1Db, DocsV1Write, FdrAPI } from "@fern-api/fdr-sdk";
import { isNonNullish } from "@fern-api/ui-core-utils";
import { generateAlgoliaRecords } from "@fern-ui/fern-docs-search-server";
import { AuthType } from "@prisma/client";
import { mapValues } from "es-toolkit";
import urlJoin from "url-join";
import { v4 as uuidv4 } from "uuid";
import { DocsV2WriteService } from "../../../api";
import { FernRegistry } from "../../../api/generated";
import { DomainBelongsToAnotherOrgError } from "../../../api/generated/api/resources/commons/errors";
import { DocsRegistrationIdNotFound } from "../../../api/generated/api/resources/docs/resources/v1/resources/write/errors";
import { LoadDocsForUrlResponse } from "../../../api/generated/api/resources/docs/resources/v2/resources/read";
import {
DocsNotFoundError,
InvalidDomainError,
ReindexNotAllowedError,
} from "../../../api/generated/api/resources/docs/resources/v2/resources/write/errors";
import { type FdrApplication } from "../../../app";
import { AlgoliaSearchRecord, IndexSegment } from "../../../services/algolia";
import { IndexSegment } from "../../../services/algolia";
import { type S3DocsFileInfo } from "../../../services/s3";
import { WithoutQuestionMarks } from "../../../util";
import { ParsedBaseUrl } from "../../../util/ParsedBaseUrl";
import { getSearchInfoFromDocs } from "../v1/getDocsReadService";

export interface DocsRegistrationInfo {
fernUrl: ParsedBaseUrl;
Expand Down Expand Up @@ -269,8 +255,6 @@ export function getDocsWriteV2Service(app: FdrApplication): DocsV2WriteService {
ParsedBaseUrl.parse(response.domain),
response.docsDefinition,
apiDefinitionsById,
response.algoliaIndex,
response.docsConfigInstanceId,
);

// step 3. store docs + new algolia segments
Expand Down Expand Up @@ -304,7 +288,7 @@ export function getDocsWriteV2Service(app: FdrApplication): DocsV2WriteService {
async function uploadToAlgoliaForRegistration(
app: FdrApplication,
docsRegistrationInfo: DocsRegistrationInfo,
dbDocsDefinition: WithoutQuestionMarks<DocsV1Db.DocsDefinitionDb.V3>,
dbDocsDefinition: WithoutQuestionMarks<DocsV1Db.DocsDefinitionDb>,
apiDefinitionsById: Record<string, APIV1Db.DbApiDefinition>,
): Promise<IndexSegment[]> {
// TODO: make sure to store private docs index into user-restricted algolia index
Expand All @@ -326,8 +310,6 @@ async function uploadToAlgolia(
url: ParsedBaseUrl,
dbDocsDefinition: WithoutQuestionMarks<DocsV1Db.DocsDefinitionDb>,
apiDefinitionsById: Record<string, APIV1Db.DbApiDefinition>,
algoliaIndex?: FernRegistry.AlgoliaSearchIndex,
docsConfigInstanceId?: DocsV1Write.DocsConfigId,
): Promise<IndexSegment[]> {
app.logger.debug(`[${url.getFullUrl()}] Generating new index segments`);
const generateNewIndexSegmentsResult = app.services.algoliaIndexSegmentManager.generateIndexSegmentsForDefinition({
Expand All @@ -341,58 +323,12 @@ async function uploadToAlgolia(
const newIndexSegments = configSegmentTuples.map(([, seg]) => seg);

app.logger.debug(`[${url.getFullUrl()}] Generating search records for all versions`);

let searchRecords: AlgoliaSearchRecord[] = [];
if (dbDocsDefinition.config.root == null) {
searchRecords = await app.services.algolia.generateSearchRecords({
url: url.getFullUrl(),
docsDefinition: dbDocsDefinition,
apiDefinitionsById,
configSegmentTuples,
});
} else {
const loadDocsForUrlResponse: LoadDocsForUrlResponse = {
baseUrl: {
domain: url.hostname,
basePath: url.path?.trim(),
},
definition: convertDocsDefinitionToRead({
docsDbDefinition: dbDocsDefinition,
algoliaSearchIndex: algoliaIndex,
// we don't need to use this for generating algolia records
filesV2: {},
apis: mapValues(apiDefinitionsById, (def) => convertDbAPIDefinitionToRead(def)),
id: docsConfigInstanceId ?? DocsV1Write.DocsConfigId(""),
search: getSearchInfoFromDocs({
algoliaIndex,
indexSegmentIds: newIndexSegments.map((indexSegment) => indexSegment.id),
activeIndexSegments: newIndexSegments.map((indexSegment) => ({
id: indexSegment.id,
createdAt: new Date(),
version: null,
})),
docsDbDefinition: dbDocsDefinition,
app,
}),
}),
lightModeEnabled: dbDocsDefinition.config.colorsV3?.type !== "dark",
};
configSegmentTuples.map(([_, indexSegment]) => {
const v2Records = generateAlgoliaRecords({
indexSegmentId: indexSegment.id,
nodes: FernNavigation.utils.toRootNode(loadDocsForUrlResponse),
pages: FernNavigation.utils.toPages(loadDocsForUrlResponse),
apis: FernNavigation.utils.toApis(loadDocsForUrlResponse),
isFieldRecordsEnabled: false,
});
searchRecords.push(
...v2Records.map((record) => ({
...record,
objectID: uuidv4(),
})),
);
});
}
const searchRecords = await app.services.algolia.generateSearchRecords({
url: url.getFullUrl(),
docsDefinition: dbDocsDefinition,
apiDefinitionsById,
configSegmentTuples,
});

app.logger.debug(`[${url.getFullUrl()}] Uploading search records to Algolia`);
await app.services.algolia.uploadSearchRecords(searchRecords);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import {
convertDbAPIDefinitionToRead,
visitDbNavigationTab,
} from "@fern-api/fdr-sdk";
import { EndpointPathPart } from "@fern-api/fdr-sdk/src/client/APIV1Read";
import { titleCase, visitDiscriminatedUnion } from "@fern-api/ui-core-utils";
import { kebabCase } from "es-toolkit/string";
import { v4 as uuid } from "uuid";
import { EndpointPathPart } from "../../../../../packages/fdr-sdk/src/client/APIV1Read";
import { BreadcrumbsInfo } from "../../api/generated/api";
import { LOGGER } from "../../app/FdrApplication";
import { assertNever, convertMarkdownToText, truncateToBytes } from "../../util";
Expand Down
39 changes: 0 additions & 39 deletions servers/fdr/src/util/getFilesV2.ts

This file was deleted.

3 changes: 1 addition & 2 deletions servers/fdr/tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@
// Set `sourceRoot` to "/" to strip the build path prefix
// from generated source code references.
// This improves issue grouping in Sentry.
"sourceRoot": "/",
"moduleResolution": "bundler"
"sourceRoot": "/"
},
"include": ["./src/**/*"],
"references": [
Expand Down

0 comments on commit 5d10763

Please sign in to comment.