# -*- coding: utf-8 -*- """ SyncItem — Datenmodell fuer synchronisierbare Elemente. Jedes SyncItem hat eine eindeutige ID, einen Datentyp und Nutzdaten. Last-Write-Wins wird ueber updated_at gesteuert. """ import uuid from dataclasses import dataclass, field from datetime import datetime, timezone from typing import Any def _now_iso() -> str: """Gibt den aktuellen Zeitpunkt als ISO 8601 UTC String zurueck.""" return datetime.now(timezone.utc).isoformat() @dataclass class SyncItem: """Ein synchronisierbares Datenelement.""" item_id: str = field(default_factory=lambda: str(uuid.uuid4())) data_type: str = "" # z.B. "notes.note" data: dict[str, Any] = field(default_factory=dict) created_at: str = field(default_factory=_now_iso) updated_at: str = field(default_factory=_now_iso) deleted: bool = False # Soft-Delete source_id: str = "" # MAC-Adresse oder "server" version: int = 1 # Monoton steigend def to_dict(self) -> dict[str, Any]: """Konvertiert das Item in ein Dictionary.""" return { "item_id": self.item_id, "data_type": self.data_type, "data": self.data, "created_at": self.created_at, "updated_at": self.updated_at, "deleted": self.deleted, "source_id": self.source_id, "version": self.version, } @classmethod def from_dict(cls, data: dict[str, Any]) -> "SyncItem": """Erstellt ein SyncItem aus einem Dictionary.""" return cls( item_id=data.get("item_id", str(uuid.uuid4())), data_type=data.get("data_type", ""), data=data.get("data", {}), created_at=data.get("created_at", _now_iso()), updated_at=data.get("updated_at", _now_iso()), deleted=data.get("deleted", False), source_id=data.get("source_id", ""), version=data.get("version", 1), )