- 收口 page aggregate 读取、本地状态与命令客户端\n- 接入 phase7 document ai sidecar 与前端编排入口\n- 更新 architecture 与 design 状态迁移
101 lines
3.6 KiB
TypeScript
101 lines
3.6 KiB
TypeScript
import { buildPageAggregate, type PageAggregateProjection } from "@/lib/documents/page-aggregate";
|
|
import { normalizeDocumentContentResponse } from "@/lib/documents/page-subtree-response";
|
|
import type { PageSubtreeProjection } from "@/lib/documents/page-subtree";
|
|
import type {
|
|
DocumentStats,
|
|
PageFont,
|
|
PageLayoutDensity,
|
|
PageOptionsState,
|
|
} from "@/types/page-options";
|
|
|
|
export type DocumentMetaPayload = {
|
|
id: string;
|
|
workspace_id: string;
|
|
title: string | null;
|
|
updated_at: string | null;
|
|
can_edit?: boolean | null;
|
|
disable_download?: boolean | null;
|
|
disable_copy?: boolean | null;
|
|
wide_layout?: boolean | null;
|
|
use_small_text?: boolean | null;
|
|
show_heading_numbers?: boolean | null;
|
|
show_toc?: boolean | null;
|
|
show_structure?: boolean | null;
|
|
protect_editing?: boolean | null;
|
|
show_word_count?: boolean | null;
|
|
collapse_backlinks?: boolean | null;
|
|
page_font?: PageFont | null;
|
|
layout_density?: PageLayoutDensity | null;
|
|
hide_child_pages?: boolean | null;
|
|
show_block_ref_count?: boolean | null;
|
|
embed_default_block_id?: string | null;
|
|
word_count?: number | null;
|
|
character_count?: number | null;
|
|
block_count?: number | null;
|
|
todo_total?: number | null;
|
|
todo_total_count?: number | null;
|
|
todo_done?: number | null;
|
|
todo_done_count?: number | null;
|
|
};
|
|
|
|
export type DocumentContentPayload = {
|
|
content?: unknown;
|
|
revision?: number | null;
|
|
conflict_detection_key?: string | null;
|
|
conflictDetectionKey?: string | null;
|
|
page_subtree?: PageSubtreeProjection | null;
|
|
pageSubtree?: PageSubtreeProjection | null;
|
|
title?: string | null;
|
|
};
|
|
|
|
export function buildPageAggregateFromDocumentPayloads(input: {
|
|
meta: DocumentMetaPayload;
|
|
contentPayload?: DocumentContentPayload | null;
|
|
}): PageAggregateProjection {
|
|
const normalizedContent = normalizeDocumentContentResponse({
|
|
documentId: input.meta.id,
|
|
title: input.meta.title ?? "无标题",
|
|
payload: input.contentPayload,
|
|
});
|
|
|
|
const pageOptions: PageOptionsState = {
|
|
wideLayout: input.meta.wide_layout ?? false,
|
|
smallText: input.meta.use_small_text ?? false,
|
|
showHeadingNumbers: input.meta.show_heading_numbers ?? true,
|
|
showToc: input.meta.show_toc ?? false,
|
|
showStructure: input.meta.show_structure ?? false,
|
|
protectEditing: input.meta.protect_editing ?? false,
|
|
showWordCount: input.meta.show_word_count ?? true,
|
|
collapseBacklinks: input.meta.collapse_backlinks ?? false,
|
|
pageFont: input.meta.page_font ?? "default",
|
|
layoutDensity: input.meta.layout_density ?? "normal",
|
|
hideChildPages: input.meta.hide_child_pages ?? false,
|
|
showBlockRefCount: input.meta.show_block_ref_count ?? false,
|
|
embedDefaultBlockId: input.meta.embed_default_block_id ?? null,
|
|
};
|
|
|
|
const stats: DocumentStats = {
|
|
wordCount: input.meta.word_count ?? 0,
|
|
characterCount: input.meta.character_count ?? 0,
|
|
blockCount: input.meta.block_count ?? 0,
|
|
todoTotal: input.meta.todo_total ?? input.meta.todo_total_count ?? 0,
|
|
todoDone: input.meta.todo_done ?? input.meta.todo_done_count ?? 0,
|
|
};
|
|
|
|
return buildPageAggregate({
|
|
documentId: input.meta.id,
|
|
workspaceId: input.meta.workspace_id,
|
|
title: input.meta.title ?? "无标题",
|
|
updatedAt: input.meta.updated_at,
|
|
readOnly: input.meta.can_edit === false,
|
|
disableDownload: Boolean(input.meta.disable_download),
|
|
disableCopy: Boolean(input.meta.disable_copy),
|
|
pageOptions,
|
|
content: normalizedContent.content,
|
|
revision: normalizedContent.revision,
|
|
conflictDetectionKey: normalizedContent.conflictDetectionKey,
|
|
pageSubtree: normalizedContent.pageSubtree,
|
|
stats,
|
|
});
|
|
}
|