Skip to content

Commit 6eeaa2d

Browse files
committed
feat: enhance Obsidian plugin schema with HeadingRef class
1 parent 1d324f1 commit 6eeaa2d

4 files changed

Lines changed: 38 additions & 3 deletions

File tree

surfsense_backend/app/schemas/obsidian_plugin.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,13 @@ class _PluginBase(BaseModel):
2121
model_config = _PLUGIN_MODEL_CONFIG
2222

2323

24+
class HeadingRef(_PluginBase):
25+
"""One markdown heading extracted from Obsidian metadata cache."""
26+
27+
heading: str
28+
level: int = Field(ge=1, le=6)
29+
30+
2431
class NotePayload(_PluginBase):
2532
"""One Obsidian note as pushed by the plugin (the source of truth)."""
2633

@@ -36,7 +43,7 @@ class NotePayload(_PluginBase):
3643

3744
frontmatter: dict[str, Any] = Field(default_factory=dict)
3845
tags: list[str] = Field(default_factory=list)
39-
headings: list[str] = Field(default_factory=list)
46+
headings: list[HeadingRef] = Field(default_factory=list)
4047
resolved_links: list[str] = Field(default_factory=list)
4148
unresolved_links: list[str] = Field(default_factory=list)
4249
embeds: list[str] = Field(default_factory=list)

surfsense_backend/app/services/obsidian_plugin_indexer.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@
5353
ManifestResponse,
5454
NotePayload,
5555
)
56-
from app.services.llm_service import get_user_long_context_llm
5756
from app.utils.document_converters import generate_unique_identifier_hash
5857
from app.utils.document_versioning import create_version_snapshot
5958

@@ -102,7 +101,7 @@ def _build_metadata(
102101
"extension": payload.extension,
103102
"frontmatter": payload.frontmatter,
104103
"tags": payload.tags,
105-
"headings": payload.headings,
104+
"headings": [h.model_dump() for h in payload.headings],
106105
"outgoing_links": payload.resolved_links,
107106
"unresolved_links": payload.unresolved_links,
108107
"embeds": payload.embeds,
@@ -237,6 +236,8 @@ async def upsert_note(
237236

238237
document = prepared[0]
239238

239+
from app.services.llm_service import get_user_long_context_llm
240+
240241
llm = await get_user_long_context_llm(session, str(user_id), search_space_id)
241242
return await pipeline.index(document, connector_doc, llm)
242243

surfsense_backend/tests/integration/test_obsidian_plugin_routes.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
ConnectRequest,
4747
DeleteAck,
4848
DeleteBatchRequest,
49+
HeadingRef,
4950
ManifestResponse,
5051
NotePayload,
5152
RenameAck,
@@ -74,6 +75,7 @@ def _make_note_payload(vault_id: str, path: str, content_hash: str) -> NotePaylo
7475
name=path.rsplit("/", 1)[-1].rsplit(".", 1)[0],
7576
extension="md",
7677
content="# Test\n\nbody",
78+
headings=[HeadingRef(heading="Test", level=1)],
7779
content_hash=content_hash,
7880
mtime=now,
7981
ctime=now,
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
from __future__ import annotations
2+
3+
from datetime import UTC, datetime
4+
5+
from app.schemas.obsidian_plugin import HeadingRef, NotePayload
6+
from app.services.obsidian_plugin_indexer import _build_metadata
7+
8+
9+
def test_build_metadata_serializes_headings_to_plain_json() -> None:
10+
now = datetime.now(UTC)
11+
payload = NotePayload(
12+
vault_id="vault-1",
13+
path="notes.md",
14+
name="notes",
15+
extension="md",
16+
content="# Notes",
17+
headings=[HeadingRef(heading="Notes", level=1)],
18+
content_hash="abc123",
19+
mtime=now,
20+
ctime=now,
21+
)
22+
23+
metadata = _build_metadata(payload, vault_name="My Vault", connector_id=42)
24+
25+
assert metadata["headings"] == [{"heading": "Notes", "level": 1}]

0 commit comments

Comments
 (0)