"""Entscheidet je Notiz, ob sie angelegt, aktualisiert oder übersprungen wird.""" from __future__ import annotations import hashlib from dataclasses import dataclass from enum import Enum from bookstack.notiz import Notiz class Aktion(Enum): ANLEGEN = "anlegen" AKTUALISIEREN = "aktualisieren" UEBERSPRINGEN = "überspringen" @dataclass(frozen=True) class Entscheidung: aktion: Aktion seiten_id: int | None pruefsumme: str begruendung: str def berechne_pruefsumme( titel: str, markdown: str, buch_id: int, kapitel_id: int | None ) -> str: """Deckt Inhalt *und* Ablageort ab — ein verschobenes Ziel gilt als Änderung.""" roh = "\x00".join([titel, str(buch_id), str(kapitel_id or 0), markdown]) return "sha256:" + hashlib.sha256(roh.encode("utf-8")).hexdigest() def entscheide(notiz: Notiz, pruefsumme: str) -> Entscheidung: roh_id = notiz.frontmatter.get("bookstack_page_id", "").strip() if not roh_id: return Entscheidung(Aktion.ANLEGEN, None, pruefsumme, "noch nie hochgeladen") try: seiten_id = int(roh_id) except ValueError: return Entscheidung( Aktion.ANLEGEN, None, pruefsumme, f"bookstack_page_id unlesbar: {roh_id!r}" ) if notiz.frontmatter.get("bookstack_hash", "").strip() == pruefsumme: return Entscheidung( Aktion.UEBERSPRINGEN, seiten_id, pruefsumme, "unverändert seit letztem Upload" ) return Entscheidung(Aktion.AKTUALISIEREN, seiten_id, pruefsumme, "Inhalt hat sich geändert")