initial release

This commit is contained in:
Justin Visser 2026-03-03 16:16:36 +01:00
parent e156de22c3
commit b3ac11a85e
37 changed files with 3649 additions and 669 deletions

View file

@ -16,6 +16,7 @@ def _row_to_segment(row: sqlite3.Row) -> Segment:
title=row["title"],
content=row["content"],
metadata=json.loads(row["metadata"]),
page_id=dict(row).get("page_id"),
created_at=datetime.fromisoformat(row["created_at"]),
updated_at=datetime.fromisoformat(row["updated_at"]),
)
@ -25,7 +26,9 @@ def create_segment(db_path: Path, request: SegmentCreateRequest) -> Segment:
conn = get_connection(db_path)
try:
row = conn.execute(
"SELECT COALESCE(MAX(sort_order) + 1, 0) AS next_order FROM segments"
"SELECT COALESCE(MAX(sort_order) + 1, 0) AS next_order"
" FROM segments WHERE page_id = ?",
(request.page_id,),
).fetchone()
sort_order: int = row["next_order"] if row else 0
@ -33,9 +36,9 @@ def create_segment(db_path: Path, request: SegmentCreateRequest) -> Segment:
now = datetime.now(UTC).isoformat()
metadata_json = json.dumps(request.metadata)
cols = "id, type, sort_order, title, content, metadata, created_at, updated_at"
cols = "id, type, sort_order, title, content, metadata, page_id, created_at, updated_at"
conn.execute(
f"INSERT INTO segments ({cols}) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
f"INSERT INTO segments ({cols}) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)",
(
str(segment_id),
request.type.value,
@ -43,6 +46,7 @@ def create_segment(db_path: Path, request: SegmentCreateRequest) -> Segment:
request.title,
request.content,
metadata_json,
request.page_id,
now,
now,
),
@ -56,6 +60,7 @@ def create_segment(db_path: Path, request: SegmentCreateRequest) -> Segment:
title=request.title,
content=request.content,
metadata=request.metadata,
page_id=request.page_id,
created_at=datetime.fromisoformat(now),
updated_at=datetime.fromisoformat(now),
)
@ -63,10 +68,16 @@ def create_segment(db_path: Path, request: SegmentCreateRequest) -> Segment:
conn.close()
def list_segments(db_path: Path) -> list[Segment]:
def list_segments(db_path: Path, page_id: str | None = None) -> list[Segment]:
conn = get_connection(db_path)
try:
rows = conn.execute("SELECT * FROM segments ORDER BY sort_order ASC").fetchall()
if page_id is not None:
rows = conn.execute(
"SELECT * FROM segments WHERE page_id = ? ORDER BY sort_order ASC",
(page_id,),
).fetchall()
else:
rows = conn.execute("SELECT * FROM segments ORDER BY sort_order ASC").fetchall()
return [_row_to_segment(row) for row in rows]
finally:
conn.close()
@ -140,6 +151,13 @@ def reorder_segments(db_path: Path, segment_ids: list[UUID]) -> list[Segment]:
)
conn.commit()
return list_segments(db_path)
# Return segments scoped to the same page as the first segment in the list
if segment_ids:
row = conn.execute(
"SELECT page_id FROM segments WHERE id = ?", (str(segment_ids[0]),)
).fetchone()
page_id = row["page_id"] if row else None
return list_segments(db_path, page_id=page_id)
return []
finally:
conn.close()